ukui-media/0000775000175000017500000000000015170054730011534 5ustar fengfengukui-media/Makefile.am0000664000175000017500000000155215170052044013567 0ustar fengfengNULL = SUBDIRS = data po man DISTCHECK_CONFIGURE_FLAGS = \ --enable-more-warnings \ --enable-compile-warnings=maximum \ --enable-deprecated DIST_SUBDIRS = \ data \ po \ man \ $(NULL) EXTRA_DIST = \ .version \ autogen.sh \ configure \ ChangeLog \ COPYING \ COPYING-DOCS \ build-aux/git-version-gen \ $(INTLTOOL_BUILT:=.in) \ $(NULL) DISTCLEANFILES = \ po/.intltool-merge-cache \ $(NULL) ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} # see build-aux/git-version-get for details BUILT_SOURCES = $(top_srcdir)/.version $(top_srcdir)/.version: echo $(VERSION) > $@-t && mv $@-t $@ # Build ChangeLog from GIT history ChangeLog: $(AM_V_GEN) if test -d $(top_srcdir)/.git; then \ GIT_DIR="$(top_srcdir)/.git" git log --stat > $@; \ fi dist: ChangeLog .PHONY: ChangeLog -include $(top_srcdir)/git.mk ukui-media/sound-theme-player/0000775000175000017500000000000015170054730015256 5ustar fengfengukui-media/sound-theme-player/sound-theme-player.pro0000664000175000017500000000244715170054730021531 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2021-01-03T20:04:12 # #------------------------------------------------- QT += core gui dbus xml #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = sound-theme-player TEMPLATE = app include(dbus-adaptor/dbus-adaptor.pri) # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS LIBS += -lukui-log4qt # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 target.path = /usr/bin CONFIG += \ c++11 \ no_keywords link_pkgconfig debug\ PKGCONFIG += \ glib-2.0 \ gio-2.0 \ dconf \ gsettings-qt6 \ libxml-2.0 \ libcanberra \ libpulse SOURCES += \ main.cpp \ sound_theme_player.cpp HEADERS += \ sound_theme_player.h INSTALLS += \ target ukui-media/sound-theme-player/dbus-adaptor/0000775000175000017500000000000015170054730017643 5ustar fengfengukui-media/sound-theme-player/dbus-adaptor/org.ukui.soundthemeplayer.xml0000664000175000017500000000055415170054730025523 0ustar fengfeng ukui-media/sound-theme-player/dbus-adaptor/dbus-adaptor.pri0000664000175000017500000000015115170054730022741 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/dbus-adaptor.h \ SOURCES += \ $$PWD/dbus-adaptor.cpp \ ukui-media/sound-theme-player/dbus-adaptor/dbus-adaptor.h0000664000175000017500000000251515170054730022404 0ustar fengfeng/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.ukui.soundthemeplayer.xml -i sound_theme_player.h -a dbus-adaptor * * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ #ifndef DBUS_ADAPTOR_H #define DBUS_ADAPTOR_H #include #include #include "sound_theme_player.h" QT_BEGIN_NAMESPACE class QByteArray; template class QList; template class QMap; class QString; class QVariant; QT_END_NAMESPACE /* * Adaptor class for interface org.ukui.sound.theme.player */ class PlayerAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.sound.theme.player") Q_CLASSINFO("D-Bus Introspection", "" " \n" " \n" " \n" " \n" " \n" " \n" "") public: PlayerAdaptor(QObject *parent); virtual ~PlayerAdaptor(); public: // PROPERTIES public Q_SLOTS: // METHODS bool playAlertSound(const QString &soundEvent); Q_SIGNALS: // SIGNALS }; #endif ukui-media/sound-theme-player/dbus-adaptor/dbus-adaptor.cpp0000664000175000017500000000204715170054730022737 0ustar fengfeng/* * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp org.ukui.soundthemeplayer.xml -i sound_theme_player.h -a dbus-adaptor * * qdbusxml2cpp is Copyright (C) 2020 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ #include "dbus-adaptor.h" #include #include #include #include #include #include #include /* * Implementation of adaptor class PlayerAdaptor */ PlayerAdaptor::PlayerAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { // constructor setAutoRelaySignals(true); } PlayerAdaptor::~PlayerAdaptor() { // destructor } bool PlayerAdaptor::playAlertSound(const QString &soundEvent) { // handle method call org.ukui.sound.theme.player.playAlertSound bool out0; QMetaObject::invokeMethod(parent(), "playAlertSound", Q_RETURN_ARG(bool, out0), Q_ARG(QString, soundEvent)); return out0; } ukui-media/sound-theme-player/main.cpp0000664000175000017500000000224515170054730016711 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "sound_theme_player.h" #include #include #include #include "dbus-adaptor.h" #include int main(int argc, char *argv[]) { initUkuiLog4qt("ukui-media"); QCoreApplication a(argc, argv); SoundThemePlayer player; return a.exec(); } ukui-media/sound-theme-player/sound_theme_player.cpp0000664000175000017500000002066415170054730021660 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "sound_theme_player.h" #include #include SoundThemePlayer::SoundThemePlayer() { createCaContext();//注册 UkmediaPlayerDbusRegister(); initGSettings(); addSoundFileList(); } /** * @brief create for the libcanberra context * @return create successfully or not */ bool SoundThemePlayer::createCaContext() { if (nullptr != m_caContext) { ca_context_cancel(m_caContext, 0); ca_context_destroy(m_caContext); } return (ca_context_create(&m_caContext) == 0) ? true : false; } /** * @brief Register for the dbus service */ void SoundThemePlayer::UkmediaPlayerDbusRegister() { QDBusConnection con = QDBusConnection::sessionBus(); if (!con.registerService("org.ukui.sound.theme.player")) qDebug() << "registerService failed" << con.lastError().message(); if (!con.registerObject("/org/ukui/sound/theme/player", this, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)) qDebug() << "registerObject failed" << con.lastError().message(); } /** * @brief Play the corresponding sound effects * * @param soundEvent Application sound type * @return Play successfully or not */ bool SoundThemePlayer::playAlertSound(QString soundEvent) { bool soundSwitch; if (m_pSoundSettings->keys().contains("eventSounds")) soundSwitch = m_pSoundSettings->get(EVENT_SOUNDS_KEY).toBool(); if (!soundSwitch) return false; gint retval; QByteArray ba; const gchar *eventId; const gchar *desc = "Sound Theme Player"; if (m_pSoundFileList.contains(soundEvent)) ba = soundEvent.toLatin1(); else { QString theme = m_pSoundSettings->get(SOUND_THEME_KEY).toString(); if (isFileExist(theme, soundEvent)) ba = soundEvent.toLatin1(); else ba = NOTIFICATION_GENERAL; } eventId = ba.data(); if (ba == AUDIO_VOLUME_CHANGE && m_pSoundSettings->get(SOUND_CUSTOM_THEME_KEY).toBool()) { QString soundPath = m_pSoundSettings->get(AUDIO_VOLUME_CHANGE).toString(); retval = playCustomAlertSound(soundPath); return retval; } else if (ba == NOTIFICATION_GENERAL && m_pSoundSettings->get(SOUND_CUSTOM_THEME_KEY).toBool()) { QString soundPath = m_pSoundSettings->get(NOTIFICATION_GENERAL).toString(); retval = playCustomAlertSound(soundPath); return retval; } if (createCaContext()) { retval = ca_context_play(m_caContext, 0, CA_PROP_EVENT_ID, eventId, CA_PROP_EVENT_DESCRIPTION, desc, CA_PROP_CANBERRA_VOLUME, m_dBValue, NULL); } qDebug() << __func__ << soundEvent << eventId << retval; return (retval == 0 ? 1 : 0); } /** * @brief Find the sound file according to the sound type * * @param action Application sound type * @return Sound file */ QString SoundThemePlayer::readJson(QString action) { QFile file("/usr/share/ukui-media/sounds/audio.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "can't open error!"; return ""; } // 读å�–文件的全部内容 QTextStream stream(&file); stream.setEncoding(QStringConverter::Utf8); // 设置读å�–ç¼–ç �是UTF8 QString str = stream.readAll(); file.close(); // QJsonParseError类用于在JSONè§£æž�期间报告错误。 QJsonParseError jsonError; // å°†jsonè§£æž�为UTF-8ç¼–ç �çš„json文档,并从中创建一个QJsonDocument。 // 如果解æž�æˆ�功,返回QJsonDocument对象,å�¦åˆ™è¿”回null QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError); // 判断是å�¦è§£æž�失败 if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) { qDebug() << "Jsonæ ¼å¼�错误ï¼�" << jsonError.error; return ""; } QJsonObject rootObj = doc.object(); //获å�–键值对 QJsonValue card = rootObj.value(action); if (card.toString().isEmpty()) return NOTIFICATION_GENERAL; return card.toString(); } bool SoundThemePlayer::playCustomAlertSound(QString soundPath) { int retval = 1; if (createCaContext()) { retval = ca_context_play(m_caContext, 0, CA_PROP_APPLICATION_NAME, "Sound Theme Player", CA_PROP_MEDIA_FILENAME, soundPath.toLatin1().data(), CA_PROP_EVENT_DESCRIPTION, "Testing event sound", CA_PROP_CANBERRA_CACHE_CONTROL, "never", CA_PROP_APPLICATION_ID, "org.ukui.VolumeControl", CA_PROP_CANBERRA_VOLUME, m_dBValue, #ifdef CA_PROP_CANBERRA_ENABLE CA_PROP_CANBERRA_ENABLE, "1", #endif NULL); qDebug() << __func__ << soundPath << retval; } return (retval == 0 ? 1 : 0); } bool SoundThemePlayer::isFileExist(QString theme, QString soundTye) { QString path = SOUND_FILE_PATH; path.replace("xxxTheme", theme); path.replace("xxxFile", soundTye); QFileInfo fileInfo(path); path.replace("ogg", "oga"); QFileInfo fileInfoOga(path); if (fileInfo.isFile()) return true; else if (fileInfoOga.isFile()) return true; else return false; } void SoundThemePlayer::addSoundFileList() { m_pSoundFileList << "audio-volume-change" << "battery-low" << "complete" << "device-added-failed" << "device-added" << "device-removed" << "dialog-error" << "dialog-warning" << "notification-general" << "notification-special" << "operation-file" << "operation-unsupported" << "power-plug" << "screen-capture" << "screen-record" << "start-up" << "trash-empty" ; } void SoundThemePlayer::initGSettings() { if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)) { m_pSoundSettings = new QGSettings(KEY_SOUNDS_SCHEMA); } if (nullptr == m_pSoundSettings) { qDebug() << "m_pSoundSettings create fail"; return; } if (m_pSoundSettings->keys().contains("alertVolume")) { int n_AlertVolume = m_pSoundSettings->get(ALERT_VOLUME).toInt(); m_dBValue = alertVolumeTodB(n_AlertVolume); } connect(m_pSoundSettings, &QGSettings::changed, this, &SoundThemePlayer::onSettingChanged); } void SoundThemePlayer::onSettingChanged(const QString &key) { if (key == "alertVolume") { int n_AlertVolume = m_pSoundSettings->get(ALERT_VOLUME).toInt(); m_dBValue = alertVolumeTodB(n_AlertVolume); qDebug() << "The alert volume is changed, now is" << n_AlertVolume << m_dBValue; } } char *SoundThemePlayer::alertVolumeTodB(int value) { if (value < 0 || value > 100) value = 100; pa_volume_t volume = value / 100.0 * 65536.0; double dBValue = pa_sw_volume_to_dB(volume); QByteArray byteArray = QByteArray::number(dBValue, 'f', 2); if (m_dBValue) { delete[] m_dBValue; m_dBValue = nullptr; } m_dBValue = new char[byteArray.size() + 1]; snprintf(m_dBValue, byteArray.size() + 1, "%s", byteArray.constData()); return m_dBValue; } SoundThemePlayer::~SoundThemePlayer() { } ukui-media/sound-theme-player/sound_theme_player.h0000664000175000017500000000472615170054730021326 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOUND_THEME_PLAYER_H #define SOUND_THEME_PLAYER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include #include } #define KEY_SOUNDS_SCHEMA "org.ukui.sound" #define EVENT_SOUNDS_KEY "event-sounds" #define SOUND_THEME_KEY "theme-name" #define SOUND_CUSTOM_THEME_KEY "custom-theme" #define AUDIO_VOLUME_CHANGE "audio-volume-change" #define NOTIFICATION_GENERAL "notification-general" #define ALERT_VOLUME "alert-volume" #define SOUND_FILE_PATH "/usr/share/sounds/xxxTheme/stereo/xxxFile.ogg" class SoundThemePlayer : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface","org.ukui.sound.theme.player") public: SoundThemePlayer(); ~SoundThemePlayer(); bool createCaContext(); void UkmediaPlayerDbusRegister(); QString readJson(QString action); void addSoundFileList(); bool playCustomAlertSound(QString soundPath); bool isFileExist(QString theme, QString soundTye); void initGSettings(); void onSettingChanged(const QString &key); char *alertVolumeTodB(int value); public Q_SLOTS: //METHODS bool playAlertSound(QString soundEvent); private: ca_context *m_caContext = nullptr; QGSettings *m_pSoundSettings = nullptr; QStringList m_pSoundFileList; char *m_dBValue = nullptr; }; #endif // SOUND_THEME_PLAYER_H ukui-media/ukui-login-sound/0000775000175000017500000000000015170054730014745 5ustar fengfengukui-media/ukui-login-sound/main.cpp0000664000175000017500000001305315170054730016377 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include "ukui_login_sound_user_config.h" #include "ukui_login_sound.h" /* define hw sound card dirvers */ #define HI3XXX_HI6405 "hi3xxx_hi6405" #define HI3XXX_DA_COMBINE_V5 "hi3xxx_DA_combine_v5" #define DA_COMBINE_V5_MACHINE "da_combine_v5_machine" #define HW_AUDIO_SERVICE "/usr/share/hw-audio/hwaudioservice" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); if (QFile(SOUND_EFFECT_JSON).exists()) { syslog(LOG_INFO, "this is not first time longin to the system, so the stratup sound effect will not play."); return 0; } std::shared_ptr info = std::make_shared(); QString autoLoginUser = std::dynamic_pointer_cast(info)->getAutoLoginUser(); QString lastLoginUser = std::dynamic_pointer_cast(info)->getLastLoginUser(); syslog(LOG_DEBUG, "autoLoginUser:%s, lastLoginUser:%s", autoLoginUser.toLatin1().data(), lastLoginUser.toLatin1().data()); // 1. 正常装机或者OEM装机时第一次登录,使用默认设备播放开机音效 if ("oem" == autoLoginUser || ("" == autoLoginUser && "" == lastLoginUser)) { if (QFile::exists(HW_AUDIO_SERVICE)) { system("/usr/share/hw-audio/hwaudioservice -o"); } syslog(LOG_INFO, "when you first enter the system, use the default output device to play startup sound effect."); QString defaultOutputDev = DEFAULT_AUDIO_CARD_VALUE; defaultOutputDev = UkuiLoginSound::getInstance().checkPcm(defaultOutputDev.toLatin1().data()); UkuiLoginSound::getInstance().aplayMain(PLAY_STARTUP_WAV, defaultOutputDev.toLatin1().data()); } else { // 2.当系统设置自动登录时,使用自动登录用户记录的设备信æ�¯è¿›è¡Œæ’­æ”¾ï¼Œæ²¡æœ‰è®¾ç½®è‡ªåŠ¨ç™»å½•ç”¨æˆ·æ—¶ï¼Œä½¿ç”¨ä¸Šä¸€æ¬¡ç™»å½•ç”¨æˆ·è®°å½•çš„è®¾å¤‡ä¿¡æ�¯è¿›è¡Œæ’­æ”¾ bool status = info->getValueFromJson(info->getJsonByType(std::dynamic_pointer_cast(info)->getJsonMap(), JsonType::JSON_TYPE_USERINFO), AUDIO_STRATUP_SOUNDEFFECT_KEY).toBool(); bool mute = info->getValueFromJson(info->getJsonByType(std::dynamic_pointer_cast(info)->getJsonMap(), JsonType::JSON_TYPE_USERINFO), AUDIO_MUTE_KEY).toBool(); int volume = info->getValueFromJson(info->getJsonByType(std::dynamic_pointer_cast(info)->getJsonMap(), JsonType::JSON_TYPE_USERINFO), AUDIO_VOLUME_KEY).toInt(); /* Do not play the boot sound effect when the user is closed when the boot sound effect, * the mute state, and the volume value are 0 */ if (!status || mute || !volume) { syslog(LOG_DEBUG, "%s user has turned off the system boot sound or it is in mute mode, status: %d, muted: %d, volume: %d.", autoLoginUser == "" ? lastLoginUser.toLatin1().data() : autoLoginUser.toLatin1().data(), status, mute, volume); return 0; } int cardId = info->getValueFromJson(info->getJsonByType(std::dynamic_pointer_cast(info)->getJsonMap(), JsonType::JSON_TYPE_USERINFO), AUDIO_CARDID_KEY).toInt(); QString audioDEV = info->getValueFromJson(info->getJsonByType(std::dynamic_pointer_cast(info)->getJsonMap(), JsonType::JSON_TYPE_USERINFO), AUDIO_CARD_KEY).toString(); /* Check whether the PCM device is valid before playing the boot sound */ audioDEV = UkuiLoginSound::getInstance().checkPcm(audioDEV.toLatin1().data()); bool support = UkuiLoginSound::getInstance().isSupportHardwareVolumeControl(QString("hw:%1").arg(cardId).toLatin1().data()); syslog(LOG_INFO, "play system sound effects on the device:%s at volume:%d.", audioDEV.toLatin1().data(), volume); if (!mute && QFile::exists(HW_AUDIO_SERVICE)) { system("/usr/share/hw-audio/hwaudioservice -o"); } /* When the driver does not support hardware volume control, modify the volume of * the audio file of the boot sound effect through FFMPEG */ if (!support && !UkuiLoginSound::getInstance().wav_convert(volume)) { UkuiLoginSound::getInstance().aplayMain(TMP_STARTUP_WAV_PATH, audioDEV.toLatin1().data()); } else { UkuiLoginSound::getInstance().aplayMain(PLAY_STARTUP_WAV, audioDEV.toLatin1().data()); } } return 0; } ukui-media/ukui-login-sound/ukui-login-sound.pro0000664000175000017500000000264615170054730020710 0ustar fengfengQT += core gui #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = app TARGET = ukui-login-sound target.path = /usr/bin CONFIG += \ c++17 \ no_keywords link_pkgconfig debug\ # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ ../common/user_config.cpp \ main.cpp \ ukui_login_sound.cpp \ ../common/sound_effect_json.cpp \ ../common/user_info_json.cpp \ ukui_login_sound_user_config.cpp HEADERS += \ formats.h \ ukui_login_sound.h \ ../common/json.h \ ../common/sound_effect_json.h \ ../common/user_info_json.h \ ../common/user_config.h \ ukui_login_sound_user_config.h PKGCONFIG += alsa # Default rules for deployment. #qnx: target.path = /tmp/$${TARGET}/bin #else: unix:!android: target.path = /opt/$${TARGET}/bin #!isEmpty(target.path): INSTALLS += target INSTALLS += target \ ukui-media/ukui-login-sound/ukui_login_sound.h0000664000175000017500000001571515170054730020504 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef APLAYPLAY_H #define APLAYPLAY_H //#include "aconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "formats.h" #include #include #include #include #define BUFFER_LEN 1024 //开机音ä¹�播放路径 #define PLAY_STARTUP_WAV "/usr/share/ukui/ukui-session-manager/startup.wav" #define TMP_STARTUP_WAV_PATH "/tmp/startup.wav" #define NORMAL_VOLUME 100.0 #define MIN_VOLUME 0.0 #define ABS(a) (a) < 0 ? -(a) : (a) #ifdef SND_CHMAP_API_VERSION #define CONFIG_SUPPORT_CHMAP 1 #endif #ifndef LLONG_MAX #define LLONG_MAX 9223372036854775807LL #endif #ifndef le16toh #include #define le16toh(x) __le16_to_cpu(x) #define be16toh(x) __be16_to_cpu(x) #define le32toh(x) __le32_to_cpu(x) #define be32toh(x) __be32_to_cpu(x) #endif #define DEFAULT_FORMAT SND_PCM_FORMAT_U8 #define DEFAULT_SPEED 8000 #define FORMAT_DEFAULT -1 #define FORMAT_RAW 0 #define FORMAT_VOC 1 #define FORMAT_WAVE 2 #define FORMAT_AU 3 /* global data */ static snd_pcm_sframes_t (*readi_func)(snd_pcm_t *handle, void *buffer, snd_pcm_uframes_t size); static snd_pcm_sframes_t (*writei_func)(snd_pcm_t *handle, const void *buffer, snd_pcm_uframes_t size); static snd_pcm_sframes_t (*readn_func)(snd_pcm_t *handle, void **bufs, snd_pcm_uframes_t size); static snd_pcm_sframes_t (*writen_func)(snd_pcm_t *handle, void **bufs, snd_pcm_uframes_t size); enum { VUMETER_NONE, VUMETER_MONO, VUMETER_STEREO }; static snd_pcm_t *handle; static struct { snd_pcm_format_t format; unsigned int channels; unsigned int rate; } hwparams, rhwparams; static int timelimit = 0; static int sampleslimit = 0; static int quiet_mode = 0; static int file_type = FORMAT_DEFAULT; static int open_mode = 0; static snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; static int mmap_flag = 0; static int interleaved = 1; static int nonblock = 0; static volatile sig_atomic_t in_aborting = 0; static u_char *audiobuf = NULL; static snd_pcm_uframes_t chunk_size = 0; static unsigned period_time = 0; static unsigned buffer_time = 0; static snd_pcm_uframes_t period_frames = 0; static snd_pcm_uframes_t buffer_frames = 0; static int avail_min = -1; static int start_delay = 0; static int stop_delay = 0; static int monotonic = 0; static int interactive = 0; static int can_pause = 0; static int fatal_errors = 0; static int verbose = 0; static int vumeter = VUMETER_NONE; static int buffer_pos = 0; static size_t significant_bits_per_sample, bits_per_sample, bits_per_frame; static size_t chunk_bytes; static int test_position = 0; static int test_coef = 8; static int test_nowait = 0; static snd_output_t *snd_log; static long long max_file_size = 0; static int max_file_time = 0; static int use_strftime = 0; volatile static int recycle_capture_file = 0; static long term_c_lflag = -1; static int dump_hw_params = 0; static int fd = -1; static off64_t pbrec_count = LLONG_MAX, fdcount; static int vocmajor, vocminor; static char *pidfile_name = NULL; //FILE *pidf = NULL; static int pidfile_written = 0; #ifdef CONFIG_SUPPORT_CHMAP static snd_pcm_chmap_t *channel_map = NULL; /* chmap to override */ static unsigned int *hw_map = NULL; /* chmap to follow */ #endif //extern "C"{ /* needed prototypes */ class UkuiLoginSound { public: static UkuiLoginSound& getInstance(); int aplayMain(char *filename,char *playdev); char* checkPcm(char *name); bool isSupportHardwareVolumeControl(char *name); int wav_convert(int volume); private: UkuiLoginSound(); UkuiLoginSound(const UkuiLoginSound&) = delete; UkuiLoginSound(UkuiLoginSound&&) = delete; UkuiLoginSound operator=(const UkuiLoginSound&) = delete; UkuiLoginSound operator=(UkuiLoginSound&&) = delete; ~UkuiLoginSound() = default; static void check_wavefile_space(u_char *buffer,u_int len, size_t blimit); static void device_list(); static void pcm_list(void); static void prg_exit(int code); static void signal_handler(int sig); static void signal_handler_recycle (int sig); static ssize_t safe_read(int fd, void *buf, size_t count); static size_t test_wavefile_read(int fd, u_char *buffer, size_t *size, size_t reqsize, int line); static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size); static void show_available_sample_formats(snd_pcm_hw_params_t* params); static int setup_chmap(void); static void set_params(void); static void init_stdin(void); static void done_stdin(void); static void do_pause(void); static void check_stdin(void); static void xrun(void); static void suspend(void); static void print_vu_meter_mono(int perc, int maxperc); static void print_vu_meter_stereo(int *perc, int *maxperc); static void print_vu_meter(signed int *perc, signed int *maxperc); static void compute_max_peak(u_char *data, size_t count); static void do_test_position(void); static u_char *remap_data(u_char *data, size_t count); static u_char **remap_datav(u_char **data, size_t count); static ssize_t pcm_write(u_char *data, size_t count); static ssize_t pcm_writev(u_char **data, unsigned int channels, size_t count); static ssize_t pcm_read(u_char *data, size_t rcount); static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount); static ssize_t voc_pcm_write(u_char *data, size_t count); static void init_raw_data(void); static off64_t calc_count(void); static void header(int rtype, char *name); static void playback_go(int fd, size_t loaded, off64_t count, int rtype, char *name); static int read_header(int *loaded, int header_size); static int playback_wave(char *name, int *loaded); static int playback_raw(char *name, int *loaded); static void playback(char *name); }; #endif // APLAYPLAY_H ukui-media/ukui-login-sound/ukui_login_sound_user_config.cpp0000664000175000017500000000556015170054730023417 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukui_login_sound_user_config.h" UkuiLoginSoundUserConfig::UkuiLoginSoundUserConfig() { initSettings(); initJsonMap(); } void UkuiLoginSoundUserConfig::initSettings() { m_pAutoLoginSetting = std::make_unique(LIGHTDM_CONF_FILE, QSettings::IniFormat); m_pLastLoginSetting = std::make_unique(UKUI_GREETER_CONF_FILE, QSettings::IniFormat); } void UkuiLoginSoundUserConfig::initJsonMap() { for (const auto& [k, v] : m_keys) { std::shared_ptr json = nullptr; switch (k) { case JsonType::JSON_TYPE_SOUNDEFFECT: { json = std::make_shared(v()); json->init(); break; } case JsonType::JSON_TYPE_USERINFO: { json = std::make_shared(v()); break; } default: break; } if (json) { m_jsonMap.emplace(k, json); } } } const QString UkuiLoginSoundUserConfig::getAutoLoginUser() const { return m_pAutoLoginSetting->value(LIGHTDM_CONF_KEY).toString(); } const QString UkuiLoginSoundUserConfig::getLastLoginUser() const { return m_pLastLoginSetting->value(UKUI_GREETER_CONF_KEY).toString(); } std::unordered_map> UkuiLoginSoundUserConfig::getJsonMap() const { return m_jsonMap; } QString UkuiLoginSoundUserConfig::getSoundEffectFullPath() { return SOUND_EFFECT_JSON; } QString UkuiLoginSoundUserConfig::getUserInfoFullPath() { QString path = DEFAULT_PATH; QString autoLoginUser = getAutoLoginUser(); QString lastLoginUser = getLastLoginUser(); if ("" == autoLoginUser && "" == lastLoginUser) { path = INVAILD_PATH; } else { autoLoginUser == "" ? path.append(lastLoginUser) : path.append(autoLoginUser); } path == INVAILD_PATH ? path : path.append(AUDIO_JSON); syslog(LOG_DEBUG, "usr info file path: %s.", path.toLatin1().data()); return path; } UkuiLoginSoundUserConfig::~UkuiLoginSoundUserConfig() { } ukui-media/ukui-login-sound/formats.h0000664000175000017500000001076115170054730016576 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef FORMATS_H #define FORMATS_H 1 #include #include /* Definitions for .VOC files */ #define VOC_MAGIC_STRING "Creative Voice File\x1A" #define VOC_ACTUAL_VERSION 0x010A #define VOC_SAMPLESIZE 8 #define VOC_MODE_MONO 0 #define VOC_MODE_STEREO 1 #define VOC_DATALEN(bp) ((u_long)(bp->datalen) | \ ((u_long)(bp->datalen_m) << 8) | \ ((u_long)(bp->datalen_h) << 16) ) typedef struct voc_header { u_char magic[20]; /* must be MAGIC_STRING */ u_short headerlen; /* Headerlength, should be 0x1A */ u_short version; /* VOC-file version */ u_short coded_ver; /* 0x1233-version */ } VocHeader; typedef struct voc_blocktype { u_char type; u_char datalen; /* low-byte */ u_char datalen_m; /* medium-byte */ u_char datalen_h; /* high-byte */ } VocBlockType; typedef struct voc_voice_data { u_char tc; u_char pack; } VocVoiceData; typedef struct voc_ext_block { u_short tc; u_char pack; u_char mode; } VocExtBlock; /* Definitions for Microsoft WAVE format */ #if __BYTE_ORDER == __LITTLE_ENDIAN #define COMPOSE_ID(a,b,c,d) ((a) | ((b)<<8) | ((c)<<16) | ((d)<<24)) #define LE_SHORT(v) (v) #define LE_INT(v) (v) #define BE_SHORT(v) bswap_16(v) #define BE_INT(v) bswap_32(v) #elif __BYTE_ORDER == __BIG_ENDIAN #define COMPOSE_ID(a,b,c,d) ((d) | ((c)<<8) | ((b)<<16) | ((a)<<24)) #define LE_SHORT(v) bswap_16(v) #define LE_INT(v) bswap_32(v) #define BE_SHORT(v) (v) #define BE_INT(v) (v) #else #error "Wrong endian" #endif /* Note: the following macros evaluate the parameter v twice */ #define TO_CPU_SHORT(v, be) \ ((be) ? BE_SHORT(v) : LE_SHORT(v)) #define TO_CPU_INT(v, be) \ ((be) ? BE_INT(v) : LE_INT(v)) #define WAV_RIFF COMPOSE_ID('R','I','F','F') #define WAV_RIFX COMPOSE_ID('R','I','F','X') #define WAV_WAVE COMPOSE_ID('W','A','V','E') #define WAV_FMT COMPOSE_ID('f','m','t',' ') #define WAV_DATA COMPOSE_ID('d','a','t','a') /* WAVE fmt block constants from Microsoft mmreg.h header */ #define WAV_FMT_PCM 0x0001 #define WAV_FMT_IEEE_FLOAT 0x0003 #define WAV_FMT_DOLBY_AC3_SPDIF 0x0092 #define WAV_FMT_EXTENSIBLE 0xfffe /* Used with WAV_FMT_EXTENSIBLE format */ #define WAV_GUID_TAG "\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71" /* it's in chunks like .voc and AMIGA iff, but my source say there are in only in this combination, so I combined them in one header; it works on all WAVE-file I have */ typedef struct { u_int magic; /* 'RIFF' */ u_int length; /* filelen */ u_int type; /* 'WAVE' */ } WaveHeader; typedef struct { u_short format; /* see WAV_FMT_* */ u_short channels; u_int sample_fq; /* frequence of sample */ u_int byte_p_sec; u_short byte_p_spl; /* samplesize; 1 or 2 bytes */ u_short bit_p_spl; /* 8, 12 or 16 bit */ } WaveFmtBody; typedef struct { WaveFmtBody format; u_short ext_size; u_short bit_p_spl; u_int channel_mask; u_short guid_format; /* WAV_FMT_* */ u_char guid_tag[14]; /* WAV_GUID_TAG */ } WaveFmtExtensibleBody; typedef struct { u_int type; /* 'data' */ u_int length; /* samplecount */ } WaveChunkHeader; /* Definitions for Sparc .au header */ #define AU_MAGIC COMPOSE_ID('.','s','n','d') #define AU_FMT_ULAW 1 #define AU_FMT_LIN8 2 #define AU_FMT_LIN16 3 typedef struct au_header { u_int magic; /* '.snd' */ u_int hdr_size; /* size of header (min 24) */ u_int data_size; /* size of data */ u_int encoding; /* see to AU_FMT_XXXX */ u_int sample_rate; /* sample rate */ u_int channels; /* number of channels (voices) */ } AuHeader; #endif /* FORMATS */ ukui-media/ukui-login-sound/ukui_login_sound.cpp0000664000175000017500000015455415170054730021044 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 = 0) { char name[32]; // sprintf(name, "hw:%d", card); snprintf(name, sizeof(name), "hw:%d", card); if ((err = snd_ctl_open(&handle, name, 0)) < 0) { printf("control open (%i): %s", card, snd_strerror(err)); goto next_card; } if ((err = snd_ctl_card_info(handle, info)) < 0) { printf("control hardware info (%i): %s", card, snd_strerror(err)); snd_ctl_close(handle); goto next_card; } dev = -1; while (1) { unsigned int count; if (snd_ctl_pcm_next_device(handle, &dev)<0) printf("snd_ctl_pcm_next_device"); if (dev < 0) break; snd_pcm_info_set_device(pcminfo, dev); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, stream); if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { if (err != -ENOENT) printf("control digital audio info (%i): %s", card, snd_strerror(err)); continue; } printf(("card %i: %s [%s], device %i: %s [%s]\n"), card, snd_ctl_card_info_get_id(info), snd_ctl_card_info_get_name(info), dev, snd_pcm_info_get_id(pcminfo), snd_pcm_info_get_name(pcminfo)); count = snd_pcm_info_get_subdevices_count(pcminfo); printf((" Subdevices: %i/%i\n"), snd_pcm_info_get_subdevices_avail(pcminfo), count); for (idx = 0; idx < (int)count; idx++) { snd_pcm_info_set_subdevice(pcminfo, idx); if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { printf("control digital audio playback info (%i): %s", card, snd_strerror(err)); } else { printf((" Subdevice #%i: %s\n"), idx, snd_pcm_info_get_subdevice_name(pcminfo)); } } } snd_ctl_close(handle); next_card: if (snd_card_next(&card) < 0) { printf("snd_card_next"); break; } } } void UkuiLoginSound::pcm_list(void) { void **hints, **n; char *name, *descr, *descr1, *io; const char *filter; if (snd_device_name_hint(-1, "pcm", &hints) < 0) return; n = hints; filter = stream == SND_PCM_STREAM_CAPTURE ? "Input" : "Output"; while (*n != NULL) { name = snd_device_name_get_hint(*n, "NAME"); descr = snd_device_name_get_hint(*n, "DESC"); io = snd_device_name_get_hint(*n, "IOID"); if (io != NULL && strcmp(io, filter) != 0) goto __end; printf("%s\n", name); if ((descr1 = descr) != NULL) { printf(" "); while (*descr1) { if (*descr1 == '\n') printf("\n "); else putchar(*descr1); descr1++; } putchar('\n'); } __end: if (name != NULL) free(name); if (descr != NULL) free(descr); if (io != NULL) free(io); n++; } snd_device_name_free_hint(hints); } /* * Subroutine to clean up before exit. */ void UkuiLoginSound::prg_exit(int code) { done_stdin(); if (handle) snd_pcm_close(handle); if (pidfile_written) remove (pidfile_name); exit(code); } void UkuiLoginSound::signal_handler(int sig) { if (in_aborting) return; in_aborting = 1; if (verbose==2) putchar('\n'); if (!quiet_mode) { syslog (LOG_INFO,"sig: %d quiet_mode: %d.", sig, quiet_mode); fprintf(stderr, ("Aborted by signal %s...\n"), strsignal(sig)); } if (handle) snd_pcm_abort(handle); if (sig == SIGABRT) { /* do not call snd_pcm_close() and abort immediately */ handle = NULL; prg_exit(EXIT_FAILURE); } signal(sig, SIG_DFL); } /* call on SIGUSR1 signal. */ void UkuiLoginSound::signal_handler_recycle ([[maybe_unused]] int sig) { /* flag the capture loop to start a new output file */ recycle_capture_file = 1; } int UkuiLoginSound::aplayMain(char *filename, char *playdev) { // int duration_or_sample = 0; // int option_index; // static const char short_options[] = "hnlLD:qt:c:f:r:d:s:MNF:A:R:T:B:vV:IPCi" #ifdef CONFIG_SUPPORT_CHMAP "m:" #endif ; char *pcm_name = playdev; int err; int do_device_list = 0, do_pcm_list = 0; snd_pcm_info_t *info; #ifdef ENABLE_NLS setlocale(LC_ALL, ""); textdomain(PACKAGE); #endif snd_pcm_info_alloca(&info); err = snd_output_stdio_attach(&snd_log, stderr, 0); assert(err >= 0); file_type = FORMAT_DEFAULT; stream = SND_PCM_STREAM_PLAYBACK; chunk_size = -1; rhwparams.format = DEFAULT_FORMAT; rhwparams.rate = DEFAULT_SPEED; rhwparams.channels = 1; if (do_device_list) { if (do_pcm_list) pcm_list(); device_list(); goto __end; } else if (do_pcm_list) { pcm_list(); goto __end; } err = snd_pcm_open(&handle, playdev, stream, open_mode); syslog (LOG_INFO, "start open %s device...", pcm_name); if (err < 0) { printf(("audio open error: %s"), snd_strerror(err)); return 1; } if ((err = snd_pcm_info(handle, info)) < 0) { printf(("info error: %s"), snd_strerror(err)); return 1; } if (nonblock) { err = snd_pcm_nonblock(handle, 1); if (err < 0) { printf(("nonblock setting error: %s"), snd_strerror(err)); return 1; } } chunk_size = 1024; hwparams = rhwparams; audiobuf = (u_char *)malloc(1024); if (audiobuf == NULL) { printf(("not enough memory")); return 1; } if (mmap_flag) { writei_func = snd_pcm_mmap_writei; readi_func = snd_pcm_mmap_readi; writen_func = snd_pcm_mmap_writen; readn_func = snd_pcm_mmap_readn; } else { writei_func = snd_pcm_writei; readi_func = snd_pcm_readi; writen_func = snd_pcm_writen; readn_func = snd_pcm_readn; } if (pidfile_name) { errno = 0; pidf = fopen (pidfile_name, "w"); if (pidf) { (void)fprintf (pidf, "%d\n", getpid()); fclose(pidf); pidfile_written = 1; } else { printf(("Cannot create process ID file %s: %s"), pidfile_name, strerror (errno)); return 1; } } signal(SIGINT, signal_handler); signal(SIGTERM, signal_handler); signal(SIGABRT, signal_handler); signal(SIGUSR1, signal_handler_recycle); if (interleaved) { if (stream == SND_PCM_STREAM_PLAYBACK) { playback(filename); } } if (verbose==2) putchar('\n'); snd_pcm_close(handle); handle = NULL; free(audiobuf); __end: snd_output_close(snd_log); snd_config_update_free_global(); prg_exit(EXIT_SUCCESS); /* avoid warning */ return EXIT_SUCCESS; } /* * Safe read (for pipes) */ ssize_t UkuiLoginSound::safe_read(int fd, void *buf, size_t count) { ssize_t result = 0, res; while (count > 0 && !in_aborting) { if ((res = read(fd, buf, count)) == 0) break; if (res < 0) return result > 0 ? result : res; count -= res; result += res; buf = (char *)buf + res; } return result; } /* * helper for test_wavefile */ size_t UkuiLoginSound::test_wavefile_read(int fd, u_char *buffer, size_t *size, size_t reqsize, int line) { if (*size >= reqsize) return *size; if ((size_t)safe_read(fd, buffer + *size, reqsize - *size) != reqsize - *size) { printf(("read error (called from line %i)"), line); prg_exit(EXIT_FAILURE); } return *size = reqsize; } #define check_wavefile_space(buffer, len, blimit) \ if (len > blimit) { \ blimit = len; \ if ((buffer = (u_char *)realloc(buffer, blimit)) == NULL) { \ printf(("not enough memory")); \ prg_exit(EXIT_FAILURE); \ } \ } /* * test, if it's a .WAV file, > 0 if ok (and set the speed, stereo etc.) * == 0 if not * Value returned is bytes to be discarded. */ ssize_t UkuiLoginSound::test_wavefile(int fd, u_char *_buffer, size_t size) { WaveHeader *h = (WaveHeader *)_buffer; u_char *buffer = NULL; size_t blimit = 0; WaveFmtBody *f; WaveChunkHeader *c; u_int type, len; unsigned short format, channels; int big_endian, native_format; if (size < sizeof(WaveHeader)) return -1; if (h->magic == WAV_RIFF) big_endian = 0; else if (h->magic == WAV_RIFX) big_endian = 1; else return -1; if (h->type != WAV_WAVE) return -1; if (size > sizeof(WaveHeader)) { check_wavefile_space(buffer, size - sizeof(WaveHeader), blimit); memcpy(buffer, (_buffer + (sizeof(WaveHeader))), size - sizeof(WaveHeader)); } size -= sizeof(WaveHeader); while (1) { check_wavefile_space(buffer, sizeof(WaveChunkHeader), blimit); test_wavefile_read(fd, buffer, &size, sizeof(WaveChunkHeader), __LINE__); c = (WaveChunkHeader*)buffer; type = c->type; len = TO_CPU_INT(c->length, big_endian); len += len % 2; if (size > sizeof(WaveChunkHeader)) memmove(buffer, buffer + sizeof(WaveChunkHeader), size - sizeof(WaveChunkHeader)); size -= sizeof(WaveChunkHeader); if (type == WAV_FMT) break; check_wavefile_space(buffer, len, blimit); test_wavefile_read(fd, buffer, &size, len, __LINE__); if (size > len) memmove(buffer, buffer + len, size - len); size -= len; } if (len < sizeof(WaveFmtBody)) { printf(("unknown length of 'fmt ' chunk (read %u, should be %u at least)"), len, (u_int)sizeof(WaveFmtBody)); prg_exit(EXIT_FAILURE); } check_wavefile_space(buffer, len, blimit); test_wavefile_read(fd, buffer, &size, len, __LINE__); f = (WaveFmtBody*) buffer; format = TO_CPU_SHORT(f->format, big_endian); if (format == WAV_FMT_EXTENSIBLE) { WaveFmtExtensibleBody *fe = (WaveFmtExtensibleBody*)buffer; if (len < sizeof(WaveFmtExtensibleBody)) { printf(("unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)"), len, (u_int)sizeof(WaveFmtExtensibleBody)); prg_exit(EXIT_FAILURE); } if (memcmp(fe->guid_tag, WAV_GUID_TAG, 14) != 0) { printf(("wrong format tag in extensible 'fmt ' chunk")); prg_exit(EXIT_FAILURE); } format = TO_CPU_SHORT(fe->guid_format, big_endian); } if (format != WAV_FMT_PCM && format != WAV_FMT_IEEE_FLOAT) { printf(("can't play WAVE-file format 0x%04x which is not PCM or FLOAT encoded"), format); prg_exit(EXIT_FAILURE); } channels = TO_CPU_SHORT(f->channels, big_endian); if (channels < 1) { printf(("can't play WAVE-files with %d tracks"), channels); prg_exit(EXIT_FAILURE); } hwparams.channels = channels; switch (TO_CPU_SHORT(f->bit_p_spl, big_endian)) { case 8: if (hwparams.format != DEFAULT_FORMAT && hwparams.format != SND_PCM_FORMAT_U8) fprintf(stderr, ("Warning: format is changed to U8\n")); hwparams.format = SND_PCM_FORMAT_U8; break; case 16: if (big_endian) native_format = SND_PCM_FORMAT_S16_BE; else native_format = SND_PCM_FORMAT_S16_LE; if (hwparams.format != DEFAULT_FORMAT && hwparams.format != native_format) fprintf(stderr, ("Warning: format is changed to %s\n"), snd_pcm_format_name((snd_pcm_format_t)native_format)); hwparams.format = (snd_pcm_format_t)native_format; break; case 24: switch (TO_CPU_SHORT(f->byte_p_spl, big_endian) / hwparams.channels) { case 3: if (big_endian) native_format = SND_PCM_FORMAT_S24_3BE; else native_format = SND_PCM_FORMAT_S24_3LE; if (hwparams.format != DEFAULT_FORMAT && hwparams.format != native_format) fprintf(stderr, ("Warning: format is changed to %s\n"), snd_pcm_format_name((snd_pcm_format_t)native_format)); hwparams.format = (snd_pcm_format_t)native_format; break; case 4: if (big_endian) native_format = SND_PCM_FORMAT_S24_BE; else native_format = SND_PCM_FORMAT_S24_LE; if (hwparams.format != DEFAULT_FORMAT && hwparams.format != native_format) fprintf(stderr, ("Warning: format is changed to %s\n"), snd_pcm_format_name((snd_pcm_format_t)native_format)); hwparams.format = (snd_pcm_format_t)native_format; break; default: printf((" can't play WAVE-files with sample %d bits in %d bytes wide (%d channels)"), TO_CPU_SHORT(f->bit_p_spl, big_endian), TO_CPU_SHORT(f->byte_p_spl, big_endian), hwparams.channels); prg_exit(EXIT_FAILURE); } break; case 32: if (format == WAV_FMT_PCM) { if (big_endian) native_format = SND_PCM_FORMAT_S32_BE; else native_format = SND_PCM_FORMAT_S32_LE; hwparams.format = (snd_pcm_format_t)native_format; } else if (format == WAV_FMT_IEEE_FLOAT) { if (big_endian) native_format = SND_PCM_FORMAT_FLOAT_BE; else native_format = SND_PCM_FORMAT_FLOAT_LE; hwparams.format = (snd_pcm_format_t)native_format; } break; default: printf((" can't play WAVE-files with sample %d bits wide"), TO_CPU_SHORT(f->bit_p_spl, big_endian)); prg_exit(EXIT_FAILURE); } hwparams.rate = TO_CPU_INT(f->sample_fq, big_endian); if (size > len) memmove(buffer, buffer + len, size - len); size -= len; while (1) { u_int type, len; check_wavefile_space(buffer, sizeof(WaveChunkHeader), blimit); test_wavefile_read(fd, buffer, &size, sizeof(WaveChunkHeader), __LINE__); c = (WaveChunkHeader*)buffer; type = c->type; len = TO_CPU_INT(c->length, big_endian); if (size > sizeof(WaveChunkHeader)) memmove(buffer, buffer + sizeof(WaveChunkHeader), size - sizeof(WaveChunkHeader)); size -= sizeof(WaveChunkHeader); if (type == WAV_DATA) { if (len < pbrec_count && len < 0x7ffffffe) pbrec_count = len; if (size > 0) memcpy(_buffer, buffer, size); free(buffer); return size; } len += len % 2; check_wavefile_space(buffer, len, blimit); test_wavefile_read(fd, buffer, &size, len, __LINE__); if (size > len) memmove(buffer, buffer + len, size - len); size -= len; } /* shouldn't be reached */ return -1; } void UkuiLoginSound::show_available_sample_formats(snd_pcm_hw_params_t* params) { // snd_pcm_format_t format; int format; fprintf(stderr, "Available formats:\n"); for (format = 0; format <= SND_PCM_FORMAT_LAST; format++) { if (snd_pcm_hw_params_test_format(handle, params, (snd_pcm_format_t)format) == 0) fprintf(stderr, "- %s\n", snd_pcm_format_name((snd_pcm_format_t)format)); } } #ifdef CONFIG_SUPPORT_CHMAP int UkuiLoginSound::setup_chmap(void) { snd_pcm_chmap_t *chmap = channel_map; char mapped[hwparams.channels]; snd_pcm_chmap_t *hw_chmap; unsigned int ch, i; int err; if (!chmap) return 0; if (chmap->channels != hwparams.channels) { printf(("Channel numbers don't match between hw_params and channel map")); return -1; } err = snd_pcm_set_chmap(handle, chmap); if (!err) return 0; hw_chmap = snd_pcm_get_chmap(handle); if (!hw_chmap) { fprintf(stderr, ("Warning: unable to get channel map\n")); return 0; } if (hw_chmap->channels == chmap->channels && !memcmp(hw_chmap, chmap, 4 * (chmap->channels + 1))) { /* maps are identical, so no need to convert */ free(hw_chmap); return 0; } hw_map = (unsigned int *)calloc(hwparams.channels, sizeof(int)); if (!hw_map) { printf(("not enough memory")); free(hw_chmap); return -1; } memset(mapped, 0, sizeof(mapped)); for (ch = 0; ch < hw_chmap->channels; ch++) { if (chmap->pos[ch] == hw_chmap->pos[ch]) { mapped[ch] = 1; hw_map[ch] = ch; continue; } for (i = 0; i < hw_chmap->channels; i++) { if (!mapped[i] && chmap->pos[ch] == hw_chmap->pos[i]) { mapped[i] = 1; hw_map[ch] = i; break; } } if (i >= hw_chmap->channels) { char buf[256]; printf(("Channel %d doesn't match with hw_parmas"), ch); snd_pcm_chmap_print(hw_chmap, sizeof(buf), buf); fprintf(stderr, "hardware chmap = %s\n", buf); free(hw_chmap); return -1; } } free(hw_chmap); return 0; } #else #define setup_chmap() 0 #endif void UkuiLoginSound::set_params(void) { snd_pcm_hw_params_t *params; snd_pcm_sw_params_t *swparams; snd_pcm_uframes_t buffer_size; int err; size_t n; unsigned int rate; snd_pcm_uframes_t start_threshold, stop_threshold; snd_pcm_hw_params_alloca(¶ms); snd_pcm_sw_params_alloca(&swparams); err = snd_pcm_hw_params_any(handle, params); if (err < 0) { printf(("Broken configuration for this PCM: no configurations available")); prg_exit(EXIT_FAILURE); } if (dump_hw_params) { fprintf(stderr, ("HW Params of device \"%s\":\n"), snd_pcm_name(handle)); fprintf(stderr, "--------------------\n"); snd_pcm_hw_params_dump(params, snd_log); fprintf(stderr, "--------------------\n"); } if (mmap_flag) { snd_pcm_access_mask_t *mask = (snd_pcm_access_mask_t *)alloca(snd_pcm_access_mask_sizeof()); snd_pcm_access_mask_none(mask); snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED); snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED); snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX); err = snd_pcm_hw_params_set_access_mask(handle, params, mask); } else if (interleaved) err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); else err = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_NONINTERLEAVED); if (err < 0) { printf(("Access type not available")); prg_exit(EXIT_FAILURE); } err = snd_pcm_hw_params_set_format(handle, params, hwparams.format); if (err < 0) { printf(("Sample format non available")); show_available_sample_formats(params); prg_exit(EXIT_FAILURE); } err = snd_pcm_hw_params_set_channels(handle, params, hwparams.channels); if (err < 0) { printf(("Channels count non available")); prg_exit(EXIT_FAILURE); } #if 0 err = snd_pcm_hw_params_set_periods_min(handle, params, 2); assert(err >= 0); #endif rate = hwparams.rate; err = snd_pcm_hw_params_set_rate_near(handle, params, &hwparams.rate, 0); assert(err >= 0); if ((float)rate * 1.05 < hwparams.rate || (float)rate * 0.95 > hwparams.rate) { if (!quiet_mode) { char plugex[64]; const char *pcmname = snd_pcm_name(handle); fprintf(stderr, ("Warning: rate is not accurate (requested = %iHz, got = %iHz)\n"), rate, hwparams.rate); if (! pcmname || strchr(snd_pcm_name(handle), ':')) *plugex = 0; else snprintf(plugex, sizeof(plugex), "(-Dplug:%s)", snd_pcm_name(handle)); fprintf(stderr, (" please, try the plug plugin %s\n"), plugex); } } rate = hwparams.rate; if (buffer_time == 0 && buffer_frames == 0) { err = snd_pcm_hw_params_get_buffer_time_max(params, &buffer_time, 0); assert(err >= 0); if (buffer_time > 500000) buffer_time = 500000; } if (period_time == 0 && period_frames == 0) { if (buffer_time > 0) period_time = buffer_time / 4; else period_frames = buffer_frames / 4; } if (period_time > 0) err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, 0); else err = snd_pcm_hw_params_set_period_size_near(handle, params, &period_frames, 0); assert(err >= 0); if (buffer_time > 0) { err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, 0); } else { err = snd_pcm_hw_params_set_buffer_size_near(handle, params, &buffer_frames); } assert(err >= 0); monotonic = snd_pcm_hw_params_is_monotonic(params); can_pause = snd_pcm_hw_params_can_pause(params); err = snd_pcm_hw_params(handle, params); if (err < 0) { printf(("Unable to install hw params:")); snd_pcm_hw_params_dump(params, snd_log); prg_exit(EXIT_FAILURE); } snd_pcm_hw_params_get_period_size(params, &chunk_size, 0); snd_pcm_hw_params_get_buffer_size(params, &buffer_size); if (chunk_size == buffer_size) { printf(("Can't use period equal to buffer size (%lu == %lu)"), chunk_size, buffer_size); prg_exit(EXIT_FAILURE); } err = snd_pcm_sw_params_current(handle, swparams); if (err < 0) { printf(("Unable to get current sw params.")); prg_exit(EXIT_FAILURE); } if (avail_min < 0) n = chunk_size; else n = (double) rate * avail_min / 1000000; err = snd_pcm_sw_params_set_avail_min(handle, swparams, n); /* round up to closest transfer boundary */ n = buffer_size; if (start_delay <= 0) { start_threshold = n + (double) rate * start_delay / 1000000; } else start_threshold = (double) rate * start_delay / 1000000; if (start_threshold < 1) start_threshold = 1; if (start_threshold > n) start_threshold = n; err = snd_pcm_sw_params_set_start_threshold(handle, swparams, start_threshold); assert(err >= 0); if (stop_delay <= 0) stop_threshold = buffer_size + (double) rate * stop_delay / 1000000; else stop_threshold = (double) rate * stop_delay / 1000000; err = snd_pcm_sw_params_set_stop_threshold(handle, swparams, stop_threshold); assert(err >= 0); if (snd_pcm_sw_params(handle, swparams) < 0) { printf(("unable to install sw params:")); snd_pcm_sw_params_dump(swparams, snd_log); prg_exit(EXIT_FAILURE); } if (setup_chmap()) prg_exit(EXIT_FAILURE); if (verbose) snd_pcm_dump(handle, snd_log); bits_per_sample = snd_pcm_format_physical_width(hwparams.format); significant_bits_per_sample = snd_pcm_format_width(hwparams.format); bits_per_frame = bits_per_sample * hwparams.channels; chunk_bytes = chunk_size * bits_per_frame / 8; audiobuf = (u_char *)realloc(audiobuf, chunk_bytes); if (audiobuf == NULL) { printf(("not enough memory")); prg_exit(EXIT_FAILURE); } // fprintf(stderr, "real chunk_size = %i, frags = %i, total = %i\n", chunk_size, setup.buf.block.frags, setup.buf.block.frags * chunk_size); /* stereo VU-meter isn't always available... */ if (vumeter == VUMETER_STEREO) { if (hwparams.channels != 2 || !interleaved || verbose > 2) vumeter = VUMETER_MONO; } /* show mmap buffer arragment */ if (mmap_flag && verbose) { const snd_pcm_channel_area_t *areas; snd_pcm_uframes_t offset, size = chunk_size; int i; err = snd_pcm_mmap_begin(handle, &areas, &offset, &size); if (err < 0) { printf(("snd_pcm_mmap_begin problem: %s"), snd_strerror(err)); prg_exit(EXIT_FAILURE); } for (i = 0; i < hwparams.channels; i++) fprintf(stderr, "mmap_area[%i] = %p,%u,%u (%u)\n", i, areas[i].addr, areas[i].first, areas[i].step, snd_pcm_format_physical_width(hwparams.format)); /* not required, but for sure */ snd_pcm_mmap_commit(handle, offset, 0); } buffer_frames = buffer_size; /* for position test */ } void UkuiLoginSound::init_stdin(void) { struct termios term; long flags; if (!interactive) return; if (!isatty(fileno(stdin))) { interactive = 0; return; } tcgetattr(fileno(stdin), &term); term_c_lflag = term.c_lflag; if (fd == fileno(stdin)) return; flags = fcntl(fileno(stdin), F_GETFL); if (flags < 0 || fcntl(fileno(stdin), F_SETFL, flags|O_NONBLOCK) < 0) fprintf(stderr, ("stdin O_NONBLOCK flag setup failed\n")); term.c_lflag &= ~ICANON; tcsetattr(fileno(stdin), TCSANOW, &term); } void UkuiLoginSound::done_stdin(void) { struct termios term; if (!interactive) return; if (fd == fileno(stdin) || term_c_lflag == -1) return; tcgetattr(fileno(stdin), &term); term.c_lflag = term_c_lflag; tcsetattr(fileno(stdin), TCSANOW, &term); } void UkuiLoginSound::do_pause(void) { int err; unsigned char b; if (!can_pause) { fprintf(stderr, ("\rPAUSE command ignored (no hw support)\n")); return; } if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED) suspend(); err = snd_pcm_pause(handle, 1); if (err < 0) { printf(("pause push error: %s"), snd_strerror(err)); return; } while (1) { while (read(fileno(stdin), &b, 1) != 1); if (b == ' ' || b == '\r') { while (read(fileno(stdin), &b, 1) == 1); if (snd_pcm_state(handle) == SND_PCM_STATE_SUSPENDED) suspend(); err = snd_pcm_pause(handle, 0); if (err < 0) printf(("pause release error: %s"), snd_strerror(err)); return; } } } void UkuiLoginSound::check_stdin(void) { unsigned char b; if (!interactive) return; if (fd != fileno(stdin)) { while (read(fileno(stdin), &b, 1) == 1) { if (b == ' ' || b == '\r') { while (read(fileno(stdin), &b, 1) == 1); fprintf(stderr, ("\r=== PAUSE === ")); fflush(stderr); do_pause(); fprintf(stderr, " \r"); fflush(stderr); } } } } #ifndef timersub #define timersub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ if ((result)->tv_usec < 0) { \ --(result)->tv_sec; \ (result)->tv_usec += 1000000; \ } \ } while (0) #endif #ifndef timermsub #define timermsub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \ if ((result)->tv_nsec < 0) { \ --(result)->tv_sec; \ (result)->tv_nsec += 1000000000L; \ } \ } while (0) #endif /* I/O error handler */ void UkuiLoginSound::xrun(void) { snd_pcm_status_t *status; int res; snd_pcm_status_alloca(&status); if ((res = snd_pcm_status(handle, status))<0) { printf(("status error: %s"), snd_strerror(res)); prg_exit(EXIT_FAILURE); } if (snd_pcm_status_get_state(status) == SND_PCM_STATE_XRUN) { if (fatal_errors) { printf(("fatal %s: %s"), stream == SND_PCM_STREAM_PLAYBACK ? ("underrun") : ("overrun"), snd_strerror(res)); prg_exit(EXIT_FAILURE); } if (monotonic) { #ifdef HAVE_CLOCK_GETTIME struct timespec now, diff, tstamp; clock_gettime(CLOCK_MONOTONIC, &now); snd_pcm_status_get_trigger_htstamp(status, &tstamp); timermsub(&now, &tstamp, &diff); fprintf(stderr, _("%s!!! (at least %.3f ms long)\n"), stream == SND_PCM_STREAM_PLAYBACK ? _("underrun") : _("overrun"), diff.tv_sec * 1000 + diff.tv_nsec / 1000000.0); #else fprintf(stderr, "%s !!!\n", ("underrun")); #endif } else { struct timeval now, diff, tstamp; gettimeofday(&now, 0); snd_pcm_status_get_trigger_tstamp(status, &tstamp); timersub(&now, &tstamp, &diff); fprintf(stderr, ("%s!!! (at least %.3f ms long)\n"), stream == SND_PCM_STREAM_PLAYBACK ? ("underrun") : ("overrun"), diff.tv_sec * 1000 + diff.tv_usec / 1000.0); } if (verbose) { fprintf(stderr, ("Status:\n")); snd_pcm_status_dump(status, snd_log); } if ((res = snd_pcm_prepare(handle))<0) { printf(("xrun: prepare error: %s"), snd_strerror(res)); prg_exit(EXIT_FAILURE); } return; /* ok, data should be accepted again */ } if (snd_pcm_status_get_state(status) == SND_PCM_STATE_DRAINING) { if (verbose) { fprintf(stderr, ("Status(DRAINING):\n")); snd_pcm_status_dump(status, snd_log); } if (stream == SND_PCM_STREAM_CAPTURE) { fprintf(stderr, ("capture stream format change? attempting recover...\n")); if ((res = snd_pcm_prepare(handle))<0) { printf(("xrun(DRAINING): prepare error: %s"), snd_strerror(res)); prg_exit(EXIT_FAILURE); } return; } } if (verbose) { fprintf(stderr, ("Status(R/W):\n")); snd_pcm_status_dump(status, snd_log); } printf(("read/write error, state = %s"), snd_pcm_state_name(snd_pcm_status_get_state(status))); prg_exit(EXIT_FAILURE); } /* I/O suspend handler */ void UkuiLoginSound::suspend(void) { int res; if (!quiet_mode) { fprintf(stderr, ("Suspended. Trying resume. ")); fflush(stderr); } while ((res = snd_pcm_resume(handle)) == -EAGAIN) sleep(1); /* wait until suspend flag is released */ if (res < 0) { if (!quiet_mode) { fprintf(stderr, ("Failed. Restarting stream. ")); fflush(stderr); } if ((res = snd_pcm_prepare(handle)) < 0) { printf(("suspend: prepare error: %s"), snd_strerror(res)); prg_exit(EXIT_FAILURE); } } if (!quiet_mode) fprintf(stderr, ("Done.\n")); } void UkuiLoginSound::print_vu_meter_mono(int perc, int maxperc) { const int bar_length = 50; char line[80]; int val; for (val = 0; val <= perc * bar_length / 100 && val < bar_length; val++) line[val] = '#'; for (; val <= maxperc * bar_length / 100 && val < bar_length; val++) line[val] = ' '; line[val] = '+'; for (++val; val <= bar_length; val++) line[val] = ' '; // if (maxperc > 99) // sprintf(line + val, "| MAX"); // else // sprintf(line + val, "| %02i%%", maxperc); if (maxperc > 99) snprintf(line + val, sizeof(line) - val, "| MAX"); else snprintf(line + val, sizeof(line) - val, "| %02i%%", maxperc); fputs(line, stderr); if (perc > 100) fprintf(stderr, (" !clip ")); } void UkuiLoginSound::print_vu_meter_stereo(int *perc, int *maxperc) { const int bar_length = 35; char line[80]; int c; memset(line, ' ', sizeof(line) - 1); line[bar_length + 3] = '|'; for (c = 0; c < 2; c++) { int p = perc[c] * bar_length / 100; char tmp[4]; if (p > bar_length) p = bar_length; if (c) memset(line + bar_length + 6 + 1, '#', p); else memset(line + bar_length - p - 1, '#', p); p = maxperc[c] * bar_length / 100; if (p > bar_length) p = bar_length; if (c) line[bar_length + 6 + 1 + p] = '+'; else line[bar_length - p - 1] = '+'; // if (ABS(maxperc[c]) > 99) // sprintf(tmp, "MAX"); // else // sprintf(tmp, "%02d%%", maxperc[c]); if (ABS(maxperc[c]) > 99) snprintf(tmp, sizeof(tmp), "MAX"); else snprintf(tmp, sizeof(tmp), "%02d%%", maxperc[c]); if (c) memcpy(line + bar_length + 3 + 1, tmp, 3); else memcpy(line + bar_length, tmp, 3); } line[bar_length * 2 + 6 + 2] = 0; fputs(line, stderr); } void UkuiLoginSound::print_vu_meter(signed int *perc, signed int *maxperc) { if (vumeter == VUMETER_STEREO) print_vu_meter_stereo(perc, maxperc); else print_vu_meter_mono(*perc, *maxperc); } /* peak handler */ void UkuiLoginSound::compute_max_peak(u_char *data, size_t count) { signed int val, max, perc[2], max_peak[2]; static int run = 0; size_t ocount = count; int format_little_endian = snd_pcm_format_little_endian(hwparams.format); int ichans, c; if (vumeter == VUMETER_STEREO) ichans = 2; else ichans = 1; memset(max_peak, 0, sizeof(max_peak)); switch (bits_per_sample) { case 8: { signed char *valp = (signed char *)data; signed char mask = snd_pcm_format_silence(hwparams.format); c = 0; while (count-- > 0) { val = *valp++ ^ mask; val = abs(val); if (max_peak[c] < val) max_peak[c] = val; if (vumeter == VUMETER_STEREO) c = !c; } break; } case 16: { signed short *valp = (signed short *)data; signed short mask = snd_pcm_format_silence_16(hwparams.format); signed short sval; count /= 2; c = 0; while (count-- > 0) { if (format_little_endian) sval = le16toh(*valp); else sval = be16toh(*valp); sval = abs(sval) ^ mask; if (max_peak[c] < sval) max_peak[c] = sval; valp++; if (vumeter == VUMETER_STEREO) c = !c; } break; } case 24: { unsigned char *valp = data; signed int mask = snd_pcm_format_silence_32(hwparams.format); count /= 3; c = 0; while (count-- > 0) { if (format_little_endian) { val = valp[0] | (valp[1]<<8) | (valp[2]<<16); } else { val = (valp[0]<<16) | (valp[1]<<8) | valp[2]; } /* Correct signed bit in 32-bit value */ if (val & (1<<(bits_per_sample-1))) { val |= 0xff<<24; /* Negate upper bits too */ } val = abs(val) ^ mask; if (max_peak[c] < val) max_peak[c] = val; valp += 3; if (vumeter == VUMETER_STEREO) c = !c; } break; } case 32: { signed int *valp = (signed int *)data; signed int mask = snd_pcm_format_silence_32(hwparams.format); count /= 4; c = 0; while (count-- > 0) { if (format_little_endian) val = le32toh(*valp); else val = be32toh(*valp); val = abs(val) ^ mask; if (max_peak[c] < val) max_peak[c] = val; valp++; if (vumeter == VUMETER_STEREO) c = !c; } break; } default: if (run == 0) { fprintf(stderr, ("Unsupported bit size %d.\n"), (int)bits_per_sample); run = 1; } return; } max = 1 << (significant_bits_per_sample-1); if (max <= 0) max = 0x7fffffff; for (c = 0; c < ichans; c++) { if (bits_per_sample > 16) perc[c] = max_peak[c] / (max / 100); else perc[c] = max_peak[c] * 100 / max; } if (interleaved && verbose <= 2) { static int maxperc[2]; static time_t t=0; const time_t tt=time(NULL); if(tt>t) { t=tt; maxperc[0] = 0; maxperc[1] = 0; } for (c = 0; c < ichans; c++) if (perc[c] > maxperc[c]) maxperc[c] = perc[c]; putc('\r', stderr); print_vu_meter(perc, maxperc); fflush(stderr); } else if(verbose==3) { fprintf(stderr, ("Max peak (%li samples): 0x%08x "), (long)ocount, max_peak[0]); for (val = 0; val < 20; val++) if (val <= perc[0] / 5) putc('#', stderr); else putc(' ', stderr); fprintf(stderr, " %i%%\n", perc[0]); fflush(stderr); } } void UkuiLoginSound::do_test_position(void) { static long counter = 0; static time_t tmr = -1; time_t now; static float availsum, delaysum, samples; static snd_pcm_sframes_t maxavail, maxdelay; static snd_pcm_sframes_t minavail, mindelay; static snd_pcm_sframes_t badavail = 0, baddelay = 0; snd_pcm_sframes_t outofrange; snd_pcm_sframes_t avail, delay; int err; err = snd_pcm_avail_delay(handle, &avail, &delay); if (err < 0) return; outofrange = (test_coef * (snd_pcm_sframes_t)buffer_frames) / 2; if (avail > outofrange || avail < -outofrange || delay > outofrange || delay < -outofrange) { badavail = avail; baddelay = delay; availsum = delaysum = samples = 0; maxavail = maxdelay = 0; minavail = mindelay = buffer_frames * 16; fprintf(stderr, ("Suspicious buffer position (%li total): " "avail = %li, delay = %li, buffer = %li\n"), ++counter, (long)avail, (long)delay, (long)buffer_frames); } else if (verbose) { time(&now); if (tmr == (time_t) -1) { tmr = now; availsum = delaysum = samples = 0; maxavail = maxdelay = 0; minavail = mindelay = buffer_frames * 16; } if (avail > maxavail) maxavail = avail; if (delay > maxdelay) maxdelay = delay; if (avail < minavail) minavail = avail; if (delay < mindelay) mindelay = delay; availsum += avail; delaysum += delay; samples++; if (avail != 0 && now != tmr) { fprintf(stderr, "BUFPOS: avg%li/%li " "min%li/%li max%li/%li (%li) (%li:%li/%li)\n", (long)(availsum / samples), (long)(delaysum / samples), (long)minavail, (long)mindelay, (long)maxavail, (long)maxdelay, (long)buffer_frames, counter, badavail, baddelay); tmr = now; } } } /* */ #ifdef CONFIG_SUPPORT_CHMAP u_char * UkuiLoginSound::remap_data(u_char *data, size_t count) { static u_char *tmp, *src, *dst; static size_t tmp_size; size_t sample_bytes = bits_per_sample / 8; size_t step = bits_per_frame / 8; size_t chunk_bytes; unsigned int ch, i; if (!hw_map) return data; chunk_bytes = count * bits_per_frame / 8; if (tmp_size < chunk_bytes) { free(tmp); tmp = (u_char *)malloc(chunk_bytes); if (!tmp) { printf(("not enough memory")); exit(1); } tmp_size = count; } src = data; dst = tmp; for (i = 0; i < count; i++) { for (ch = 0; ch < hwparams.channels; ch++) { memcpy(dst, src + sample_bytes * hw_map[ch], sample_bytes); dst += sample_bytes; } src += step; } return tmp; } u_char ** UkuiLoginSound::remap_datav(u_char **data, [[maybe_unused]] size_t count) { static u_char **tmp; unsigned int ch; if (!hw_map) return data; if (!tmp) { tmp = (u_char **)malloc(sizeof(*tmp) * hwparams.channels); if (!tmp) { printf(("not enough memory")); exit(1); } for (ch = 0; ch < hwparams.channels; ch++) tmp[ch] = data[hw_map[ch]]; } return tmp; } #else #define remap_data(data, count) (data) #define remap_datav(data, count) (data) #endif /* * write function */ ssize_t UkuiLoginSound::pcm_write(u_char *data, size_t count) { ssize_t r; ssize_t result = 0; if (count < chunk_size) { snd_pcm_format_set_silence(hwparams.format, data + count * bits_per_frame / 8, (chunk_size - count) * hwparams.channels); count = chunk_size; } data = remap_data(data, count); while (count > 0 && !in_aborting) { if (test_position) do_test_position(); check_stdin(); r = writei_func(handle, data, count); if (test_position) do_test_position(); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { if (!test_nowait) snd_pcm_wait(handle, 100); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { printf(("write error: %s"), snd_strerror(r)); prg_exit(EXIT_FAILURE); } if (r > 0) { if (vumeter) compute_max_peak(data, r * hwparams.channels); result += r; count -= r; data += r * bits_per_frame / 8; } } return result; } ssize_t UkuiLoginSound::pcm_writev(u_char **data, unsigned int channels, size_t count) { ssize_t r; size_t result = 0; if (count != chunk_size) { unsigned int channel; size_t offset = count; size_t remaining = chunk_size - count; for (channel = 0; channel < channels; channel++) snd_pcm_format_set_silence(hwparams.format, data[channel] + offset * bits_per_sample / 8, remaining); count = chunk_size; } data = remap_datav(data, count); while (count > 0 && !in_aborting) { unsigned int channel; void *bufs[channels]; size_t offset = result; for (channel = 0; channel < channels; channel++) bufs[channel] = data[channel] + offset * bits_per_sample / 8; if (test_position) do_test_position(); check_stdin(); r = writen_func(handle, bufs, count); if (test_position) do_test_position(); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { if (!test_nowait) snd_pcm_wait(handle, 100); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { printf(("writev error: %s"), snd_strerror(r)); prg_exit(EXIT_FAILURE); } if (r > 0) { if (vumeter) { for (channel = 0; channel < channels; channel++) compute_max_peak(data[channel], r); } result += r; count -= r; } } return result; } /* * read function */ ssize_t UkuiLoginSound::pcm_read(u_char *data, size_t rcount) { ssize_t r; size_t result = 0; size_t count = rcount; if (count != chunk_size) { count = chunk_size; } while (count > 0 && !in_aborting) { if (test_position) do_test_position(); check_stdin(); r = readi_func(handle, data, count); if (test_position) do_test_position(); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { if (!test_nowait) snd_pcm_wait(handle, 100); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { printf(("read error: %s"), snd_strerror(r)); prg_exit(EXIT_FAILURE); } if (r > 0) { if (vumeter) compute_max_peak(data, r * hwparams.channels); result += r; count -= r; data += r * bits_per_frame / 8; } } return rcount; } ssize_t UkuiLoginSound::pcm_readv(u_char **data, unsigned int channels, size_t rcount) { ssize_t r; size_t result = 0; size_t count = rcount; if (count != chunk_size) { count = chunk_size; } while (count > 0 && !in_aborting) { unsigned int channel; void *bufs[channels]; size_t offset = result; for (channel = 0; channel < channels; channel++) bufs[channel] = data[channel] + offset * bits_per_sample / 8; if (test_position) do_test_position(); check_stdin(); r = readn_func(handle, bufs, count); if (test_position) do_test_position(); if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) { if (!test_nowait) snd_pcm_wait(handle, 100); } else if (r == -EPIPE) { xrun(); } else if (r == -ESTRPIPE) { suspend(); } else if (r < 0) { printf(("readv error: %s"), snd_strerror(r)); prg_exit(EXIT_FAILURE); } if (r > 0) { if (vumeter) { for (channel = 0; channel < channels; channel++) compute_max_peak(data[channel], r); } result += r; count -= r; } } return rcount; } /* setting the globals for playing raw data */ void UkuiLoginSound::init_raw_data(void) { hwparams = rhwparams; } /* calculate the data count to read from/to dsp */ off64_t UkuiLoginSound::calc_count(void) { off64_t count; if (timelimit == 0) if (sampleslimit == 0) count = pbrec_count; else count = snd_pcm_format_size(hwparams.format, sampleslimit * hwparams.channels); else { count = snd_pcm_format_size(hwparams.format, hwparams.rate * hwparams.channels); count *= (off64_t)timelimit; } return count < pbrec_count ? count : pbrec_count; } void UkuiLoginSound::header(int rtype, char *name) { if (!quiet_mode) { if (! name) name = (char *)((stream == SND_PCM_STREAM_PLAYBACK) ? "stdout" : "stdin"); fprintf(stderr, "%s, ", snd_pcm_format_description(hwparams.format)); fprintf(stderr, ("Rate %d Hz, "), hwparams.rate); if (hwparams.channels == 1) fprintf(stderr, ("Mono")); else if (hwparams.channels == 2) fprintf(stderr, ("Stereo")); else fprintf(stderr, ("Channels %i"), hwparams.channels); fprintf(stderr, "\n"); } } /* playing raw data */ void UkuiLoginSound::playback_go(int fd, size_t loaded, off64_t count, int rtype, char *name) { int l, r; off64_t written = 0; off64_t c; header(rtype, name); set_params(); while (loaded > chunk_bytes && written < count && !in_aborting) { if (pcm_write(audiobuf + written, chunk_size) <= 0) return; written += chunk_bytes; loaded -= chunk_bytes; } if (written > 0 && loaded > 0) memmove(audiobuf, audiobuf + written, loaded); l = loaded; while (written < count && !in_aborting) { do { c = count - written; if (c > chunk_bytes) c = chunk_bytes; /* c < l, there is more data loaded * then we actually need to write */ if (c < l) l = c; c -= l; if (c == 0) break; r = safe_read(fd, audiobuf + l, c); if (r < 0) { perror(name); prg_exit(EXIT_FAILURE); } fdcount += r; if (r == 0) break; l += r; } while ((size_t)l < chunk_bytes); l = l * 8 / bits_per_frame; r = pcm_write(audiobuf, l); if (r != l) break; r = r * bits_per_frame / 8; written += r; l = 0; } snd_pcm_nonblock(handle, 0); snd_pcm_drain(handle); snd_pcm_nonblock(handle, nonblock); } int UkuiLoginSound::read_header(int *loaded, int header_size) { int ret; struct stat buf; ret = fstat(fd, &buf); if (ret < 0) { perror("fstat"); prg_exit(EXIT_FAILURE); } /* don't be adventurous, get out if file size is smaller than * requested header size */ if ((buf.st_mode & S_IFMT) == S_IFREG && buf.st_size < header_size) return -1; if (*loaded < header_size) { header_size -= *loaded; ret = safe_read(fd, audiobuf + *loaded, header_size); if (ret != header_size) { printf(("read error")); prg_exit(EXIT_FAILURE); } *loaded += header_size; } return 0; } int UkuiLoginSound::playback_wave(char *name, int *loaded) { ssize_t dtawave; syslog (LOG_INFO, "start play %s file...", name); if (read_header(loaded, sizeof(WaveHeader)) < 0) return -1; if ((dtawave = test_wavefile(fd, audiobuf, *loaded)) < 0) return -1; pbrec_count = calc_count(); playback_go(fd, dtawave, pbrec_count, FORMAT_WAVE, name); return 0; } int UkuiLoginSound::playback_raw(char *name, int *loaded) { syslog (LOG_INFO, "start play %s file...", name); init_raw_data(); pbrec_count = calc_count(); playback_go(fd, *loaded, pbrec_count, FORMAT_RAW, name); return 0; } /* * let's play or capture it (capture_type says VOC/WAVE/raw) */ void UkuiLoginSound::playback(char *name) { int loaded = 0; pbrec_count = LLONG_MAX; fdcount = 0; if (!name || !strcmp(name, "-")) { fd = fileno(stdin); name = "stdin"; } else { init_stdin(); if ((fd = open(name, O_RDONLY, 0)) == -1) { perror(name); prg_exit(EXIT_FAILURE); } } /* parse the file header */ if (playback_wave(name, &loaded) < 0) playback_raw(name, &loaded); /* should be raw data */ if (fd != fileno(stdin)) close(fd); } UkuiLoginSound::UkuiLoginSound() { } int UkuiLoginSound::wav_convert(int volume) { if (volume > NORMAL_VOLUME) { volume = NORMAL_VOLUME; } float volume_factor = volume/NORMAL_VOLUME; QString cmd = "ffmpeg -i "; cmd += PLAY_STARTUP_WAV; cmd += " "; cmd += QString("-filter:a volume=%1 ").arg(volume_factor); cmd += TMP_STARTUP_WAV_PATH; int err = system(cmd.toLatin1().data()); if(err) { syslog(LOG_ERR, "file convert error, err:%d.", err); return -1; } return 0; } char* UkuiLoginSound::checkPcm(char *pcmName) { void **hints, **n; char *name, *defaultPcmName; defaultPcmName = "default"; if (snd_device_name_hint(-1, "pcm", &hints) < 0) return "default"; n = hints; /* If the configuration file does not specify or does not exist, * the PCM device list is traversed to find the last PCM device * as the output device to play the system sound effect. */ while (*n != NULL) { name = snd_device_name_get_hint(*n, "NAME"); if (strcmp(pcmName, name) == 0) { return pcmName; } else if (strstr(name, "sysdefault")) { defaultPcmName = name; } n++; } snd_device_name_free_hint(hints); if (name != NULL) free(name); syslog(LOG_INFO, "system does not have %s device, so the device from %s changed to %s device", pcmName, pcmName, defaultPcmName); return defaultPcmName; } bool UkuiLoginSound::isSupportHardwareVolumeControl(char *card) { int err; snd_hctl_t* handle; snd_hctl_elem_t* elem; snd_ctl_elem_info_t* info; snd_ctl_elem_id_t* id; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); bool ret = false; if ((err = snd_hctl_open(&handle, card, 0)) < 0) { syslog(LOG_ERR, "control %s open error: %s", card, snd_strerror(err)); return ret; } if ((err = snd_hctl_load(handle)) < 0) { syslog(LOG_ERR, "control %s local error: %s", card, snd_strerror(err)); return ret; } for (elem = snd_hctl_first_elem(handle); elem; elem = snd_hctl_elem_next(elem)) { if ((err = snd_hctl_elem_info(elem, info)) < 0) { syslog(LOG_ERR, "Control %s snd_hctl_elem_info error: %s", card, snd_strerror(err)); return ret; } snd_hctl_elem_get_id(elem, id); char* str = snd_ctl_ascii_elem_id_get(id); if (strstr(str, "Volume")) { ret = true; break; } } syslog(LOG_INFO, "card %s %s hardware volume control.", card, ret ? "support" : "unsupport"); return ret; } ukui-media/ukui-login-sound/ukui_login_sound_user_config.h0000664000175000017500000000400115170054730023051 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKUILOGINSOUNDUSERCONFIG_H #define UKUILOGINSOUNDUSERCONFIG_H #include #include #include #include #include #include #include #include "../common/user_config.h" #include "../common/user_info_json.h" #include "../common/sound_effect_json.h" class UkuiLoginSoundUserConfig : public UserConfig { public: UkuiLoginSoundUserConfig(); ~UkuiLoginSoundUserConfig(); public: const QString getAutoLoginUser() const; const QString getLastLoginUser() const; std::unordered_map> getJsonMap() const; virtual void initJsonMap() override; private: void initSettings(); QString getSoundEffectFullPath(); QString getUserInfoFullPath(); private: std::unordered_map> m_keys { {JsonType::JSON_TYPE_SOUNDEFFECT, [this](){ return getSoundEffectFullPath();}}, {JsonType::JSON_TYPE_USERINFO, [this](){ return getUserInfoFullPath(); }}, }; std::unique_ptr m_pLastLoginSetting; std::unique_ptr m_pAutoLoginSetting; }; #endif // UKUILOGINSOUNDUSERCONFIG_H ukui-media/AUTHORS0000664000175000017500000000133215170052044012577 0ustar fengfengUKUI: Hao Lee MATE: Perberos Steve Zesch Stefano Karapetsas Michal Ratajsky GNOME Maintainers: Marc-Andre Lureau Bastien Nocera GNOME Authors: Andreas Hyden (grecord) Seth Nickell (gst-mixer) Ronald Bultje (gst-mixer) Thomas Vander Stichele (profiles) William Jon McCann (mate-volume-control) ukui-media/ukui-media-control-led/0000775000175000017500000000000015170054730016006 5ustar fengfengukui-media/ukui-media-control-led/ukui_media_control_led.h0000664000175000017500000000237015170054730022661 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef MATE_MEDIA_CONTROL_LED_H #define MATE_MEDIA_CONTROL_LED_H #include #include #include class UkuiMediaControlLed : public QObject { Q_OBJECT public: UkuiMediaControlLed(); ~UkuiMediaControlLed(); private slots: void outputMuteChanged(QString str); void inputMuteChanged(QString str); private: }; #endif // MATE_MEDIA_CONTROL_LED_H ukui-media/ukui-media-control-led/ukui_media_control_led.cpp0000664000175000017500000000501015170054730023206 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include UkuiMediaControlLed::UkuiMediaControlLed() { QDBusConnection::systemBus().connect(QString(),"/","org.ukui.media","systemOutputVolumeIsMute",this,SLOT(outputMuteChanged(QString))); QDBusConnection::systemBus().connect(QString(),"/","org.ukui.media","systemInputVolumeIsMute",this,SLOT(inputMuteChanged(QString))); } void UkuiMediaControlLed::outputMuteChanged(QString str) { QFile file("/sys/class/leds/platform::mute/brightness"); if(!file.exists()){ qDebug() << " THE DIRECTORY OR FILE IS NOT EXIST "; return; } qDebug() << "sink muted" << str; if (strstr(str.toLatin1().data(),"mute")) { qDebug() << "输出音é‡�é�™éŸ³"; system("echo 1 > /sys/class/leds/platform::mute/brightness"); } else if (strstr(str.toLatin1().data(),"no")) { qDebug() << "输出音é‡�å�–消é�™éŸ³"; system("echo 0 > /sys/class/leds/platform::mute/brightness"); } } void UkuiMediaControlLed::inputMuteChanged(QString str) { QFile file("/sys/class/leds/platform::micmute/brightness"); if(!file.exists()){ qDebug() << " THE DIRECTORY OR FILE IS NOT EXIST "; return; } qDebug() << "source muted" << str; if (strstr(str.toLatin1().data(),"mute")) { qDebug() << "输入音é‡�é�™éŸ³"; system("echo 1 > /sys/class/leds/platform::micmute/brightness"); } else if (strstr(str.toLatin1().data(),"no")) { qDebug() << "输入音é‡�å�–消é�™éŸ³"; system("echo 0 > /sys/class/leds/platform::micmute/brightness"); } } UkuiMediaControlLed::~UkuiMediaControlLed() { } ukui-media/ukui-media-control-led/main.cpp0000664000175000017500000000210315170054730017432 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukui_media_control_led.h" //#include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); UkuiMediaControlLed control; return a.exec(); } ukui-media/ukui-media-control-led/ukui-media-control-led.pro0000664000175000017500000000206515170052044023001 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2021-01-03T20:04:12 # #------------------------------------------------- QT += core gui dbus #greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ukui-media-control-led TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 target.path = /usr/bin SOURCES += \ main.cpp \ ukui_media_control_led.cpp HEADERS += \ ukui_media_control_led.h INSTALLS += \ target ukui-media/man/0000775000175000017500000000000015170054730012307 5ustar fengfengukui-media/man/Makefile.am0000664000175000017500000000017015170052044014335 0ustar fengfengman_MANS = ukui-volume-control.1 ukui-volume-control-applet.1 ukui-volume-control-applet-qt.1 EXTRA_DIST = $(man_MANS) ukui-media/man/ukui-media-control-led.10000664000175000017500000000206115170052044016636 0ustar fengfeng.\" Man Page for ukui-volume-control-applet-qt .TH UKUI-MEDIA-CONTROL-LED 1 "20 February 2019" "UKUI Desktop Environment" .\" Please adjust this date when revising the manpage. .\" .SH "NAME" \fBukui-media-control-led\fR \- The UKUI Volume Control Applet(Qt) .SH "SYNOPSIS" .B ukui-media-control-led [OPTIONS] .SH "DESCRIPTION" The UKUI Volume Control Applet is used for adjusting audio levels from the notification area. .SH "OPTIONS" .TP \fB\-v, \-\-version\fR Output version information and exit. .TP \fB\-d, \-\-debug\fR Enable debugging code. .TP \fB\-\-display=DISPLAY\fR X display to use. .TP \fB\-?, \-h, \-\-help\fR Print standard command line options. .TP \fB\-\-help\-all\fR Print all command line options. .SH "BUGS" .SS Should you encounter any bugs, they may be reported at: http://github.com/ukui/ukui-media/issues .SH "AUTHORS" .SS This Manual Page has been written for the UKUI Desktop Environment by: Adam Erdman (2014) .SH "SEE ALSO" .SS Further information may also be available at: http://ukui.org .BR ukui-media-control-led (1) ukui-media/man/sound-theme-player.10000664000175000017500000000066115170054730016116 0ustar fengfeng.TH sound-theme-player 1 "UKUI Media" .SH NAME sound-theme-player \- 播放 UKUI 声音主题的命令行工具 .SH SYNOPSIS .B sound-theme-player [ .I options ] .SH DESCRIPTION .B sound-theme-player 用于根æ�® UKUI 声音主题é…�置播放å�¯åЍã€�关机等æ��示音。 .SH OPTIONS 无特定命令行å�‚数。è¿�行å�ŽæŒ‰é»˜è®¤ä¸»é¢˜æ’­æ”¾æŒ‡å®šå£°éŸ³ã€‚ .SH SEE ALSO .BR ukui-login-sound (1) .SH AUTHOR Kylin Software Co., Ltd. ukui-media/man/ukui-login-sound.10000664000175000017500000000060415170054730015602 0ustar fengfeng.TH ukui-login-sound 1 "UKUI Media" .SH NAME ukui-login-sound \- 在登录会è¯�时播放æ��示音 .SH SYNOPSIS .B ukui-login-sound [ .I options ] .SH DESCRIPTION .B ukui-login-sound 在用户登录桌é�¢ä¼šè¯�时播放登录æ��示音,用于桌é�¢çŽ¯å¢ƒå�¯åЍå��馈。 .SH OPTIONS 无特定命令行å�‚数。 .SH SEE ALSO .BR sound-theme-player (1) .SH AUTHOR Kylin Software Co., Ltd. ukui-media/man/ukui-volume-control-applet-qt.10000664000175000017500000000207415170052044020235 0ustar fengfeng.\" Man Page for ukui-volume-control-applet-qt .TH UKUI-VOLUME-CONTROL-APPLET-QT 1 "20 February 2019" "UKUI Desktop Environment" .\" Please adjust this date when revising the manpage. .\" .SH "NAME" \fBukui-volume-control-applet-qt\fR \- The UKUI Volume Control Applet(Qt) .SH "SYNOPSIS" .B ukui-volume-control-qt [OPTIONS] .SH "DESCRIPTION" The UKUI Volume Control Applet is used for adjusting audio levels from the notification area. .SH "OPTIONS" .TP \fB\-v, \-\-version\fR Output version information and exit. .TP \fB\-d, \-\-debug\fR Enable debugging code. .TP \fB\-\-display=DISPLAY\fR X display to use. .TP \fB\-?, \-h, \-\-help\fR Print standard command line options. .TP \fB\-\-help\-all\fR Print all command line options. .SH "BUGS" .SS Should you encounter any bugs, they may be reported at: http://github.com/ukui/ukui-media/issues .SH "AUTHORS" .SS This Manual Page has been written for the UKUI Desktop Environment by: Adam Erdman (2014) .SH "SEE ALSO" .SS Further information may also be available at: http://ukui.org .BR ukui-volume-control (1) ukui-media/COPYING0000664000175000017500000004325415170052044012573 0ustar fengfeng GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ukui-media/audio/0000775000175000017500000000000015170054730012635 5ustar fengfengukui-media/audio/ukmedia_settings_widget.cpp0000664000175000017500000001210415170054730020241 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_settings_widget.h" #include UkmediaSettingsWidget::UkmediaSettingsWidget(QWidget *parent) : QWidget(parent) { m_pAdvancedSettingsWidget = new QFrame(this); m_pEquipmentControlWidget = new QFrame(m_pAdvancedSettingsWidget); m_pAppSoundCtrlWidget = new QFrame(m_pAdvancedSettingsWidget); m_pAdvancedSettingsWidget->setFrameShape(QFrame::Shape::Box); m_pEquipmentControlWidget->setFrameShape(QFrame::Shape::Box); m_pAppSoundCtrlWidget->setFrameShape(QFrame::Shape::Box); //高级设置标签 //~ contents_path /Audio/Advanced Settings m_pAdvancedSettingsLabel = new TitleLabel(this); m_pAdvancedSettingsLabel->setText(tr("Advanced Settings")); m_pAdvancedSettingsLabel->setContentsMargins(16,0,16,0); m_pAdvancedSettingsLabel->setStyleSheet("QLabel{color: palette(windowText);}"); //声音设备管ç�†æ ‡ç­¾ //~ contents_path /Audio/Sound Equipment Control m_pEquipmentControlLabel = new QLabel(tr("Sound Equipment Control"), m_pEquipmentControlWidget); m_pDevControlDetailsBtn = new QPushButton(m_pEquipmentControlWidget); m_pDevControlDetailsBtn->setText(tr("Details")); m_pDevControlDetailsBtn->setProperty("useButtonPalette",true); //应用声音标签 //~ contents_path /Audio/App Sound Control m_pAppSoundLabel = new QLabel(tr("App Sound Control"), m_pAppSoundCtrlWidget); m_pAppSoundDetailsBtn = new QPushButton(m_pAppSoundCtrlWidget); m_pAppSoundDetailsBtn->setText(tr("Details")); m_pAppSoundDetailsBtn->setProperty("useButtonPalette", true); //设置大å°� m_pAdvancedSettingsWidget->setMinimumSize(550,0); m_pAdvancedSettingsWidget->setMaximumSize(16777215,240); m_pEquipmentControlWidget->setMinimumSize(550,60); m_pEquipmentControlWidget->setMaximumSize(16777215,60); m_pAppSoundCtrlWidget->setMinimumSize(550,60); m_pAppSoundCtrlWidget->setMaximumSize(16777215,60); //声音设备管控 QHBoxLayout *EquipmentControlLayout = new QHBoxLayout(m_pEquipmentControlWidget); EquipmentControlLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); EquipmentControlLayout->addWidget(m_pEquipmentControlLabel); EquipmentControlLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); EquipmentControlLayout->addWidget(m_pDevControlDetailsBtn); EquipmentControlLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); EquipmentControlLayout->setSpacing(0); m_pEquipmentControlWidget->setLayout(EquipmentControlLayout); m_pEquipmentControlWidget->layout()->setContentsMargins(0,0,0,0); //应用声音 QHBoxLayout *AppSoundLayout = new QHBoxLayout(m_pAppSoundCtrlWidget); AppSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); AppSoundLayout->addWidget(m_pAppSoundLabel); AppSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); AppSoundLayout->addWidget(m_pAppSoundDetailsBtn); AppSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); AppSoundLayout->setSpacing(0); m_pAppSoundCtrlWidget->setLayout(AppSoundLayout); m_pAppSoundCtrlWidget->layout()->setContentsMargins(0,0,0,0); //设备管控和应用声音添加布局 QVBoxLayout *m_pVlayout1 = new QVBoxLayout(m_pAdvancedSettingsWidget); m_pVlayout1->setContentsMargins(0,0,0,0); m_pVlayout1->addWidget(m_pEquipmentControlWidget); m_pVlayout1->addWidget(myLine()); m_pVlayout1->addWidget(m_pAppSoundCtrlWidget); m_pVlayout1->setSpacing(0); m_pAdvancedSettingsWidget->setLayout(m_pVlayout1); m_pAdvancedSettingsWidget->layout()->setContentsMargins(0,0,0,0); //整体布局 QVBoxLayout *vLayout1 = new QVBoxLayout(this); vLayout1->addWidget(m_pAdvancedSettingsLabel); vLayout1->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed)); vLayout1->addWidget(m_pAdvancedSettingsWidget); this->setLayout(vLayout1); this->layout()->setContentsMargins(0,0,0,0); } QFrame* UkmediaSettingsWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } UkmediaSettingsWidget::~UkmediaSettingsWidget() { } ukui-media/audio/ukmedia_output_widget.h0000664000175000017500000000535515170054730017420 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIAOUTPUTWIDGET_H #define UKMEDIAOUTPUTWIDGET_H #include #include #include #include #include #include #include #include #include #include "ukui_custom_style.h" #include "ukui_list_widget_item.h" #include "customstyle.h" #include #include #include "kswitchbutton.h" #include using namespace kdk; class UkmediaOutputWidget : public QWidget { Q_OBJECT public: explicit UkmediaOutputWidget(QWidget *parent = nullptr); ~UkmediaOutputWidget(); void setVolumeSliderRange(bool status); friend class UkmediaMainWidget; Q_SIGNALS: public Q_SLOTS: void onPaletteChanged(); private: void setLabelAlignment(Qt::Alignment alignment); QFrame* myLine(); private: QFrame *m_pOutputWidget; QFrame *m_pMasterVolumeWidget; QFrame *m_pVolumeIncreaseWidget; QWidget *VolumeIncreaseTipsWidget; QFrame *m_pAudioBlanceWidget; //monoAudio QFrame *m_pMonoAudioWidget; QFrame *m_pChannelBalanceWidget; QFrame *m_pMonoLine; QWidget *MonoAudioTipsWidget; FixLabel *m_pMonoAudioLabel; FixLabel *MonoAudioTipsLabel; KSwitchButton *m_pMonoAudioButton; TitleLabel *m_pOutputLabel; FixLabel *m_pOutputDeviceLabel; FixLabel *m_pOpVolumeLabel; QLabel *m_pOpVolumePercentLabel; FixLabel *m_pOpBalanceLabel; FixLabel *VolumeIncreaseTipsLabel; FixLabel *m_pLeftBalanceLabel; FixLabel *m_pRightBalanceLabel; FixLabel *m_pVolumeIncreaseLabel; QComboBox *m_pDeviceSelectBox; QFrame *m_pOutputSlectWidget; UkuiButtonDrawSvg *m_pOutputIconBtn; AudioSlider *m_pOpVolumeSlider; UkmediaVolumeSlider *m_pOpBalanceSlider; KSwitchButton *m_pVolumeIncreaseButton; QVBoxLayout *m_pVlayout; QString sliderQss; }; #endif // UKMEDIAOUTPUTWIDGET_H ukui-media/audio/audio.cpp0000664000175000017500000000463115170052044014442 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "audio.h" #include "ui_audio.h" #include #include #include Audio::Audio() : mFirstLoad(true) { #ifndef QT_NO_TRANSLATION QString translatorFileName = QLatin1String("qt_"); translatorFileName += QLocale::system().name(); QTranslator *pTranslator = new QTranslator(); if (pTranslator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) QApplication::installTranslator(pTranslator); #endif QTranslator *translator = new QTranslator(this); translator->load("/usr/share/ukui-media/translations/audio/" + QLocale::system().name()); QApplication::installTranslator(translator); pluginName = tr("Audio"); pluginType = SYSTEM; } Audio::~Audio() { } QString Audio::plugini18nName() { return pluginName; } int Audio::pluginTypes() { return pluginType; } QWidget *Audio::pluginUi() { if (mFirstLoad) { mFirstLoad = false; widget = new UkmediaMainWidget; } return widget; } bool Audio::isEnable() const { return true; } const QString Audio::name() const { return QStringLiteral("Audio"); } bool Audio::isShowOnHomePage() const { return true; } QIcon Audio::icon() const { return QIcon::fromTheme("audio-volume-high-symbolic"); } QString Audio::translationPath() const { return "/usr/share/ukui-media/translations/audio/%1.ts"; } void Audio::initSearchText() { //~ contents_path /UkccPlugin/UkccPlugin tr("UkccPlugin"); //~ contents_path /UkccPlugin/ukccplugin test tr("ukccplugin test"); } ukui-media/audio/customstyle.cpp0000664000175000017500000003637515170054730015752 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "customstyle.h" #include #include #include #include CustomStyle::CustomStyle(const QString &proxyStyleName, QObject *parent) : QProxyStyle (proxyStyleName) { Q_UNUSED(parent); m_helpTip = new SliderTipLabelHelper(this); } CustomStyle::~CustomStyle() { } void CustomStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const { if(control == CC_ToolButton) { /// 我们需è¦�获å�–ToolButton的详细信æ�¯ï¼Œé€šè¿‡qstyleoption_castå�¯ä»¥å¾—到 /// 对应的option,通过拷è´�构造函数得到一份备份用于绘制å­�控件 /// 我们一般ä¸�用在æ„�option是怎么得到的,大部分的Qt控件都能够æ��供了optionçš„init方法 } return QProxyStyle::drawComplexControl(control, option, painter, widget); } void CustomStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { case CE_ProgressBar: { if (const QStyleOptionProgressBar *pb = qstyleoption_cast(option)) { QStyleOptionProgressBar subopt = *pb; subopt.rect = subElementRect(SE_ProgressBarGroove, pb, widget); proxy()->drawControl(CE_ProgressBarGroove, &subopt, painter, widget); subopt.rect = subElementRect(SE_ProgressBarContents, pb, widget); proxy()->drawControl(CE_ProgressBarContents, &subopt, painter, widget); //这是这个控件的当å‰�进度的文字,你那边看情况是å�¦éœ€è¦�绘制 // if (pb->textVisible) { // subopt.rect = subElementRect(SE_ProgressBarLabel, pb, widget); // proxy()->drawControl(CE_ProgressBarLabel, &subopt, painter, widget); // } return; } break; } case CE_ProgressBarGroove: { //这是这个控件的背景,你那边看情况是å�¦ç»˜åˆ¶ return; if (const QStyleOptionProgressBar *pbg = qstyleoption_cast(option)) { const bool enable = pbg->state &State_Enabled; painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); painter->setBrush(pbg->palette.brush(enable ? QPalette::Active : QPalette::Disabled, QPalette::Window)); painter->drawRect(pbg->rect); painter->restore(); return; } break; } case CE_ProgressBarContents: { if (const QStyleOptionProgressBar *bar = qstyleoption_cast(option)) { if (bar->progress == bar->maximum) return; const bool enable = bar->state & QStyle::State_Enabled; bool vertical = false; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) if (widget) { const QProgressBar *progressBar = qobject_cast(widget); if (progressBar) { vertical = (progressBar->orientation() == Qt::Vertical); } } #else vertical = (bar->orientation == Qt::Vertical); #endif const bool inverted = bar->invertedAppearance; qint64 minimum = qint64(bar->minimum); qint64 maximum = qint64(bar->maximum); qint64 progress = qint64(bar->progress); qint64 totalSteps = qMax(Q_INT64_C(1), maximum - minimum); qint64 progressSteps = progress - bar->minimum; qint64 progressBarWidth = progressSteps * (vertical ? bar->rect.height() : bar->rect.width()) / totalSteps; int ProgressBarItem_Width = 4; int ProgressBarItem_Distance = 16; int distance = ProgressBarItem_Distance + ProgressBarItem_Width; int num = progressBarWidth / distance; int totalnum = (vertical ? bar->rect.height() : bar->rect.width()) / distance; bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical; if (inverted) reverse = !reverse; int ProgressBarItem_Hight = 16; QRect drawRect(bar->rect); if (vertical) { drawRect.setWidth(ProgressBarItem_Hight); } else { drawRect.setHeight(ProgressBarItem_Hight); } drawRect.moveCenter(bar->rect.center()); QRect itemRect(drawRect); painter->save(); painter->setPen(Qt::NoPen); painter->setRenderHints(QPainter::Antialiasing, true); for (int var = 0; var < totalnum; ++var) { if (var < num) { if (enable) painter->setBrush(bar->palette.brush(QPalette::Active, QPalette::Highlight)); else { #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) painter->setBrush(bar->palette.color(QPalette::Active, QPalette::Highlight).lighter(150)); #else painter->setBrush(bar->palette.color(QPalette::Active, QPalette::Highlight).light(150)); #endif } } else { painter->setBrush(bar->palette.brush(enable ? QPalette::Active : QPalette::Disabled, QPalette::Button)); } if (vertical) itemRect.setRect(drawRect.left(), !reverse ? drawRect.top() + var * distance : drawRect.bottom() - ProgressBarItem_Width - var * distance, drawRect.width(), ProgressBarItem_Width); else itemRect.setRect(reverse ? drawRect.right() - ProgressBarItem_Width - var * distance : drawRect.left() + var * distance, drawRect.top(), ProgressBarItem_Width, drawRect.height()); painter->drawRoundedRect(itemRect, ProgressBarItem_Width/2, ProgressBarItem_Width/2); } painter->restore();; return; } break; } default: break; } return QProxyStyle::drawControl(element, option, painter, widget); } void CustomStyle::drawItemPixmap(QPainter *painter, const QRect &rectangle, int alignment, const QPixmap &pixmap) const { return QProxyStyle::drawItemPixmap(painter, rectangle, alignment, pixmap); } void CustomStyle::drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette, bool enabled, const QString &text, QPalette::ColorRole textRole) const { return QProxyStyle::drawItemText(painter, rectangle, alignment, palette, enabled, text, textRole); } //绘制简å�•的颜色圆角等 void CustomStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { switch (element) { //绘制 ToolButton case PE_PanelButtonTool:{ painter->save(); painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0xff,0x00)); painter->drawRoundedRect(option->rect,4,4); if (option->state & State_MouseOver) { if (option->state & State_Sunken) { painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0xff,0x14)); painter->drawRoundedRect(option->rect,4,4); qDebug() << " 点击按钮"; } else { painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0xff,0x1f)); painter->drawRoundedRect(option->rect,4,4); qDebug() << "悬å�œæŒ‰é’®"; } } painter->restore(); return; } case PE_PanelTipLabel:{ painter->save(); painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0x00,0xff)); painter->drawRoundedRect(option->rect,4,4); painter->restore(); return; }break; case PE_PanelButtonCommand:{ painter->save(); painter->setRenderHint(QPainter::TextAntialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0xff,0x00)); if (option->state & State_MouseOver) { if (option->state & State_Sunken) { painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0x3d,0x6b,0xe5,0xff)); painter->drawRoundedRect(option->rect,4,4); } else { painter->setRenderHint(QPainter::Antialiasing,true); painter->setPen(Qt::NoPen); painter->setBrush(QColor(0xff,0xff,0xff,0x1f)); painter->drawRoundedRect(option->rect.adjusted(2,2,-2,-2),4,4); } } painter->restore(); return; }break; } return QProxyStyle::drawPrimitive(element, option, painter, widget); } QPixmap CustomStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *option) const { return QProxyStyle::generatedIconPixmap(iconMode, pixmap, option); } QStyle::SubControl CustomStyle::hitTestComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, const QPoint &position, const QWidget *widget) const { return QProxyStyle::hitTestComplexControl(control, option, position, widget); } QRect CustomStyle::itemPixmapRect(const QRect &rectangle, int alignment, const QPixmap &pixmap) const { return QProxyStyle::itemPixmapRect(rectangle, alignment, pixmap); } QRect CustomStyle::itemTextRect(const QFontMetrics &metrics, const QRect &rectangle, int alignment, bool enabled, const QString &text) const { return QProxyStyle::itemTextRect(metrics, rectangle, alignment, enabled, text); } // int CustomStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const { switch (metric){ case PM_ProgressBarChunkWidth: { int ProgressBarItem_Width = 4; int ProgressBarItem_Distance = 16; return ProgressBarItem_Width + ProgressBarItem_Distance; } case PM_ToolBarIconSize:{ return (int)48*qApp->devicePixelRatio(); } default: break; } return QProxyStyle::pixelMetric(metric, option, widget); } // void CustomStyle::polish(QWidget *widget) { if (widget) { if (widget->inherits("QTipLabel")) { widget->setAttribute(Qt::WA_TranslucentBackground); QPainterPath path; auto rect = widget->rect(); rect.adjust(0,0,0,0); path.addRoundedRect(rect,6,6); widget->setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); } } if (widget) { if (widget->inherits("QLable")) { const_cast (widget)->setAttribute(Qt::WA_TranslucentBackground); widget->setAttribute(Qt::WA_TranslucentBackground); QPainterPath path; auto rect = widget->rect(); rect.adjust(0,0,0,0); path.addRoundedRect(rect,6,6); widget->setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); } } if (widget){ widget->setAttribute(Qt::WA_Hover); widget->inherits("QSlider"); m_helpTip->registerWidget(widget); widget->installEventFilter(this); } return QProxyStyle::polish(widget); } void CustomStyle::polish(QApplication *application) { return QProxyStyle::polish(application); } // void CustomStyle::polish(QPalette &palette) { // return QProxyStyle::polish(palette); // QProxyStyle::polish(palette); // palette.setBrush(QPalette::Foreground, Qt::black); QColor lightBlue(200, 0, 0); palette.setBrush(QPalette::Highlight, lightBlue); } void CustomStyle::unpolish(QWidget *widget) { return QProxyStyle::unpolish(widget); } void CustomStyle::unpolish(QApplication *application) { return QProxyStyle::unpolish(application); } QSize CustomStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const { QSize newSize = contentsSize; switch (type) { case CT_ProgressBar: { qDebug()<pixelMetric(QStyle::PM_ProgressBarChunkWidth, option, widget); newSize.setWidth(cw * ProgressBarItem_Num); return newSize; } default: break; } return QProxyStyle::sizeFromContents(type, option, contentsSize, widget); } QIcon CustomStyle::standardIcon(QStyle::StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const { return QProxyStyle::standardIcon(standardIcon, option, widget); } QPalette CustomStyle::standardPalette() const { return QProxyStyle::standardPalette(); } //如果需è¦�背景é€�明也许需è¦�用到这个函数 int CustomStyle::styleHint(QStyle::StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const { switch (hint) { /// 让ScrollView viewport的绘制区域包å�«scrollbarå’Œcorner widget /// 这个例å­�中没有什么作用,如果我们需è¦�绘制一个背景é€�明的滚动æ�¡ /// 这个style hint对我们的æ„�义应该很大,因为我们希望视图能够帮助 /// 我们填充滚动æ�¡çš„背景区域,å�¦åˆ™å½“背景é€�明时底下会出现明显的分割 case SH_ScrollView_FrameOnlyAroundContents: { return false; } default: break; } return QProxyStyle::styleHint(hint, option, widget, returnData); } QRect CustomStyle::subControlRect(QStyle::ComplexControl control, const QStyleOptionComplex *option, QStyle::SubControl subControl, const QWidget *widget) const { return QProxyStyle::subControlRect(control, option, subControl, widget); } QRect CustomStyle::subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const { switch (element) { case SE_ProgressBarGroove: case SE_ProgressBarContents: return option->rect; default: break; } return QProxyStyle::subElementRect(element, option, widget); } ukui-media/audio/translations/0000775000175000017500000000000015170054730015356 5ustar fengfengukui-media/audio/translations/ky.ts0000664000175000017500000007354615170054730016370 0ustar fengfeng Audio Audio دووش UkccPlugin ukccplugin سىنىعى /UkccPlugin/UkccPlugin ukccplugin test ukccplugin سىنىعى /UkccPlugin/ukccplugin test InputDevWidget Input Devices كىرگىزۉۉ جابدۇۇلار. Confirm البەتتە. OutputDevWidget Output Devices ۅندۉرۉش جابدۇۇلار. Confirm البەتتە. QObject pa_context_get_server_info() failed pa_context_get_server_info() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ Card callback failure كارتوچكا قايتارۇۇ جەڭىلۉۉ بولدۇ Sink callback failure قايتما ۅندۉرۉش جەڭىلۉۉ بولۇش Source callback failure قايتما كىرگىزۉۉ جەڭىلۉۉ بولدۇ Sink input callback failure Ú†Û…Ú¯Û‰Ù¾ باراتات. قايتما كىرگىزۉۉ جەڭىلۉۉ بولدۇ Source output callback failure ÙƒÛ•Ù„Û‰Û‰ جەر جانى ۅندۉرۉش قايتما تەڭشۅۅ جەڭىلۉۉ بولدۇ Client callback failure تىرمىنال قايتما تەڭشەگى جەڭىلۉۉ بولدۇ Server info callback failure مۇلازىمەتىر قايتما تەڭشەگى جەڭىلۉۉ بولدۇ Failed to initialize stream_restore extension: %s stream_restore نى Ú†Û•Ú†Û‰Û‰ جەڭىلۉۉ بولدۇ : Ùªs pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ Failed to initialize device manager extension: %s شايمان باشقارعىچتى كەڭەيتۉۉنۉ العاچىنا كەتىرىش جەڭىلۉۉ بولدۇ : Ùªs pa_ext_device_manager_read() failed pa_ext_device_manager_read() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_client_info() failed pa_context_get_client_info() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_subscribe() failed pa_context_subscribe() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_client_info_list() failed pa_context_client_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_card_info_list() failed pa_context_get_card_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_source_info_list() failed pa_context_get_source_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ Ukui Media Volume Control Ukui Media دووش كونتىرول جاسوو ،اتقارۇۇ UkmediaAppCtrlWidget App Sound Control تىركەمە دووش تىزگىندۅۅ جاسوو ،اتقارۇۇ پىروگىرامماسى None جوق System Volume ساامالىق وبونۇ UkmediaAppItemWidget Application پراگرامما Output Volume ۅندۉرۉش Û…Ù„Ú†Û…Ù…Û‰ Input Device كىيىرگىچ This case does not support setting the input device بۇل تۉر مۇرۇن .جاعداي كىرگىزگىچتى تەڭشەشتى قولدوبويت Output Device ۅندۉرۉش جابدۇۇسۇن تانداش This case does not support setting the output device بۇل تۉر مۇرۇن .جاعداي ۅندۉرۉش جابدۇۇسۇن تەڭشەشتى قولدوبويت Confirm البەتتە. UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control دووش جابدۇۇلار. تىزگىندۅۅ جاسوو ،اتقارۇۇ Output Devices ۅندۉرۉش جابدۇۇلار. Input Devices كىرگىزۉۉ جابدۇۇلار. UkmediaInputWidget Input كىرگىز /Audio/Input Input Device كىيىرگىچ /Audio/Input Device Volume ÙƒÛ…Ù„Û…Ù…Û‰ /Audio/Volume Input Level كىرگىزۉۉ ئنكاسى /Audio/Input Level Noise Reduction ىزى-Ú†Û‡Û‡ اپتوماتتىك تۅمۅندۅتۉۉ /Audio/Noise Reduction Voice Monitor دووش كۉزۅتكۉچ /audio/Voice Monitor (None Device) (شايمان جوق) You can hear your voice in the output device of your choice سىز ۅزۉڭۉز تاندالعان ۅندۉرۉش اسپابىنان ابازىڭىزدى ۇعا الاسىز UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom ۅزۉ بەكىتۉۉ None جوق UkmediaOutputWidget Output چىعۇۇ /Audio/Output Output Device ۅندۉرۉش جابدۇۇسۇن تانداش /Audio/Output Device Master Volume دووش /Audio/Master Volume Balance جارىقتىق تەڭپۇڭلۇقىنى تەڭشۅۅ /Audio/Balance Left سولعو Right ÙˆÚ­ تاراپ Volume Increase دووشتۇ جوعورۇلاتۇۇ Volume above 100% can cause sound distortion and damage your speakers. وبونۇ Ùª100 تىن جوعورۇ دووش بۇرۇلۇش كەلىترىپ چىعارات، قانايعا زىيان جەتگۉزۉلەت. Mono Audio مونو دوبۇش It merges the left and right channels into one channel. ال ÙˆÚ­-سول قانالدار بىر لەشتىرىپ بىر قانالعا الماشتىرات . UkmediaSettingsWidget Advanced Settings جوعورۇ تەڭشەكتەر Sound Equipment Control دووش جابدۇۇلار. تىزگىندۅۅ جاسوو ،اتقارۇۇ /Audio/Sound Equipment Control Details Ù‰Ú†ÙƒÛ•Ù„Û•ÙŠ ØŒ قۇنت قويۇپ ماتىرىيال App Sound Control تىركەمە دووش تىزگىندۅۅ جاسوو ،اتقارۇۇ پىروگىرامماسى /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound ساامالىق دووش Û…Ù†Û‰Ù…Û‰ Sound Theme دووش تەماسى /Audio/Sound Theme Beep Switch ەسكەرتۉۉ وبونۇ /Audio/Beep Switch Poweroff Music بەكىتىش /Audio/Poweroff Music Startup Music اچۇۇ /Audio/Startup Music Wakeup Music ويعونۇۇ. /Audio/Wakeup Music Notification Sound ۇقتۇرۇۇ وبونۇ /Audio/Notification Sound Volume Control Sound دووشتۇ تىزگىندۅۅ جاسوو ،اتقارۇۇ وبونۇ /Audio/Volume Control Sound Logout Music تىزىمدىكىتىن ۅچۉرۉۉ /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index() جەڭىلۉۉ بولدۇ pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_default_sink() failed pa_context_set_default_sink() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_default_source() failed pa_context_set_default_source() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ (plugged in) ( قاتىشقان) (unavailable) (ىشتەتكەلى بولبويت ) (unplugged) ۇلانبادى Failed to read data from stream اعىمدان ساندۇۇ باياندامالاردى وقۇۇ جەڭىلۉۉ بولدۇ Peak detect چوقۇ نارق تەكشەرىش Failed to create monitoring stream كۉزۅتۉۉ اعىمى قۇرۇۇ جەڭىلۉۉ بولدۇ Failed to connect monitoring stream كۉزۅتۉۉ اعىمدى ۇلوو جەڭىلۉۉ بولدۇ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Ú†Û…Ú¯Û‰Ù¾ باراتات. نارق كىرگىزۉۉ نازاردان ساق اتقارىلدى ØŒ انتكەنى ال بىر وقۇيالۇۇ دەپ بەكىتىلدى، وشوعو وقۇيالۇۇنىڭ كىچىك بۅلۅگۉ ووردۇندا بىر تەرەپ اتقارىلدى pa_context_kill_source_output() failed pa_context_kill_source_output() جەڭىلۉۉ بولدۇ Establishing connection to PulseAudio. Please wait... PulseAudio نىڭ ۇلانۇۇسۇ قۇرۇلۇپ جاتات، سەل ساقتاپ تۇرۇڭ ukui-media/audio/translations/zh_CN.ts0000664000175000017500000006236315170054730016741 0ustar fengfeng Audio Audio 声音 UkccPlugin /UkccPlugin/UkccPlugin ukccplugin test /UkccPlugin/ukccplugin test InputDevWidget Input Devices 输入设备 Confirm 确认 OutputDevWidget Output Devices 输出设备 Confirm 确认 QObject pa_context_get_server_info() failed Card callback failure Sink callback failure Source callback failure Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_get_card_info_by_index() failed pa_context_subscribe() failed pa_context_client_info_list() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed Ukui Media Volume Control UkmediaAppCtrlWidget App Sound Control 应用声音 None æ—  System Volume 系统 UkmediaAppItemWidget Application 应用 Output Volume 输出音é‡� Input Device 输入设备 This case does not support setting the input device 该情况ä¸�支æŒ�设置输入设备 Output Device 输出设备 This case does not support setting the output device 该情况ä¸�支æŒ�设置输出设备 Confirm 确认 UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control 声音设备管ç�† Output Devices 输出设备 Input Devices 输入设备 UkmediaInputWidget Input 输入 /Audio/Input Input Device 选择输入设备 /Audio/Input Device Volume 音é‡� /Audio/Volume Input Level 音é‡�å��馈 /Audio/Input Level Noise Reduction 智能é™�噪 /Audio/Noise Reduction Voice Monitor 侦å�¬æ­¤è®¾å¤‡ /audio/Voice Monitor (None Device) (无设备) You can hear your voice in the output device of your choice å�¯åœ¨æ‰€é€‰è¾“出设备中å�¬åˆ°è‡ªå·±çš„声音 UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom 自定义 None æ—  UkmediaOutputWidget Output 输出 /Audio/Output Output Device 选择输出设备 /Audio/Output Device Master Volume 音é‡� /Audio/Master Volume Balance 声é�“平衡 /Audio/Balance Left å·¦ Right å�³ Volume Increase 音é‡�增强 Volume above 100% can cause sound distortion and damage your speakers. 音é‡�超过100%æ—¶å�¯èƒ½ä¼šå¯¼è‡´éŸ³æ•ˆå¤±çœŸå¹¶æ�Ÿå®³ä½ çš„æ‰¬å£°å™¨ã€‚ Mono Audio å�•声é�“音频 It merges the left and right channels into one channel. 会将左声é�“å’Œå�³å£°é�“å�ˆå¹¶æˆ�一个声é�“ UkmediaSettingsWidget Advanced Settings 高级设置 Sound Equipment Control 声音设备管ç�† /Audio/Sound Equipment Control Details 详情 App Sound Control 应用声音 /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound 系统音效 Sound Theme 音效主题 /Audio/Sound Theme Beep Switch æ��示音 /Audio/Beep Switch Poweroff Music 关机 /Audio/Poweroff Music Startup Music 开机 /Audio/Startup Music Wakeup Music 唤醒 /Audio/Wakeup Music Notification Sound 接收通知 /Audio/Notification Sound Volume Control Sound 音é‡�调节 /Audio/Volume Control Sound Logout Music 注销 /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... ukui-media/audio/translations/kk.ts0000664000175000017500000007162315170054730016344 0ustar fengfeng Audio Audio Û‡Ù† UkccPlugin مىندەتتى ستونى /UkccPlugin/UkccPlugin ukccplugin test ukccplugin سىنىعى /UkccPlugin/ukccplugin test InputDevWidget Input Devices كىرگىزۋ اسباپتارى Confirm تۇراقتاندىرۋ OutputDevWidget Output Devices جاريالاۋ اسباپتارى Confirm تۇراقتاندىرۋ QObject pa_context_get_server_info() failed pa_context_get_server_info() اتقار ەتۋ جەڭىلىپ قالدى Card callback failure قاريتا قايتارىپ ەتۋ جەڭىلىپ قالدى Sink callback failure قايتتما جاريالاۋ جەڭىلىپ بولۋ Source callback failure قايتتما كىرگىزۋ جەڭىلىپ قالدى Sink input callback failure چۆكمە قايتتما كىرگىزۋ جەڭىلىپ قالدى Source output callback failure قاينار جاريالاۋ قايتتما تەڭشەۋ جەڭىلىپ قالدى Client callback failure سوڭعٸ ۇشٸ قايتتما تەڭگەرگٸش جەڭىلىپ قالدى Server info callback failure قىزىمەت وتەۋ اسبابى قايتتما تەڭگەرگٸش جەڭىلىس قالدى Failed to initialize stream_restore extension: %s stream_restore نى جايۋ جەڭىلىس قالدى: Ùªs pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() اتقار ەتۋ جەڭىلىپ قالدى Failed to initialize device manager extension: %s اسباب باسقارۋشنى كەڭەيتۋدى قالپىنا قايتارۋ جەڭىلىپ قالدى: Ùªs pa_ext_device_manager_read() failed pa_ext_device_manager_read() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_client_info() failed pa_context_get_client_info() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_subscribe() failed pa_context_subscribe() اتقار ەتۋ جەڭىلىپ قالدى pa_context_client_info_list() failed pa_context_client_info_list() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_card_info_list() failed pa_context_get_card_info_list() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_source_info_list() failed pa_context_get_source_info_list() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() اتقار ەتۋ جەڭىلىپ قالدى Ukui Media Volume Control Ukui Media اۋا كونتىرول ەتۋ UkmediaAppCtrlWidget App Sound Control جيۋ اۋا مەڭگەرۋ ەتۋ پٸروگٸرامماسٸ None جوق System Volume سەستيما داۋىسى UkmediaAppItemWidget Application قولدانعىش Output Volume جاريالاۋ كولەمى Input Device كىرگىزۋ اسپابٸ This case does not support setting the input device Ù†Û‡ ٴتۇر احاۋل كىرگىزۋ اسپابىن تەڭشەۋدٸ قولدامايدى Output Device جاريالاۋ اسبابٸن تالداۋ This case does not support setting the output device Ù†Û‡ ٴتۇر احاۋل جاريالاۋ اسبابٸن تەڭشەۋدٸ قولدامايدى Confirm تۇراقتاندىرۋ UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control اۋا جابدىقتارىن مەڭگەرۋ ەتۋ Output Devices جاريالاۋ اسباپتارى Input Devices كىرگىزۋ اسباپتارى UkmediaInputWidget Input كىرگىزۋ /Audio/Input Input Device كىرگىزۋ اسپابٸ /Audio/Input Device Volume كولەمى /Audio/Volume Input Level كىرگىزۋ جاۋاب قايتارۋٸ /Audio/Input Level Noise Reduction شۋىل اۆتوماتتى تومەندەتۋ /Audio/Noise Reduction Voice Monitor اۋا كۇزەتۋشى /audio/Voice Monitor (None Device) (اسباب جوق) You can hear your voice in the output device of your choice ٴسىز ٶزٸڭٸز تالداعان جاريالاۋ اسپابىنان داۋسىڭىزدى ئاڭلىيالايٴسىز UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom ٶزى بەلگٸلەۋ None جوق UkmediaOutputWidget Output جاريالاۋ /Audio/Output Output Device جاريالاۋ اسبابٸن تالداۋ /Audio/Output Device Master Volume اۋا /Audio/Master Volume Balance جارىقتىق تەپە-تەڭدىك تەڭشەۋ /Audio/Balance Left سول Right ÙˆÚ­ جاق Volume Increase دٸبٸستٸ جوعارتىلۋ Volume above 100% can cause sound distortion and damage your speakers. داۋىسى Ùª100 تىن جوعارعى اۋا بۇرىلۋ كەتىرىپ شٸعارادٸ، كانايگا زيان جەتكىزەدى. Mono Audio مونو Û‡Ù† It merges the left and right channels into one channel. ول ÙˆÚ­-سول كانالداردى بٸرلەستٸرٸپ بٸر كانالعا ايلاندٸرادٸ. UkmediaSettingsWidget Advanced Settings جوعارى تەڭشەۋلەر Sound Equipment Control اۋا جابدىقتارىن مەڭگەرۋ ەتۋ /Audio/Sound Equipment Control Details ناقتى مازمۇنى App Sound Control جيۋ اۋا مەڭگەرۋ ەتۋ پٸروگٸرامماسٸ /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound سەستيما اۋا ٶنىمى Sound Theme اۋا تەمەسى /Audio/Sound Theme Beep Switch ەسكەرتپەۋ داۋىسى /Audio/Beep Switch Poweroff Music تاقاۋ /Audio/Poweroff Music Startup Music ٸشٸۋ /Audio/Startup Music Wakeup Music ويانۋ /Audio/Wakeup Music Notification Sound ۇقتٸرۋ داۋىسى /Audio/Notification Sound Volume Control Sound دٸبٸستٸ مەڭگەرۋ ەتۋ داۋىسى /Audio/Volume Control Sound Logout Music تٸزٸمدەن ٴوشىرۋ /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index() جەڭىلىپ قالدى pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_default_sink() failed pa_context_set_default_sink() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_default_source() failed pa_context_set_default_source() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() اتقار ەتۋ جەڭىلىپ قالدى pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() اتقار ەتۋ جەڭىلىپ قالدى (plugged in) (شارپىلدى) (unavailable) (ٸستەتكەلٸ بولمايدى) (unplugged) جالعاۋنبادٸ Failed to read data from stream اعىمنان ساندىق مالىمەتتەردى وقۋ جەڭىلىپ قالدى Peak detect شوقى ٴمان تەكسەرۋ Failed to create monitoring stream كۇزەتۋگە اعٸمٸ قۇرۋ جەڭىلىپ قالدى Failed to connect monitoring stream كۇزەتۋگە مەنى اۋلاۋ جەڭىلىپ قالدى Ignoring sink-input due to it being designated as an event and thus handled by the Event widget چۆكمە ٴمان كىرگىزۋ نازاردان ساقتانۋ قىلىندى، ۇيتكەنٸ ول بٸر ۋاقىيعالىقتى دوپ بەكٸتٸلدٸ، سوندىقتان ۋاقىيعالىقتىنىڭ كشكەنە بولەك ورٸندا بٸرتەرەپ قىلىندى pa_context_kill_source_output() failed pa_context_kill_source_output() جەڭىلىپ قالدى Establishing connection to PulseAudio. Please wait... PulseAudio نىڭ ورنالاسٸۋٸ جاسالىپ جاتىر، سەل ساقتاپ تۇر ukui-media/audio/translations/ms.ts0000664000175000017500000006272415170054730016360 0ustar fengfeng Audio Audio UkccPlugin /UkccPlugin/UkccPlugin ukccplugin test /UkccPlugin/ukccplugin test InputDevWidget Input Devices Confirm OutputDevWidget Output Devices Confirm QObject pa_context_get_server_info() failed Card callback failure Sink callback failure Source callback failure Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_get_card_info_by_index() failed pa_context_subscribe() failed pa_context_client_info_list() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed Ukui Media Volume Control UkmediaAppCtrlWidget App Sound Control None System Volume UkmediaAppItemWidget Application Output Volume Input Device This case does not support setting the input device Output Device This case does not support setting the output device Confirm UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control Output Devices Input Devices UkmediaInputWidget Input /Audio/Input Input Device /Audio/Input Device Volume /Audio/Volume Input Level /Audio/Input Level Noise Reduction /Audio/Noise Reduction Voice Monitor /audio/Voice Monitor (None Device) You can hear your voice in the output device of your choice UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom None UkmediaOutputWidget Output /Audio/Output Output Device /Audio/Output Device Master Volume /Audio/Master Volume Balance /Audio/Balance Left Right Volume Increase Volume above 100% can cause sound distortion and damage your speakers. Mono Audio It merges the left and right channels into one channel. UkmediaSettingsWidget Advanced Settings Sound Equipment Control /Audio/Sound Equipment Control Details App Sound Control /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound Sound Theme /Audio/Sound Theme Beep Switch /Audio/Beep Switch Poweroff Music /Audio/Poweroff Music Startup Music /Audio/Startup Music Wakeup Music /Audio/Wakeup Music Notification Sound /Audio/Notification Sound Volume Control Sound /Audio/Volume Control Sound Logout Music /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... ukui-media/audio/translations/tr.ts0000664000175000017500000006055315170054730016364 0ustar fengfeng Audio Audio UkccPlugin /UkccPlugin/UkccPlugin ukccplugin test /UkccPlugin/ukccplugin test InputDevWidget Input Devices confirm OutputDevWidget Output Devices Confirm QObject pa_context_get_server_info() failed Card callback failure Sink callback failure Source callback failure Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_get_card_info_by_index() failed pa_context_subscribe() failed pa_context_client_info_list() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed Connection failed, attempting reconnect Ukui Media Volume Control UkmediaAppCtrlWidget App Sound Control None System Volume UkmediaAppItemWidget Application Output Volume Input Device Output Device Confirm UkmediaDevControlWidget Sound Equipment Control Output Devices Input Devices UkmediaInputWidget Input /Audio/Input Input Device /Audio/Input Device Volume /Audio/Volume Input Level /Audio/Input Level Noise Reduction /audio/Noise Voice Monitor /audio/Voice Monitor (None Device) You can hear your voice in the output device of your choice UkmediaMainWidget Custom None UkmediaOutputWidget Output /Audio/Output Output Device /Audio/Output Device Master Volume /Audio/Master Volume Balance /Audio/Balance Left Right Volume Increase Volume above 100% can cause sound distortion and damage your speakers. Mono Audio It merges the left and right channels into one channel. UkmediaSettingsWidget Advanced Settings Sound Equipment Control Details App Sound Control UkmediaSoundEffectsWidget System Sound Sound Theme /Audio/Sound Theme Beep Switch /Audio/Beep Switch Poweroff Music /Audio/Poweroff Music Startup Music /Audio/Startup Music Wakeup Music /Audio/Wakeup Music Logout Music /Audio/Logout Music Notification Sound /Audio/Notification Sound Volume Control Sound /Audio/Volume Control Sound UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... ukui-media/audio/translations/ug.ts0000664000175000017500000007153415170054730016353 0ustar fengfeng Audio Audio ئۈن Ù€ سىن UkccPlugin ukccplugin سىنىقى /UkccPlugin/UkccPlugin ukccplugin test ukccplugin سىنىقى /UkccPlugin/ukccplugin test InputDevWidget Input Devices ئۈسكۈنە كىرگۈزۈش Confirm جەزىملەشتۈرۈش OutputDevWidget Output Devices چىقىرىش ئۈسكۈنىلىرى Confirm جەزىملەشتۈرۈش QObject pa_context_get_server_info() failed pa_context_get_server_info() ئىجرا قىلىش مەغلۇپ بولدى Card callback failure كارتا قايتۇرۇۋÛ�تىش مەغلۇپ بولدى Sink callback failure قايتما چىقىرىش مەغلۇپ بولۇش Source callback failure قايتما كىرگۈزۈش مەغلۇپ بولدى Sink input callback failure چۆكمە قايتما كىرگۈزۈش مەغلۇپ بولدى Source output callback failure مەنبە چىقىرىش قايتما تەڭشەش مەغلۇپ بولدى Client callback failure تÛ�رمىنال قايتما تەڭشىكى مەغلۇپ بولدى Server info callback failure مۇلازىمىتÛ�ر قايتما تەڭشىكى مەغلۇب بولدى Failed to initialize stream_restore extension: %s stream_restore ئۇزارتىشنى باشلىمىدى: s% pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() ئىجرا قىلىش مەغلۇپ بولدى Failed to initialize device manager extension: %s ئۈسكۈنە باشقۇرغۇچنى ئۇزارتىشنى قوزغىتىش مەغلۇپ بولدى: s% pa_ext_device_manager_read() failed pa_ext_device_manager_read() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_client_info() failed pa_context_get_client_info() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_subscribe() failed pa_context_subscribe() ئىجرا قىلىش مەغلۇپ بولدى pa_context_client_info_list() failed pa_context_client_info_list() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_card_info_list() failed pa_context_get_card_info_list() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_source_info_list() failed pa_context_get_source_info_list() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() ئىجرا قىلىش مەغلۇپ بولدى pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() ئىجرا قىلىش مەغلۇپ بولدى Ukui Media Volume Control Ukui Media ئاۋاز كونتىرول قىلىش UkmediaAppCtrlWidget App Sound Control ئەپ ئاۋاز كونتىرول قىلىش None يوق System Volume سىستÛ�ما ئاۋازى UkmediaAppItemWidget Application ئەپ Output Volume چىقىرىش ھەجىمى Input Device كىرگۈزۈش ئۈسكۈنىسى This case does not support setting the input device بۇ دÛ�لو كىرگۈزۈش ئۈسكۈنىسىنى تەڭشەشنى قوللىمايدۇ Output Device چىقىرىش ئۈسكۈنىسىنى تاللاش This case does not support setting the output device بۇ دÛ�لودا چىقىرىش ئۈسكۈنىسىنى تەڭشەش قوللىمايدۇ Confirm جەزىملەشتۈرۈش UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control ئاۋاز ئۈسكۈنىلىرىنى كونتىرول قىلىش Output Devices چىقىرىش ئۈسكۈنىلىرى Input Devices ئۈسكۈنە كىرگۈزۈش UkmediaInputWidget Input كىرگۈزۈش /Audio/Input Input Device كىرگۈزۈش ئۈسكۈنىسى /Audio/Input Device Volume ئاۋاز /Audio/Volume Input Level كىرگۈزۈش ئىنكاسى /Audio/Input Level Noise Reduction شاۋقۇننى ئاپتوماتىك تۆۋەنلىتىش /Audio/Noise Reduction Voice Monitor ئاۋاز كۆزەتكۈچ /audio/Voice Monitor (None Device) (Ú¾Û�چنىمە ئۈسكۈنىسى) You can hear your voice in the output device of your choice ئاۋازىڭىزنى ئۆزىڭىز تاللىغان چىقىرىش ئۈسكۈنىسىدىن ئاڭلىيالايسىز UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom ئۆرپ-ئادەت None يوق UkmediaOutputWidget Output چىقىرىش /Audio/Output Output Device چىقىرىش ئۈسكۈنىسىنى تاللاش /Audio/Output Device Master Volume ئاۋاز /Audio/Master Volume Balance ئاۋاز يولى تەڭپۇڭلۇقى /Audio/Balance Left سول Right ئوڭ Volume Increase ئاۋازنى يۇقىرىلىتىش Volume above 100% can cause sound distortion and damage your speakers. 100% تىن يۇقىرى ھەجىملىك ئاۋازنىڭ بۇرمىلىنىشىنى كەلتۈرۈپ چىقىرىدۇ Û‹Û• كانايىڭىزنى زەخىملەندۈرىدۇ. Mono Audio Mono Audio It merges the left and right channels into one channel. ئۇ سول Û‹Û• ئوڭ يوللارنى بىر قانالغا بىرلەشتۈرىدۇ. UkmediaSettingsWidget Advanced Settings ئىلغار تەڭشەكلەر Sound Equipment Control ئاۋاز ئۈسكۈنىلىرىنى كونتىرول قىلىش /Audio/Sound Equipment Control Details تەپسىلىي ئۇچۇرى: App Sound Control ئەپ ئاۋاز كونتىرول قىلىش /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound سىستÛ�ما ئاۋاز ئۈنىمى Sound Theme ئاۋاز تÛ�مىسى /Audio/Sound Theme Beep Switch ئەسكەرتىش ئاۋازى /Audio/Beep Switch Poweroff Music تاقاش /Audio/Poweroff Music Startup Music ئÛ�چىش /Audio/Startup Music Wakeup Music ئويغىنىش /Audio/Wakeup Music Notification Sound ئۇقتۇرۇش ئاۋازى /Audio/Notification Sound Volume Control Sound ئاۋاز مىقدارىنى كونترول قىلىش ئاۋازى /Audio/Volume Control Sound Logout Music تىزىمدىن ئۆچۈرۈش /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_default_sink() failed pa_context_set_default_sink() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_default_source() failed pa_context_set_default_source() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() ئىجرا قىلىش مەغلۇپ بولدى pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() ئىجرا قىلىش مەغلۇپ بولدى (plugged in) (Ú†Û�تىلدى) (unavailable) (ئىشلەتكىلى بولمايدۇ) (unplugged) ئۇلانمىدى Failed to read data from stream ئÛ�قىمدىن سانلىق مەلۇماتلارنى ئوقۇش مەغلۇپ بولدى Peak detect چوققا قىممەت تەكشۈرۈش Failed to create monitoring stream كۆزىتىش ئÛ�قىمى قۇرۇش مەغلۇپ بولدى Failed to connect monitoring stream كۆزىتىش ئÛ�قىمىنى ئۇلاش مەغلۇپ بولدى Ignoring sink-input due to it being designated as an event and thus handled by the Event widget چۆكمە قىممەت كىرگۈزۈش نەزەردىن ساقىت قىلىندى، چۈنكى ئۇ بىر ۋەقەلىك دەپ بÛ�كىتىلدى، شۇڭا ۋەقەلىكنىڭ كىچىك قىسمى ئورنىدا بىرتەرەپ قىلىندى pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... PulseAudio نىڭ ئۇلىنىشى قۇرۇلىۋاتىدۇ، سەل ساقلاپ تۇرۇڭ ukui-media/audio/translations/bo_CN.ts0000664000175000017500000007654315170054730016725 0ustar fengfeng Audio Audio སྒྲ་ཕབà¼� UkccPlugin ཚོད་ལྟའི་ལྷུ་ལགà¼� /UkccPlugin/UkccPlugin ukccplugin test ལྷུ་ལག་ཡིག་སྒྱུར་ཚོད་ལྟà¼� /UkccPlugin/ukccplugin test InputDevWidget Input Devices ནང་འཇུག་སྒྲིག་ཆསà¼� Confirm à½�ག་ཆོདà¼� OutputDevWidget Output Devices ཕྱིར་གà½�ོང་སྒྲིག་ཆསà¼� Confirm à½�ག་ཆོདà¼� QObject pa_context_get_server_info() failed pa_context_get_server_info()ཕམ་ཉེས་བྱུང་བà¼� Card callback failure བྱང་བུ་ཕྱིར་སློག་བྱེད་མ་à½�ུབ་པà¼� Sink callback failure ཕྱིར་ལྡོག་བྱེད་པར་ཕམ་ཉེས་བྱུང་བà¼� Source callback failure འབྱུང་à½�ུངས་ཕྱིར་ལྡོག་བྱེད་མ་à½�ུབ་པà¼� Sink input callback failure མ་དངུལ་འཇོག་པའི་ཕྱིར་ལྡོག་ལ་ཕམ་ཉེས་བྱུང Source output callback failure འབྱུང་à½�ུངས་ཕྱིར་ལྡོག་བྱེད་པར་ཕམ་ཉེས་བྱུང་བà¼� Client callback failure མངགས་བཅོལ་བྱེད་མà½�ན་གྱིས་ཕྱིར་སློག་ Server info callback failure ཞབས་ཞུའི་ཡོ་བྱད་ཀྱི་ཆ་འཕྲིན་ཕྱིར་ལྡོག་བྱེད་མ་à½�ུབ Failed to initialize stream_restore extension: %s stream_restore་རིང་དུ་གà½�ོང་བའི་à½�ོག་མའི་དུས་ཚོད་ལ་སླེབས་མ་à½�ུབ་པà¼� %s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read()ཕམ་à½�་བྱུང་བ་རེདà¼� Failed to initialize device manager extension: %s སྒྲིག་ཆས་དོ་དམ་གྱི་དུས་འགྱངས་ལ་à½�ོག་མའི་དུས་འགྱངས་བྱེད་མ་à½�ུབ་པà¼� %s pa_ext_device_manager_read() failed pa_ext_device_manager_read()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_sink_input_info() failed pa_context_get_sink_input_info()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_client_info() failed pa_context_get_client_info()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index()ཕམ་ཉེས་བྱུང་བà¼� pa_context_subscribe() failed pa_context_subscribe()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_client_info_list() failed pa_context_client_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_card_info_list() failed pa_context_get_card_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_sink_info_list() failed pa_context_get_sink_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_source_info_list() failed pa_context_get_source_info_list()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list()ཕམ་à½�་བྱུང་བ་རེདà¼� Connection failed, attempting reconnect འབྲེལ་མà½�ུད་བྱེད་མ་à½�ུབ་པར་ཡང་བསà¾�ྱར་འབྲེལ་མà½�ུད་བྱེད་རྩིས་བྱསà¼� Ukui Media Volume Control à½�ུའུ་à½�ི་ལན་གྱི་སྨྱན་སྦྱོར་གྱི་བོངས་ UkmediaAppCtrlWidget App Sound Control ཉེར་སྤྱོད་སྒྲà¼� None གཅིག་ཀྱང་མེདà¼� System Volume མ་ལག UkmediaAppItemWidget Application ཉེར་སྤྱོད་བྱ་རིམà¼� Output Volume ཕྱིར་གà½�ོང་གི་སྒྲ་ཚདà¼� Input Device ནང་འཇུག་སྒྲིག་ཆསà¼� This case does not support setting the input device གནས་ཚུལ་འདིར་ནང་འཇུག་སྒྲིག་ཆས་ལ་རྒྱབ་སà¾�ྱོར་བྱེད་མི་à½�ུབà¼� Output Device ཕྱིར་གà½�ོང་སྒྲིག་ཆསà¼� This case does not support setting the output device གནས་ཚུལ་འདིར་ཕྱིར་གà½�ོང་སྒྲིག་ཆས་ལ་རྒྱབ་སà¾�ྱོར་མི་བྱེད་པ་à¼� Confirm à½�ག་ཆོདà¼� UkmediaDevControlWidget Sound Equipment Control སྒྲའི་སྒྲིག་ཆས་དོ་དམà¼� Output Devices ཕྱིར་གà½�ོང་སྒྲིག་ཆསà¼� Input Devices ནང་འཇུག་སྒྲིག་ཆསà¼� UkmediaInputWidget Input མ་དངུལ་འཇོག་པà¼� /Audio/Input Input Device ནང་འཇུག་སྒྲིག་ཆསà¼� /Audio/Input Device Volume སà¾�ད་སྒྲà¼� /Audio/Volume Input Level སྒྲ་ཚད་ཕྱིར་ལནà¼� /Audio/Input Level Noise Reduction རིག་ནུས་ཀྱི་འཛེར་སྒྲ་གཅོག་པà¼� /Audio/Noise Reduction Voice Monitor སྒྲིག་ཆས་འདི་ལ་ཉན་ཞིབ་à¼� /audio/Voice Monitor You can hear your voice in the output device of your choice འོན་ཀྱང་བདམས་པའི་ཕྱིར་འདོན་སྒྲིག་ཆས་ནང་ནས་རང་ཉིད་ཀྱི་སà¾�ད་à½�ོས་à¼� (None Device) (སྒྲིག་ཆས་མེད་པ་) UkmediaMainWidget Custom མཚན་ཉིད་རང་འཇོགà¼� None གཅིག་ཀྱང་མེདà¼� UkmediaOutputWidget Output à½�ོན་ཚདà¼� /Audio/Output Output Device ཕྱིར་གà½�ོང་སྒྲིག་ཆསà¼� /Audio/Output Device Master Volume སྒྲ་ཚདà¼� /Audio/Master Volume Balance དོ་མཉམà¼� /Audio/Balance Left གཡོན་ཕྱོགསà¼� Right གཡས་གཡོནà¼� Volume Increase སྒྲ་ཚད་ཇེ་དྲག་à½�ུà¼� Volume above 100% can cause sound distortion and damage your speakers. སྒྲ་ཚད་བརྒྱ་ཆ་༡༠༠ལས་བརྒལ་ན་སྒྲ་ནུས་དངོས་མིན་དང་à½�ྱོད་ཀྱི་སྒྲ་སà¾�ྱེད་ཆས་ལ་གནོད་པ་à½�ེབས་སྲིདà¼� Mono Audio སྒྲ་ལམ་རà¾�ྱང་པའི་སྒྲ་ཟློསà¼� It merges the left and right channels into one channel. སྒྲ་ལམ་གཡོན་དང་སྒྲ་ལམ་གཡས་ཟླ་སྒྲིལ་བྱས་ནས་སྒྲ་ལམ་གཅིག་à½�ུ་གྱུརà¼� UkmediaSettingsWidget Advanced Settings མà½�ོ་རིམ་སྒྲིག་འགོདà¼� Sound Equipment Control སྒྲའི་སྒྲིག་ཆས་དོ་དམà¼� /Audio/Sound Equipment Control Details གནས་ཚུལ་ཞིབ་ཕྲà¼� App Sound Control ཉེར་སྤྱོད་སྒྲà¼� /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound མ་ལག་སྒྲ་ནུསà¼� Sound Theme སྒྲ་ནུས་ཀྱི་བརྗོད་བྱà¼� /Audio/Sound Theme Alert Sound ཉེན་བརྡའི་སྒྲ་ /Audio/Alert Sound Beep Switch སྣེ་སྟོན་པའི་སྒྲà¼� /Audio/Beep Switch Poweroff Music གླུ་དབྱངས་སྒོ་བརྒྱབ་པà¼� /Audio/Poweroff Music Startup Music རོལ་དབྱངས་à½�་ཕྱེ་བà¼� /Audio/Startup Music Wakeup Music འབོད་སློང་à¼� /Audio/Wakeup Music Notification Sound བསྡུ་ལེན་བརྡ་à½�ོà¼� /Audio/Notification Sound Volume Control Sound སྒྲ་ཚད་སྙོམ་སྒྲིག /Audio/Volume Control Sound Volume Change སྒྲ་གདངས་འགྱུར་ལྡོག /Audio/Volume Change Logout Music རོལ་དབྱངས་མེད་པར་བཟོ་བà¼� /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_sink_mute_by_index() failed t_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_output_volume() failed pa_context_set_source_output_volume()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_output_mute() failed pa_context_set_source_output_mute()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index()ཕམ་ཉེས་བྱུང་བà¼� pa_context_set_default_sink() failed pa_context_set_default_sink()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_default_source() failed pa_context_set_default_source()ཕམ་ཉེས་བྱུང་བà¼� pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name()ཕམ་ཉེས་བྱུང་བà¼� (plugged in) (ནང་དུ་བཅུག་པ་)à¼� (unavailable) (སྤྱོད་གོ་མི་ཆོད་པ)à¼� (unplugged) (à½�་à½�ོར་ཡ་བྲལ་དུ་སོང་བ་)à¼� Failed to read data from stream ཆུ་ཕྲན་ནས་གཞི་གྲངས་ཀློག་མ་à½�ུབ་པà¼� Peak detect ཡང་རྩེར་ཞིབ་དཔྱད་ཚད་ལེན Failed to create monitoring stream ལྟ་ཞིབ་ཚད་ལེན་གྱི་ཆུ་ཕྲན་གསར་སà¾�ྲུན་བྱེད་མ་à½�ུབ་པ Failed to connect monitoring stream ལྟ་ཞིབ་ཚད་ལེན་གྱི་ཆུ་ཕྲན་སྦྲེལ་མà½�ུད་བྱེད་མ་à½�ུབ་པ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget དོན་རà¾�ྱེན་ཞིག་à½�ུ་བརྩིས་ནས་དོན་རà¾�ྱེན་ཆུང་ཆུང་ཞིག་à½�ུ་བརྩིས་ནས་à½�ག་གཅོད་བྱས་པའི་རà¾�ྱེན་གྱིས་ཆུ་ནང་དུ་འཛུལ་བར་སྣང་མེད་བྱས་པ་རེདà¼� pa_context_kill_source_output() failed _output() failed Establishing connection to PulseAudio. Please wait... ཕུའུ་ལུའུ་ཧྲི་ཨོ་à½�ོ་དང་འབྲེལ་བ་བཙུགས་པ་རེདà¼� སà¾�ུ་མà½�ྱེན་སྒུག་རོགསà¼�... ukui-media/audio/translations/vi.ts0000664000175000017500000006716215170054730016360 0ustar fengfeng Audio Audio Thiết bị âm thanh UkccPlugin Plugin Ukcc /UkccPlugin/UkccPlugin ukccplugin test Kiểm tra ukccplugin /UkccPlugin/ukccplugin test InputDevWidget Input Devices Thiết bị đầu vào Confirm Lưu sá»­a đổi OutputDevWidget Output Devices Thiết bị đầu ra Confirm Lưu sá»­a đổi QObject pa_context_get_server_info() failed Pa_context_get_server_info() thất bại Card callback failure Lá»—i gá»�i lại thẻ Sink callback failure Lá»—i gá»�i lại Sink thất bại Source callback failure Lá»—i gá»�i lại Nguồn thất bại Sink input callback failure Lá»—i callback đầu vào sink Source output callback failure Lá»—i phản hồi đầu ra nguồn Client callback failure Lá»—i gá»�i lại từ khách hàng Server info callback failure Lá»—i callback thông tin máy chá»§ Failed to initialize stream_restore extension: %s Khởi tạo phần mở rá»™ng stream_restore thất bại: %s pa_ext_stream_restore_read() failed Ä�á»�c pa_ext_stream_restore thất bại Failed to initialize device manager extension: %s Khởi tạo phần mở rá»™ng quản lý thiết bị thất bại: %s pa_ext_device_manager_read() failed Ä�á»�c pa_ext_device_manager thất bại pa_context_get_sink_info_by_index() failed Lấy thông tin thiết bị xuất âm bằng chỉ mục trong ngữ cảnh PulseAudio thất bại pa_context_get_source_info_by_index() failed Lấy thông tin vá»� source (đầu vào âm thanh) bằng chỉ mục thất bại pa_context_get_sink_input_info() failed Pa_context_get_sink_input_info() thất bại pa_context_get_client_info() failed Pa context lấy thông tin khách hàng() thất bại pa_context_get_card_info_by_index() failed Lấy thông tin vá»� card âm thanh theo chỉ số thất bại pa_context_subscribe() failed Ä�ăng ký ngữ cảnh PA không thành công pa_context_client_info_list() failed Hàm pa_context_client_info_list() thá»±c thi thất bại pa_context_get_card_info_list() failed Lá»—i khi lấy danh sách thông tin card âm thanh cá»§a ngữ cảnh PulseAudio pa_context_get_sink_info_list() failed Lá»—i khi lấy danh sách thông tin đầu ra âm thanh (sink) từ ngữ cảnh PulseAudio pa_context_get_source_info_list() failed Lá»—i khi lấy danh sách thông tin nguồn âm thanh từ ngữ cảnh PulseAudio pa_context_get_sink_input_info_list() failed Hàm pa_context_get_sink_input_info_list() thá»±c thi thất bại pa_context_get_source_output_info_list() failed Hàm pa_context_get_source_output_info_list() thá»±c thi thất bại Ukui Media Volume Control Bá»™ Ä‘iá»�u khiển âm lượng Ä‘a phương tiện Ukui UkmediaAppCtrlWidget App Sound Control Âm thanh ứng dụng None Sá»­ dùng settings hiện tại cá»§a máy in System Volume Âm lượng hệ thống UkmediaAppItemWidget Application Ứng dụng Output Volume Âm lượng đầu ra Input Device Thiết bị đầu vào This case does not support setting the input device Tình huống này không há»— trợ cài đặt thiết bị đầu vào Output Device Chá»�n thiết bị đầu ra This case does not support setting the output device Tình huống này không há»— trợ cài đặt thiết bị đầu ra Confirm Lưu sá»­a đổi UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control Quảy lý thiết bị âm thanh Output Devices Thiết bị đầu ra Input Devices Thiết bị đầu vào UkmediaInputWidget Input Ä�ầu vào /Audio/Input Input Device Thiết bị đầu vào /Audio/Input Device Volume Âm thanh /Audio/Volume Input Level Phản hồi âm lượng /Audio/Input Level Noise Reduction Giảm ồn thông minh /Audio/Noise Reduction Voice Monitor Lắng nghe thiết bị này /audio/Voice Monitor (None Device) (Không có thiết bị) You can hear your voice in the output device of your choice Có thể nghe lại giá»�ng nói cá»§a mình qua thiết bị đầu ra đã chá»�n UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom Ä�ịnh dạng khác None Sá»­ dùng settings hiện tại cá»§a máy in UkmediaOutputWidget Output Ä�ầu ra /Audio/Output Output Device Chá»�n thiết bị đầu ra /Audio/Output Device Master Volume Âm lượng /Audio/Master Volume Balance Cân bằng /Audio/Balance Left Có sẵn Right Phía phải Volume Increase Tăng cưá»�ng âm lượng Volume above 100% can cause sound distortion and damage your speakers. Khi âm lượng vượt quá 100%, có thể gây méo âm và làm há»�ng loa cá»§a bạn. Mono Audio Âm thanh đơn kênh âm thanh It merges the left and right channels into one channel. Gá»™p kênh âm thanh trái và phải thành má»™t kênh âm thanh đơn. UkmediaSettingsWidget Advanced Settings Cài đặt cao cấp Sound Equipment Control Quảy lý thiết bị âm thanh /Audio/Sound Equipment Control Details Mô tả chi tiết App Sound Control Âm thanh ứng dụng /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound Hiệu ứng âm thanh hệ thống Sound Theme Chá»§ Ä‘á»� hiệu ứng âm thanh /Audio/Sound Theme Beep Switch Âm thanh thông báo /Audio/Beep Switch Poweroff Music Tắt máy /Audio/Poweroff Music Startup Music Khởi động /Audio/Startup Music Wakeup Music Ä�ánh thức /Audio/Wakeup Music Notification Sound Nhận thông báo /Audio/Notification Sound Volume Control Sound Ä�iá»�u chỉnh âm lượng /Audio/Volume Control Sound Logout Music Ä�ăng xuất /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed Hàm pa_context_set_sink_volume_by_index() thá»±c thi thất bại pa_context_set_sink_mute_by_index() failed Hàm pa_context_set_sink_mute_by_index() thá»±c thi thất bại pa_context_set_source_mute_by_index() failed Hàm pa_context_set_source_mute_by_index() thá»±c thi thất bại pa_context_set_source_volume_by_index() failed Hàm pa_context_set_source_volume_by_index() thá»±c thi thất bại pa_context_set_source_output_volume() failed Hàm pa_context_set_source_output_volume() thá»±c thi thất bại pa_context_set_source_output_mute() failed Hàm pa_context_set_source_output_mute() thá»±c thi thất bại pa_context_set_card_profile_by_index() failed Hàm pa_context_set_card_profile_by_index() thá»±c thi thất bại pa_context_set_default_sink() failed Hàm pa_context_set_default_sink() thá»±c thi thất bại pa_context_set_default_source() failed Hàm pa_context_set_default_source() thá»±c thi thất bại pa_context_set_sink_port_by_name() failed Hàm pa_context_set_sink_port_by_name() thá»±c thi thất bại pa_context_set_source_port_by_name() failed Hàm pa_context_set_source_port_by_name() thá»±c thi thất bại (plugged in) (đã cắm) (unavailable) (không khả dụng) (unplugged) (đã ngắt kết nối) Failed to read data from stream Không thể Ä‘á»�c dữ liệu từ luồng Peak detect Phát hiện đỉnh Failed to create monitoring stream Không thể tạo luồng giám sát Failed to connect monitoring stream Không thể kết nối luồng giám sát Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Bá»� qua sink-input do được chỉ định là sá»± kiện (event) và sẽ được xá»­ lý bởi widget Sá»± kiện pa_context_kill_source_output() failed pa_context_kill_source_output() không thành công Establishing connection to PulseAudio. Please wait... Ä�ang thiết lập kết nối tá»›i PulseAudio. Vui lòng chá»�... ukui-media/audio/translations/ab.ts0000664000175000017500000006116415170054730016320 0ustar fengfeng Audio Audio UkccPlugin /UkccPlugin/UkccPlugin ukccplugin test /UkccPlugin/ukccplugin test InputDevWidget Input Devices Confirm OutputDevWidget Output Devices Confirm QObject pa_context_get_server_info() failed Card callback failure Sink callback failure Source callback failure Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_get_card_info_by_index() failed pa_context_subscribe() failed pa_context_client_info_list() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed Ukui Media Volume Control UkmediaAppCtrlWidget App Sound Control None System Volume UkmediaAppItemWidget Application Output Volume Input Device This case does not support setting the input device Output Device This case does not support setting the output device Confirm UkmediaDevControlWidget audio device control 声音设备管ç�† output device 输出设备 input device 输入设备 Sound Equipment Control Output Devices Input Devices UkmediaInputWidget Input /Audio/Input Input Device /Audio/Input Device Volume /Audio/Volume Input Level /Audio/Input Level Noise Reduction /Audio/Noise Reduction Voice Monitor /audio/Voice Monitor (None Device) You can hear your voice in the output device of your choice UkmediaMainWidget Light-Seeking 寻光 HeYin å’Œå�° Custom None UkmediaOutputWidget Output /Audio/Output Output Device /Audio/Output Device Master Volume /Audio/Master Volume Balance /Audio/Balance Left Right Volume Increase Volume above 100% can cause sound distortion and damage your speakers. Mono Audio It merges the left and right channels into one channel. UkmediaSettingsWidget Advanced Settings Sound Equipment Control /Audio/Sound Equipment Control Details App Sound Control /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound Sound Theme /Audio/Sound Theme Beep Switch /Audio/Beep Switch Poweroff Music /Audio/Poweroff Music Startup Music /Audio/Startup Music Wakeup Music /Audio/Wakeup Music Notification Sound /Audio/Notification Sound Volume Control Sound /Audio/Volume Control Sound Logout Music /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... ukui-media/audio/translations/mn_MN.ts0000664000175000017500000010125015170054730016731 0ustar fengfeng Audio Audio ᠠᠦ᠋ᠳᠢᠤ᠋ UkccPlugin Ukccc ᠵᠠᠯᠭᠠᠰᠤ /UkccPlugin/UkccPlugin ukccplugin test ᠤᠭᠯᠠᠭᠤᠷᠭ᠎ᠠ ᠲᠣᠨᠣᠭ᠎ᠤ᠋ᠨ ᠰᠣᠷᠢᠯᠲᠠ /UkccPlugin/ukccplugin test InputDevWidget Input Devices ᠣᠷᠣᠭᠤᠯᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ Confirm ᠲᠣᠭᠲᠠᠭᠠᠬᠤ OutputDevWidget Output Devices ᠭᠠᠷᠭᠠᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ Confirm ᠲᠣᠭᠲᠠᠭᠠᠬᠤ QObject pa_context_get_server_info() failed pa_context_get_server_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Card callback failure ᠺᠠᠷᠲ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Sink callback failure ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Source callback failure ᠡᠬᠦᠰᠬᠡᠭᠴᠢ ᠵᠢ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Sink input callback failure Sink input ᠢ᠋\ ᠵᠢ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Source output callback failure ᠡᠬᠦᠰᠬᠡᠭᠴᠢ ᠵᠢᠨ ᠭᠠᠷᠭᠠᠯᠳᠠ ᠵᠢ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Client callback failure ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Server info callback failure ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦᠷ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Failed to initialize stream_restore extension: %s stream_restore ᠵᠢ/ ᠢ᠋ ᠠᠨᠭᠬᠠᠵᠢᠭᠤᠯᠵᠤ ᠦᠷᠬᠡᠳᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ᠄%s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Failed to initialize device manager extension: %s ᠳᠦᠬᠦᠬᠡᠷᠦᠮᠵᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠳᠠ ᠵᠢᠨ ᠪᠠᠭᠠᠵᠢ ᠵᠢ ᠠᠨᠭᠬᠠᠵᠢᠭᠤᠯᠵᠤ ᠦᠷᠬᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ᠄%s pa_ext_device_manager_read() failed pa_ext_device_manager_read() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_client_info() failed pa_context_get_client_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_subscribe() failed pa_context_subscribe() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_client_info_list() failed pa_context_client_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_card_info_list() failed pa_context_get_card_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() ᠵᠢ/ ᠢ᠋ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_source_info_list() failed pa_context_get_source_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ Connection failed, attempting reconnect ᠴᠦᠷᠬᠡᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠰᠢᠨ᠎ᠡ ᠪᠡᠷ ᠴᠦᠷᠬᠡᠯᠡᠬᠦ ᠵᠢ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨ᠎ᠠ Ukui Media Volume Control Ukui ᠮᠸᠳᠢᠶ᠎ᠠ ᠵᠢᠨ ᠳᠠᠭᠤ ᠵᠢ ᠡᠵᠡᠮᠳᠡᠬᠦ UkmediaAppCtrlWidget App Sound Control ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ᠎ᠦ᠌ ᠳᠠᠭᠤ None ᠦᠬᠡᠢ System Volume ᠰᠢᠰᠲᠸᠮ UkmediaAppItemWidget Application ᠬᠡᠷᠡᠭᠯᠡᠭᠡ Output Volume ᠭᠠᠷᠭᠠᠬᠤ ᠳᠠᠭᠤ Input Device ᠶᠠᠷᠢᠶᠠᠨ᠎ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ ᠪᠤᠶᠤ ᠰᠢᠩᠭᠡᠭᠡᠵᠦ ᠦᠢᠯᠡᠳᠬᠦ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ This case does not support setting the input device ᠲᠤᠰ ᠪᠠᠢᠳᠠᠯ ᠨᠢ ᠣᠷᠣᠭᠤᠯᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠪᠠᠢᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ Output Device ᠳᠠᠭᠤ ᠨᠡᠪᠲᠡᠷᠡᠭᠦᠯᠬᠦ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ This case does not support setting the output device ᠲᠤᠰ ᠪᠠᠢᠳᠠᠯ ᠨᠢ ᠭᠠᠷᠭᠠᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ᠎ᠶ᠋ᠢ ᠳᠡᠮᠵᠢᠬᠦ ᠦᠭᠡᠢ Confirm ᠲᠣᠭᠲᠠᠭᠠᠬᠤ UkmediaDevControlWidget Sound Equipment Control ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ Output Devices ᠭᠠᠷᠭᠠᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ Input Devices ᠣᠷᠣᠭᠤᠯᠬᠤ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ UkmediaInputWidget Input ᠣᠷᠣᠭᠤᠯᠬᠤ /Audio/Input Input Device ᠶᠠᠷᠢᠶᠠᠨ᠎ᠳ᠋ᠤ᠌ ᠬᠡᠷᠡᠭᠯᠡᠬᠦ ᠪᠤᠶᠤ ᠰᠢᠩᠭᠡᠭᠡᠵᠦ ᠦᠢᠯᠡᠳᠬᠦ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ /Audio/Input Device Volume ᠡᠪᠬᠡᠮᠡᠯ /Audio/Volume Input Level ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ᠎ᠶ᠋ᠢᠨ ᠪᠤᠴᠠᠯᠲᠠ /Audio/Input Level Noise Reduction ᠣᠶᠤᠨᠲᠤ ᠎ᠪᠡᠷ ᠱᠤᠤᠭᠢᠶᠠᠨ ᠪᠠᠭᠤᠷᠠᠭᠤᠯᠬᠤ /Audio/Noise Reduction Voice Monitor ᠲᠤᠰ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠲᠠᠩᠨᠠᠨ ᠰᠣᠨᠣᠰᠬᠤ /audio/Voice Monitor (None Device) (᠎ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠦᠭᠡᠢ ) You can hear your voice in the output device of your choice ᠰᠣᠩᠭᠣᠵᠤ á ­á  á ·á ­á  á ­á °á  á ¨ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ ᠳᠣᠲᠣᠷ᠎ᠠ ᠥᠪᠡᠷ᠎ᠦ᠋ᠨ ᠳᠠᠭᠤ᠎ᠶ᠋ᠢ ᠣᠯᠵᠤ ᠰᠣᠨᠣᠰᠤᠨ᠎ᠠ UkmediaMainWidget Custom ᠦᠪᠡᠷᠳᠡᠬᠡᠨ ᠳᠤᠭᠳᠠᠭᠠᠬᠤ None ᠦᠬᠡᠢ UkmediaOutputWidget Output ᠭᠠᠷᠭᠠᠯᠲᠠ /Audio/Output Output Device ᠳᠠᠭᠤ ᠨᠡᠪᠲᠡᠷᠡᠭᠦᠯᠬᠦ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢ ᠰᠣᠩᠭᠣᠬᠤ /Audio/Output Device Master Volume ᠳᠠᠭᠤ /Audio/Master Volume Balance ᠭᠡᠷᠡᠯᠲᠦᠴᠡ᠎ᠶ᠋ᠢᠨ ᠲᠡᠩᠴᠡᠭᠦᠷᠢ᠎ᠶ᠋ᠢᠨ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠭ᠎ᠠ /Audio/Balance Left ᠵᠡᠬᠦᠨ Right ᠪᠠᠷᠠᠭᠤᠨ Volume Increase ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ ᠴᠢᠩᠭᠠᠷᠠᠬᠤ Volume above 100% can cause sound distortion and damage your speakers. ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ 100% á ¶á ‹á ¢ ᠳᠠᠪᠠᠬᠤ ᠦᠶᠡᠰ ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠬᠦᠴᠦᠨ ᠰᠣᠯᠢᠭᠳᠠᠵᠤ á ‚ ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠰᠦᠷ ᠮᠠᠨᠳᠤᠭᠤᠯᠤᠭᠴᠢ ᠪᠠᠷᠤᠭ ᠬᠣᠬᠢᠷᠠᠯ ᠭᠠᠷᠤᠨ᠎ᠠ. Mono Audio ᠳᠠᠩ ᠳᠠᠭᠤᠨ ᠵᠠᠮ᠎ᠤ᠋ᠨ ᠳᠠᠭᠤᠨ ᠳᠠᠪᠲᠠᠮᠵᠢ It merges the left and right channels into one channel. ᠵᠡᠭᠦᠨ ᠳᠠᠭᠤᠨ ᠪᠠ ᠪᠠᠷᠠᠭᠤᠨ ᠳᠠᠭᠤᠨ ᠵᠠᠮ᠎ᠢ᠋ ᠨᠢᠭᠡ ᠳᠠᠭᠤᠨ ᠵᠠᠮ ᠪᠣᠯᠭᠠᠨ ᠨᠡᠢᠯᠡᠭᠦᠯᠦᠨ᠎ᠡ. UkmediaSettingsWidget Advanced Settings ᠳᠡᠭᠡᠳᠦ ᠵᠡᠷᠭᠡ᠎ᠶ᠋ᠢᠨ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠤᠯ Sound Equipment Control ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠲᠥᠬᠥᠭᠡᠷᠦᠮᠵᠢ᠎ᠶ᠋ᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠲᠠ /Audio/Sound Equipment Control Details ᠨᠠᠷᠢᠨ ᠵᠠᠩᠭᠢ App Sound Control ᠬᠡᠷᠡᠭᠯᠡᠭᠡᠨ᠎ᠦ᠌ ᠳᠠᠭᠤ /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound ᠰᠢᠰᠲ᠋ᠧᠮ᠎ᠦ᠋ᠨ ᠳᠠᠭᠤᠨ ᠦᠢᠯᠡᠳᠦᠯ Sound Theme ᠳᠠᠭᠤᠨ᠎ᠤ᠋ ᠭᠣᠣᠯ ᠰᠡᠳᠦᠪ /Audio/Sound Theme Alert Sound ᠮᠡᠳᠡᠭᠳᠡᠯ /Audio/Alert Sound Beep Switch ᠰᠠᠨᠠᠭᠤᠯᠤᠮᠵᠢ /Audio/Beep Switch Poweroff Music ᠬᠠᠭᠠᠬᠤ /Audio/Poweroff Music Startup Music ᠨᠡᠬᠡᠬᠦ /Audio/Startup Music Wakeup Music ᠳᠠᠭᠤᠳᠠᠨ ᠰᠡᠷᠭᠦᠭᠡᠬᠦ /Audio/Wakeup Music Notification Sound ᠮᠡᠳᠡᠭᠳᠡᠯ ᠬᠦᠯᠢᠶᠡᠨ ᠠᠪᠬᠤ /Audio/Notification Sound Volume Control Sound ᠳᠠᠭᠤ ᠲᠣᠬᠢᠷᠠᠭᠤᠯᠬᠤ /Audio/Volume Control Sound Volume Change ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ ᠵᠢ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ /Audio/Volume Change Logout Music ᠳᠠᠩᠰᠠ᠎ᠠ᠋ᠴᠠ ᠬᠠᠰᠤᠬᠤ /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index (á Ž)᠎ᠢᠯᠠᠭᠳᠠᠵᠠᠢ pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index () ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index () ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_default_sink() failed pa_context_set_default_sink() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_default_source() failed pa_context_set_default_source() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() ᠢ᠋\ ᠵᠢ ᠬᠦᠢᠴᠡᠳᠬᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠥᠬᠡᠢ (plugged in) ( ᠴᠡᠨᠡᠯᠡᠭᠰᠡᠨ ᠪᠠᠢᠨ᠎ᠠ) (unavailable) ( ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ) (unplugged) ( ᠴᠡᠨᠡᠭᠯᠡᠭᠰᠡᠨ ᠥᠬᠡᠢ) Failed to read data from stream ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢ ᠤᠩᠰᠢᠬᠤ ᠵᠢᠨ á  á ·á ­á Žá   ᠥᠬᠡᠢ Peak detect ᠣᠷᠭᠢᠯ ᠬᠡᠮᠵᠢᠭᠳᠡᠯ ᠦ᠋ᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠲᠠ Failed to create monitoring stream ᠬᠢᠨᠠᠨ ᠬᠡᠮᠵᠢᠬᠦ ᠤᠷᠤᠰᠬᠠᠯ ᠢ᠋ ᠪᠠᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Failed to connect monitoring stream ᠬᠢᠨᠠᠨ ᠬᠡᠮᠵᠢᠬᠦ ᠤᠷᠤᠰᠬᠠᠯ ᠢ᠋ ᠴᠦᠷᠬᠡᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget sink-input ᠢ᠋\ ᠵᠢ ᠤᠮᠳᠤᠭᠠᠢᠯᠠᠨ᠎ᠠ᠂ ᠤᠴᠢᠷ ᠨᠢ ᠳᠡᠬᠦᠨ ᠢ᠋ ᠶᠠᠪᠤᠳᠠᠯ ᠵᠢᠨᠷ ᠳᠤᠭᠳᠠᠭᠠᠭᠰᠠᠨ᠂ ᠡᠢᠮᠤ á ¡á ´á ¡ Event widget ᠵᠢᠡᠷ\ ᠪᠡᠷ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠬᠦ ᠬᠡᠷᠡᠭᠳᠡᠢ pa_context_kill_source_output() failed pa_context_kill_source_output (á Ž) ᠢᠯᠠᠭᠳᠠᠬᠤ Establishing connection to PulseAudio. Please wait... PulseAudio ᠳ᠋ᠤ᠌/ ᠲᠤ᠌ ᠴᠦᠷᠬᠡᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠳᠦᠷ ᠬᠦᠯᠢᠶᠡᠬᠡᠷᠡᠢ··· ukui-media/audio/translations/en_US.ts0000664000175000017500000006147215170054730016751 0ustar fengfeng Audio Audio UkccPlugin /UkccPlugin/UkccPlugin ukccplugin test /UkccPlugin/ukccplugin test InputDevWidget Input Devices Confirm OutputDevWidget Output Devices Confirm QObject pa_context_get_server_info() failed Card callback failure Sink callback failure Source callback failure Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_get_card_info_by_index() failed pa_context_subscribe() failed pa_context_client_info_list() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed Ukui Media Volume Control UkmediaAppCtrlWidget App Sound Control None System Volume UkmediaAppItemWidget Application Output Volume Input Device This case does not support setting the input device Output Device This case does not support setting the output device Confirm UkmediaDevControlWidget Sound Equipment Control Output Devices Input Devices UkmediaInputWidget Input /Audio/Input Input Device /Audio/Input Device Volume /Audio/Volume Input Level /Audio/Input Level Noise Reduction /Audio/Noise Reduction Voice Monitor /audio/Voice Monitor (None Device) You can hear your voice in the output device of your choice UkmediaMainWidget Custom None UkmediaOutputWidget Output /Audio/Output Output Device /Audio/Output Device Master Volume /Audio/Master Volume Balance /Audio/Balance Left Right Volume Increase Volume above 100% can cause sound distortion and damage your speakers. Mono Audio It merges the left and right channels into one channel. UkmediaSettingsWidget Advanced Settings Sound Equipment Control /Audio/Sound Equipment Control Details App Sound Control /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound Sound Theme /Audio/Sound Theme Beep Switch /Audio/Beep Switch Poweroff Music /Audio/Poweroff Music Startup Music /Audio/Startup Music Wakeup Music /Audio/Wakeup Music Logout Music /Audio/Logout Music Notification Sound /Audio/Notification Sound Volume Control Sound /Audio/Volume Control Sound UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... ukui-media/audio/translations/zh_HK.ts0000664000175000017500000006433215170054730016741 0ustar fengfeng Audio Audio è�²éŸ³ UkccPlugin Ukcc外掛程å¼� /UkccPlugin/UkccPlugin ukccplugin test ukcc外掛程å¼� 測試 /UkccPlugin/ukccplugin test InputDevWidget Input Devices 輸入è£�ç½® Confirm 確èª� OutputDevWidget Output Devices 輸出è£�ç½® Confirm 確èª� QObject pa_context_get_server_info() failed pa_context_get_server_info() 執行失敗 Card callback failure å�¡ç‰‡å›žèª¿å¤±æ•— Sink callback failure 輸出回調失敗 Source callback failure 輸入回調失敗 Sink input callback failure 水槽輸入回調失敗 Source output callback failure source-ouput回調失敗 Client callback failure 用戶端回調失敗 Server info callback failure æœ�務端回調錯誤 Failed to initialize stream_restore extension: %s åˆ�始化stream_restore擴展失敗:%s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() 執行失敗 Failed to initialize device manager extension: %s åˆ�始化設備管ç�†å™¨æ“´å±•失敗:%s pa_ext_device_manager_read() failed pa_ext_device_manager_read() 執行失敗 pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() 執行失敗 pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() 執行失敗 pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() 執行失敗 pa_context_get_client_info() failed pa_context_get_client_info() 執行失敗 pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() 執行失敗 pa_context_subscribe() failed pa_context_subscribe() 執行失敗 pa_context_client_info_list() failed pa_context_client_info_list() 執行失敗 pa_context_get_card_info_list() failed pa_context_get_card_info_list() 執行失敗 pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() 執行失敗 pa_context_get_source_info_list() failed pa_context_get_source_info_list() 執行失敗 pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() 執行失敗 pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() 執行失敗 Connection failed, attempting reconnect 連接失敗,嘗試é‡�新連接中 Ukui Media Volume Control UKUI 媒體音é‡�控制 UkmediaAppCtrlWidget App Sound Control 應用程å¼�è�²éŸ³æŽ§åˆ¶ None 空 System Volume 系統音é‡� UkmediaAppItemWidget Application 應用 Output Volume 輸出音é‡� Input Device é�¸æ“‡è¼¸å…¥è¨­å‚™ This case does not support setting the input device 本案例ä¸�支æ�´è¨­å®šè¼¸å…¥è¨­å‚™ Output Device é�¸æ“‡è¼¸å‡ºè¨­å‚™ This case does not support setting the output device 本案例ä¸�支æ�´è¨­å®šè¼¸å‡ºè¨­å‚™ Confirm 確èª� UkmediaDevControlWidget Sound Equipment Control 音響設備控制 Output Devices 輸出è£�ç½® Input Devices 輸入è£�ç½® UkmediaInputWidget Input 輸入 /Audio/Input Input Device é�¸æ“‡è¼¸å…¥è¨­å‚™ /Audio/Input Device Volume 音é‡� /Audio/Volume Input Level 輸入å��饋 /Audio/Input Level Noise Reduction 智慧é™�噪 /Audio/Noise Reduction Voice Monitor 語音監è�½ /audio/Voice Monitor (None Device) (無è£�置) You can hear your voice in the output device of your choice 您å�¯ä»¥åœ¨æ‚¨é�¸æ“‡çš„輸出è£�置中è�½åˆ°æ‚¨çš„è�²éŸ³ UkmediaMainWidget Custom 自定義 None 空 UkmediaOutputWidget Output 輸出 /Audio/Output Output Device é�¸æ“‡è¼¸å‡ºè¨­å‚™ /Audio/Output Device Master Volume 音é‡� /Audio/Master Volume Balance è�²é�“平衡 /Audio/Balance Left å·¦ Right å�³ Volume Increase 音é‡�增強 Volume above 100% can cause sound distortion and damage your speakers. 音é‡�è¶…é�Ž 100% å�¯èƒ½æœƒå°Žè‡´è�²éŸ³å¤±çœŸä¸¦æ��壞æ�šè�²å™¨ã€‚ Mono Audio å–®è�²é�“音訊 It merges the left and right channels into one channel. 它將左å�³é€šé�“å�ˆä½µç‚ºä¸€å€‹é€šé�“。 UkmediaSettingsWidget Advanced Settings 進階設定 Sound Equipment Control 音響設備控制 /Audio/Sound Equipment Control Details 細節 App Sound Control 應用程å¼�è�²éŸ³æŽ§åˆ¶ /Audio/App Sound Control UkmediaSoundEffectsWidget System Sound 系統音效 Sound Theme 音效主題 /Audio/Sound Theme Alert Sound 通知 /Audio/Alert Sound Beep Switch æ��示音 /Audio/Beep Switch Poweroff Music 關機 /Audio/Poweroff Music Startup Music 開機 /Audio/Startup Music Wakeup Music 喚醒 /Audio/Wakeup Music Notification Sound 通知音效 /Audio/Notification Sound Volume Control Sound 音é‡�調整音效 /Audio/Volume Control Sound Volume Change 音é‡�調節 /Audio/Volume Change Logout Music 註銷 /Audio/Logout Music UkmediaVolumeControl pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() 執行失敗 pa_context_set_sink_mute_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() 執行失敗 pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() 執行失敗 pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() 執行失敗 pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() 執行失敗 pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() 執行失敗 pa_context_set_default_sink() failed pa_context_set_default_sink() 執行失敗 pa_context_set_default_source() failed pa_context_set_default_source() 執行失敗 pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() 執行失敗 pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() 執行失敗 (plugged in) (æ�’上了) (unavailable) ( ä¸�å�¯ç”¨ ) (unplugged) 沒有連接 Failed to read data from stream 從æµ�中讀å�–數據失敗 Peak detect 峰值檢測 Failed to create monitoring stream 創建監控æµ�失敗 Failed to connect monitoring stream 連接監控æµ�失敗 Ignoring sink-input due to it being designated as an event and thus handled by the Event widget 忽略沉é™�輸入,因為它被指定為事件,因此由事件å°�部件處ç�† pa_context_kill_source_output() failed Establishing connection to PulseAudio. Please wait... 正在建立與PulseAudio的連接。 請等待... ukui-media/audio/app-device-control/0000775000175000017500000000000015170054730016330 5ustar fengfengukui-media/audio/app-device-control/ukmedia_app_item_widget.h0000664000175000017500000000533515170054730023347 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIA_ITEM_WIDGET_H #define UKMEDIA_ITEM_WIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include #include "kslider.h" #include "../../audio/ukui_custom_style.h" #include "../../common/ukmedia_common.h" using namespace kdk; class UkmediaAppItemWidget : public QWidget { Q_OBJECT public: UkmediaAppItemWidget(QWidget *parent = nullptr); ~UkmediaAppItemWidget(); friend class UkmediaAppCtrlWidget; void initUI(); void addInputCombobox(QString port); void addOutputCombobox(QString port); void setSliderValue(int value); void outputVolumeDarkThemeImage(int value, bool status); void setTitleName(QString name); //设置应用标题å�� void setChildObjectName(QString name); //设置控件object name void setInputHintWidgetShow(bool status); void setOutputHintWidgetShow(bool status); private: QFrame* myLine(); // QFrame *line1; // QFrame *line2; QFrame *m_pAppWidget; QFrame *m_pInputWidget; QFrame *m_pOutputWidget; QFrame *m_pVolumeWidget; QFrame *m_pCheckWidget; FixLabel *m_pAppLabel; FixLabel *m_pVolumeLabel; FixLabel *m_pInputDevLabel; FixLabel *m_pOutputDevLabel; FixLabel *m_pVolumeNumLabel; QLabel *m_pInputHintIcon; QLabel *m_pOutputHintIcon; QFrame *m_pInputHintWidget; QFrame *m_pOutputHintWidget; FixLabel *m_pInputHintLabel; FixLabel *m_pOutputHintLabel; KSlider *m_pVolumeSlider; QComboBox *m_pInputCombobox; QComboBox *m_pOutputCombobox; QPushButton *m_pConfirmBtn; UkuiButtonDrawSvg *m_pVolumeBtn; QString mThemeName; void onPaletteChanged(); }; #endif //UKMEDIA_ITEM_WIDGET_H ukui-media/audio/app-device-control/ukmedia_app_device_ctrl.h0000664000175000017500000000663015170054730023330 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIA_APP_DEVICE_CTRL_H #define UKMEDIA_APP_DEVICE_CTRL_H #include #include #include #include #include #include #include #include #include #include #include #include #include "kwidget.h" #include "knavigationbar.h" #include "ukmedia_app_item_widget.h" #include "../../common/ukmedia_common.h" using namespace kdk; class UkmediaAppCtrlWidget : public KWidget { Q_OBJECT public: explicit UkmediaAppCtrlWidget(QWidget *parent = nullptr); ~UkmediaAppCtrlWidget(); void initUI(); void initData(); void dealSlot(); void addItem(QString appName); int getSystemVolume(); bool getSystemMuteState(); int getAppVolume(QString app); bool getAppMuteState(QString app); void getAppList(); void getAllPortInfo(); void getRecordAppInfo(); void getPlaybackAppInfo(); QStringList getAllInputPort(); QStringList getAllOutputPort(); QString getSystemInputDevice(); QString getSystemOutputDevice(); QString getAppInputDevice(QString app); QString getAppOutputDevice(QString app); private: KNavigationBar* m_pAppSoundCtrlBar; QStackedWidget* stackWidget; QStringList appList; //获å�–当å‰�存在的应用å��å�• QStringList sinkPortList; QStringList sourcePortList; QList recordAppInfoList; QList playbackAppInfoList; QMap portInfoMap; QDBusInterface* interface; bool setSystemVolume(int value); bool setSystemInputDevice(QString portLabel); bool setSystemOutputDevice(QString portLabel); int findAppDirection(QString appName); #ifdef PA_PROP_APPLICATION_MOVE bool checkAppMoveStatus(int appType, QString appName); #endif int indexOfItemCombobox(QString port, QComboBox *box); QString getAppName(QString appName); QString getAppIcon(QString appName); QString AppDesktopFileAdaption(QString appName); private Q_SLOTS: void updatePort(); void updateAppItem(QString appName); void removeAppItem(QString appName); void updateSystemVolume(int value); void updateSystemMuteState(bool state); void updateAppMuteState(QString app, bool state); // void appVolumeChangedSlot(QString app, QString appId, int volume); bool setAppMuteState(); bool setAppVolume(int value); bool setAppInputDevice(QString portLabel); bool setAppOutputDevice(QString portLabel); }; #endif // UKMEDIA_APP_DEVICE_CTRL_H ukui-media/audio/app-device-control/app-device-control.pri0000664000175000017500000000031715170054730022540 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/ukmedia_app_item_widget.h \ $$PWD/ukmedia_app_device_ctrl.h \ SOURCES += \ $$PWD/ukmedia_app_item_widget.cpp \ $$PWD/ukmedia_app_device_ctrl.cpp \ ukui-media/audio/app-device-control/ukmedia_app_device_ctrl.cpp0000664000175000017500000010527015170054730023663 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_app_device_ctrl.h" #include UkmediaAppCtrlWidget::UkmediaAppCtrlWidget(QWidget *parent) : KWidget(parent) { initData(); initUI(); dealSlot(); } void UkmediaAppCtrlWidget::initData() { interface = new QDBusInterface(UKUI_MEDIA_SERVICE, UKUI_MEDIA_PATH, UKUI_MEDIA_INTERFACE, QDBusConnection::sessionBus()); if (!interface->isValid()) return; //1.获å�–app列表 getAppList(); //2.获å�–所有å�¯ç”¨ç«¯å�£ä¿¡æ�¯ getAllPortInfo(); //3.获å�–å�¯ç”¨è¾“出端å�£ getAllOutputPort(); //4.获å�–å�¯ç”¨è¾“入端å�£ getAllInputPort(); } void UkmediaAppCtrlWidget::initUI() { setWidgetName(tr("App Sound Control")); setIcon(QIcon::fromTheme("ukui-control-center")); setWindowFlags(Qt::Dialog); stackWidget = new QStackedWidget(this); stackWidget->setFixedSize(560, 520); m_pAppSoundCtrlBar = new KNavigationBar(this); m_pAppSoundCtrlBar->setFixedSize(188,520); QBoxLayout *vLayout = new QVBoxLayout(); vLayout->addWidget(m_pAppSoundCtrlBar); sideBar()->setLayout(vLayout); vLayout = new QVBoxLayout; vLayout->addWidget(stackWidget); baseBar()->setLayout(vLayout); this->setLayoutType(HorizontalType); // 添加应用到导航æ � for (QString appName : appList) addItem(appName); // åˆ�始化UI 默认选中第一项 QStandardItemModel* m_mode = m_pAppSoundCtrlBar->model(); //获å�–mode if (m_mode->item(0,0)) m_pAppSoundCtrlBar->listview()->setCurrentIndex(m_mode->item(0,0)->index()); } void UkmediaAppCtrlWidget::addItem(QString appName) { // 获å�–应用 name QString iconName = getAppIcon(appName); QString pAppName = getAppName(appName); // 1.左边导航æ �增加标题 QStandardItem *item = new QStandardItem(QIcon::fromTheme(iconName), pAppName); m_pAppSoundCtrlBar->addItem(item); // 2.å�³è¾¹æ·»åŠ çª—å�£ UkmediaAppItemWidget* widget = new UkmediaAppItemWidget(); widget->setTitleName(pAppName); widget->setChildObjectName(appName); widget->setAttribute(Qt::WA_DeleteOnClose); stackWidget->addWidget(widget); // 3.设置app对应音é‡�滑动æ�¡å€¼ widget->setSliderValue(getAppVolume(appName)); widget->outputVolumeDarkThemeImage(getAppVolume(appName), getAppMuteState(appName)); // 4.设置app对应输出输入设备 for (QString sinkPortLabel : sinkPortList) widget->addOutputCombobox(sinkPortLabel); for (QString sourcePortLabel : sourcePortList) widget->addInputCombobox(sourcePortLabel); QString defaultInPort = getAppInputDevice(appName); QString defaultOutPort = getAppOutputDevice(appName); widget->m_pOutputCombobox->setCurrentText(defaultOutPort); widget->m_pInputCombobox->setCurrentText(defaultInPort); // 5.slots connect(widget->m_pVolumeSlider, &KSlider::valueChanged, this, &UkmediaAppCtrlWidget::setAppVolume); connect(widget->m_pVolumeBtn, &UkuiButtonDrawSvg::clicked, this, &UkmediaAppCtrlWidget::setAppMuteState); connect(widget->m_pInputCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { QComboBox *comboBox = qobject_cast(sender()); if (comboBox) { QString text = comboBox->itemText(index); setAppInputDevice(text); } }); connect(widget->m_pOutputCombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [this](int index) { QComboBox *comboBox = qobject_cast(sender()); if (comboBox) { QString text = comboBox->itemText(index); setAppOutputDevice(text); } }); connect(widget->m_pConfirmBtn, &QPushButton::clicked, this, [=](){ this->close(); }); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (appName.compare(QString(SYSTEM_VOLUME_CTRL)) == 0) { if (!sinkPortList.isEmpty()) { if (QString(sinkPortList.at(0)).compare(QString(tr("None"))) == 0) { widget->m_pVolumeSlider->setEnabled(false); widget->m_pVolumeBtn->setEnabled(false); } else { widget->m_pVolumeSlider->setEnabled(true); widget->m_pVolumeBtn->setEnabled(true); } } } #endif // 6.区分App类型 int appType = findAppDirection(appName); switch (appType) { case PA_STREAM_PLAYBACK: item->setData(PA_STREAM_PLAYBACK); widget->m_pInputCombobox->setDisabled(true); break; case PA_STREAM_RECORD: item->setData(PA_STREAM_RECORD); widget->m_pVolumeWidget->hide(); widget->m_pOutputCombobox->setDisabled(true); break; default: item->setData(PA_STREAM_NODIRECTION); break; } #ifdef PA_PROP_APPLICATION_MOVE widget->setInputHintWidgetShow(checkAppMoveStatus(PA_STREAM_RECORD, appName)); widget->setOutputHintWidgetShow(checkAppMoveStatus(PA_STREAM_PLAYBACK, appName)); #endif qDebug() << __func__ << "Application:" << appName << "Type:" << item->data().toInt(); } void UkmediaAppCtrlWidget::removeAppItem(QString appName) { int index = -1; for (int i = 0; i < appList.count(); i++) { if (appList.at(i) == appName) { index = i; appList.removeAt(i); break; } } if (index == -1) return; QWidget* w = stackWidget->widget(index); stackWidget->removeWidget(w); w->close(); delete w; m_pAppSoundCtrlBar->model()->removeRow(index); stackWidget->setCurrentIndex(m_pAppSoundCtrlBar->listview()->currentIndex().row()); qDebug() << __func__ << appName << "stackWidget:" << stackWidget->children(); } void UkmediaAppCtrlWidget::dealSlot() { // 导航æ �点击应用切æ�¢å¯¹åº”窗å�£slot connect(m_pAppSoundCtrlBar->listview(), &QListView::clicked, this, [=](const QModelIndex modelIndex) { int index = m_pAppSoundCtrlBar->listview()->currentIndex().row(); stackWidget->setCurrentIndex(index); });; QDBusConnection::sessionBus().connect(QString(), UKUI_MEDIA_CONTROL_PATH, UKUI_MEDIA_SERVICE, "updatePortSignal", this, SLOT(updatePort())); QDBusConnection::sessionBus().connect(QString(), UKUI_MEDIA_CONTROL_PATH, UKUI_MEDIA_SERVICE, "updateMute", this, SLOT(updateSystemMuteState(bool))); QDBusConnection::sessionBus().connect(QString(), UKUI_MEDIA_CONTROL_PATH, UKUI_MEDIA_SERVICE, "updateVolume", this, SLOT(updateSystemVolume(int))); QDBusConnection::sessionBus().connect(QString(), UKUI_MEDIA_CONTROL_PATH, UKUI_MEDIA_SERVICE, "updateApp", this, SLOT(updateAppItem(QString))); QDBusConnection::sessionBus().connect(QString(), UKUI_MEDIA_CONTROL_PATH, UKUI_MEDIA_SERVICE, "removeSinkInputSignal", this, SLOT(removeAppItem(QString))); // QDBusConnection::sessionBus().connect(QString(), // UKUI_MEDIA_CONTROL_PATH, // UKUI_MEDIA_SERVICE, // "sinkInputVolumeChangedSignal", // this, // SLOT(appVolumeChangedSlot(QString, QString, int))); } // 获å�–è¿�行应用å��å�• void UkmediaAppCtrlWidget::getAppList() { // 首先添加系统音é‡� appList << SYSTEM_VOLUME_CTRL; QDBusReply reply = interface->call("getAppList"); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return; } appList << reply.value(); getPlaybackAppInfo(); getRecordAppInfo(); } void UkmediaAppCtrlWidget::getPlaybackAppInfo() { qRegisterMetaType("appInfo"); qDBusRegisterMetaType(); QDBusReply> reply = interface->call("getPlaybackAppInfo"); QList list = reply.value(); for (int i = 0; i < list.count(); i++) { const QDBusArgument &dbusArgs = list.at(i).value(); while (!dbusArgs.atEnd()) { appInfo info; dbusArgs.beginStructure(); dbusArgs >> info.index; dbusArgs >> info.volume; dbusArgs >> info.channel; dbusArgs >> info.mute; dbusArgs >> info.direction; #ifdef PA_PROP_APPLICATION_MOVE dbusArgs >> info.move; #endif dbusArgs >> info.name; dbusArgs >> info.masterIndex; dbusArgs >> info.masterDevice; playbackAppInfoList.push_back(info); dbusArgs.endStructure(); qDebug() << __func__ << info.index << info.name << info.volume << info.masterDevice; } } } void UkmediaAppCtrlWidget::getRecordAppInfo() { qRegisterMetaType("appInfo"); qDBusRegisterMetaType(); QDBusReply> reply = interface->call("getRecordAppInfo"); QList list = reply.value(); for (int i = 0; i < list.count(); i++) { const QDBusArgument &dbusArgs = list.at(i).value(); while (!dbusArgs.atEnd()) { appInfo info; dbusArgs.beginStructure(); dbusArgs >> info.index; dbusArgs >> info.volume; dbusArgs >> info.channel; dbusArgs >> info.mute; dbusArgs >> info.direction; #ifdef PA_PROP_APPLICATION_MOVE dbusArgs >> info.move; #endif dbusArgs >> info.name; dbusArgs >> info.masterIndex; dbusArgs >> info.masterDevice; recordAppInfoList.push_back(info); dbusArgs.endStructure(); qDebug() << __func__ << info.index << info.name << info.volume << info.masterDevice << info.direction; } } } void UkmediaAppCtrlWidget::getAllPortInfo() { // 注册自定义结构体类型 qRegisterMetaType("pa_device_port_info"); qDBusRegisterMetaType(); QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.isConnected()) { qDebug() << "Cannot connect to D-Bus."; return ; } QDBusMessage message = QDBusMessage::createMethodCall(PULSEAUDIO_DEVICECONTROL_SERVICE, PULSEAUDIO_DEVICECONTROL_PATH, PULSEAUDIO_DEVICECONTROL_INTERFACE, "GetAllDeviceInfo"); QDBusMessage reply = bus.call(message); const QDBusArgument &dbusArgs = reply.arguments().at(0).value().variant().value(); QList devsInfo; dbusArgs.beginArray(); while (!dbusArgs.atEnd()) { pa_device_port_info info; dbusArgs.beginStructure(); dbusArgs >> info.card; dbusArgs >> info.direction; dbusArgs >> info.available; dbusArgs >> info.plugged_stauts; dbusArgs >> info.name; dbusArgs >> info.description; dbusArgs >> info.device_description; dbusArgs >> info.device_product_name; devsInfo.push_back(info); dbusArgs.endStructure(); } dbusArgs.endArray(); // 添加端å�£è‡³portInfoMap int count = 0; for (pa_device_port_info &info : devsInfo) { if (info.available == PA_PORT_AVAILABLE_YES || info.available == PA_PORT_AVAILABLE_UNKNOWN) { QString portLabel = info.description + "(" + info.device_description + ")"; info.description = portLabel; portInfoMap.insert(count, info); count++; } } } // 获å�–所有å�¯ç”¨è¾“出端å�£ QStringList UkmediaAppCtrlWidget::getAllOutputPort() { QMap::iterator it; for (it = portInfoMap.begin(); it != portInfoMap.end(); it++) { if (it.value().direction == PA_DIRECTION_OUTPUT) { sinkPortList << it.value().description; // Usb声å�¡å’Œè“�牙声å�¡å­˜åœ¨å¤šç§�é…�置文件,ä¿�留声å�¡å½“å‰�选择的é…�置文件端å�£ QDBusReply reply = interface->call("isPortHidingNeeded", SoundType::SINK, it.value().card, it.value().description); if (reply.value()) sinkPortList.removeAll(it.value().description); } } if (sinkPortList.isEmpty()) sinkPortList.append(tr("None")); return sinkPortList; } // 获å�–所有å�¯ç”¨è¾“入端å�£ QStringList UkmediaAppCtrlWidget::getAllInputPort() { QMap::iterator it; for (it = portInfoMap.begin(); it != portInfoMap.end(); it++) { if (it.value().direction == PA_DIRECTION_INPUT) { sourcePortList << it.value().description; QDBusReply reply = interface->call("isPortHidingNeeded", SoundType::SOURCE, it.value().card, it.value().description); if (reply.value()) sourcePortList.removeAll(it.value().description); } } if (sourcePortList.isEmpty()) sourcePortList.append(tr("None")); return sourcePortList; } // 获å�–系统音é‡� int UkmediaAppCtrlWidget::getSystemVolume() { QDBusReply reply = interface->call("getDefaultOutputVolume"); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return 0; } return reply.value(); } // 获å�–应用音é‡� int UkmediaAppCtrlWidget::getAppVolume(QString app) { if (app == SYSTEM_VOLUME_CTRL) return getSystemVolume(); QDBusReply reply = interface->call("getAppVolume", app); if(!reply.isValid()) { qWarning() << __func__ << "failed"; return 0; } return reply.value(); } bool UkmediaAppCtrlWidget::getSystemMuteState() { QDBusReply reply = interface->call("getDefaultOutputMuteState"); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } return reply.value(); } // 获å�–应用é�™éŸ³çжæ€� bool UkmediaAppCtrlWidget::getAppMuteState(QString app) { if (app == SYSTEM_VOLUME_CTRL) return getSystemMuteState(); QDBusReply reply = interface->call("getAppMuteState", app); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } return reply.value(); } // 获å�–系统默认输出设备 QString UkmediaAppCtrlWidget::getSystemOutputDevice() { QDBusReply reply = interface->call("getSystemOutputDevice"); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return ""; } return reply.value(); } // 获å�–系统默认输入设备 QString UkmediaAppCtrlWidget::getSystemInputDevice() { QDBusReply reply = interface->call("getSystemInputDevice"); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return ""; } return reply.value(); } // 获å�–应用默认输出设备 QString UkmediaAppCtrlWidget::getAppOutputDevice(QString app) { if (app == SYSTEM_VOLUME_CTRL) return getSystemOutputDevice(); QDBusReply reply = interface->call("getAppOutputDevice", app); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return ""; } return reply.value(); } // 获å�–应用默认输入设备 QString UkmediaAppCtrlWidget::getAppInputDevice(QString app) { if (app == SYSTEM_VOLUME_CTRL) return getSystemInputDevice(); QDBusReply reply = interface->call("getAppInputDevice", app); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return ""; } return reply.value(); } // 设置系统音é‡� bool UkmediaAppCtrlWidget::setSystemVolume(int value) { QDBusReply reply = interface->call("setDefaultOutputVolume", value); if (!reply.isValid()) return false; return reply.value(); } // 设置应用音é‡� bool UkmediaAppCtrlWidget::setAppVolume(int value) { QSlider *slider = qobject_cast(sender()); if (slider == nullptr) return false; QString app = slider->objectName(); UkmediaAppItemWidget *w = stackWidget->findChild(app); w->outputVolumeDarkThemeImage(value, getAppMuteState(app)); if (app == SYSTEM_VOLUME_CTRL) return setSystemVolume(value); QDBusReply reply = interface->call("setAppVolume", app, value); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } return reply.value(); } // 设置应用é�™éŸ³ bool UkmediaAppCtrlWidget::setAppMuteState() { UkuiButtonDrawSvg *btn = qobject_cast(sender()); if (btn == nullptr) return false; QString app = btn->objectName(); // 1.系统é�™éŸ³è®¾ç½® if (app == SYSTEM_VOLUME_CTRL) { QDBusReply reply1 = interface->call("getDefaultOutputMuteState"); if (!reply1.isValid()) return false; bool state = reply1.value(); QDBusReply reply2 = interface->call("setDefaultOutputMuteState", !state); if (!reply2.isValid()) return false; btn->outputVolumeDarkThemeImage(getAppVolume(app), !state); return reply2.value(); } // 2.应用é�™éŸ³è®¾ç½® QDBusReply reply1 = interface->call("getAppMuteState", app); if (!reply1.isValid()) return false; bool state = reply1.value(); QDBusReply reply = interface->call("setAppMuteState", app, !state); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } btn->outputVolumeDarkThemeImage(getAppVolume(app), !state); return reply.value(); } // 设置系统输入设备 bool UkmediaAppCtrlWidget::setSystemInputDevice(QString portLabel) { QDBusReply reply = interface->call("setSystemInputDevice", portLabel); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } return reply.value(); } // 设置系统输出设备 bool UkmediaAppCtrlWidget::setSystemOutputDevice(QString portLabel) { QDBusReply reply = interface->call("setSystemOutputDevice", portLabel); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } return reply.value(); } // 设置应用输出设备 bool UkmediaAppCtrlWidget::setAppOutputDevice(QString portLabel) { QComboBox *combobox = qobject_cast(sender()); if (combobox == nullptr) return false; QString app = combobox->objectName().split("-output").at(0); if (app == SYSTEM_VOLUME_CTRL) return setSystemOutputDevice(portLabel); int cardIndex = -1; QString sinkPortName; QMap::iterator it; for (it = portInfoMap.begin(); it != portInfoMap.end(); it++) { pa_device_port_info info = it.value(); if (portLabel == info.description && info.direction == 1) { cardIndex = info.card; sinkPortName = info.name; } } QDBusReply reply = interface->call("setAppOutputDevice", app, cardIndex, sinkPortName); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } if (!reply.value()) { combobox->blockSignals(true); combobox->setCurrentText(getAppOutputDevice(app)); combobox->blockSignals(false); qDebug() << __func__ << "failed"; return false; } return reply.value(); } // 设置应用输入设备 bool UkmediaAppCtrlWidget::setAppInputDevice(QString portLabel) { QComboBox *combobox = qobject_cast(sender()); if (combobox == nullptr) return false; QString app = combobox->objectName().split("-input").at(0); if (app == SYSTEM_VOLUME_CTRL) return setSystemInputDevice(portLabel); int cardIndex = -1; QString sourcePortName; QMap::iterator it; for (it = portInfoMap.begin(); it != portInfoMap.end(); it++) { pa_device_port_info info = it.value(); if (portLabel == info.description && info.direction == 2) { cardIndex = info.card; sourcePortName = info.name; } } QDBusReply reply = interface->call("setAppInputDevice", app, cardIndex, sourcePortName); if (!reply.isValid()) { qWarning() << __func__ << "failed"; return false; } if (!reply.value()) { combobox->blockSignals(true); combobox->setCurrentText(getAppInputDevice(app)); combobox->blockSignals(false); qDebug() << __func__ << "failed"; return false; } return reply.value(); } void UkmediaAppCtrlWidget::updateAppItem(QString appName) { playbackAppInfoList.clear(); recordAppInfoList.clear(); getPlaybackAppInfo(); getRecordAppInfo(); if (!appList.contains(appName)) { appList << appName; addItem(appName); return; } else { UkmediaAppItemWidget *w = stackWidget->findChild(appName); w->setSliderValue(getAppVolume(appName)); w->outputVolumeDarkThemeImage(getAppVolume(appName), getAppMuteState(appName)); int appType = findAppDirection(appName); switch (appType) { case PA_STREAM_PLAYBACK: w->m_pVolumeWidget->show(); w->m_pInputCombobox->setDisabled(true); w->m_pOutputCombobox->setDisabled(false); qDebug() << __func__ << appName << "PA_STREAM_PLAYBACK"; break; case PA_STREAM_RECORD: w->m_pVolumeWidget->hide(); w->m_pInputCombobox->setDisabled(false); w->m_pOutputCombobox->setDisabled(true); qDebug() << __func__ << appName << "PA_STREAM_RECORD"; break; default: w->m_pVolumeWidget->show(); w->m_pInputCombobox->setDisabled(false); w->m_pOutputCombobox->setDisabled(false); qDebug() << __func__ << appName << "PA_STREAM_NODIRECTION"; break; } #ifdef PA_PROP_APPLICATION_MOVE w->setInputHintWidgetShow(checkAppMoveStatus(PA_STREAM_RECORD, appName)); w->setOutputHintWidgetShow(checkAppMoveStatus(PA_STREAM_PLAYBACK, appName)); #endif } } // å�Œæ­¥ç³»ç»ŸéŸ³é‡� void UkmediaAppCtrlWidget::updateSystemVolume(int value) { UkmediaAppItemWidget *w = stackWidget->findChild(SYSTEM_VOLUME_CTRL); int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); w->setSliderValue(mediaVolume); w->outputVolumeDarkThemeImage(mediaVolume, getSystemMuteState()); for (int i = 0; i < appList.count(); i++) { QString appName = appList.at(i); UkmediaAppItemWidget *w = stackWidget->findChild(appName); w->m_pOutputCombobox->blockSignals(true); w->m_pOutputCombobox->setCurrentText(getAppOutputDevice(appName)); w->m_pOutputCombobox->blockSignals(false); w->m_pInputCombobox->blockSignals(true); w->m_pInputCombobox->setCurrentText(getAppInputDevice(appName)); w->m_pInputCombobox->blockSignals(false); } } // å�Œæ­¥åº”用音é‡� //void UkmediaAppCtrlWidget::appVolumeChangedSlot(QString app, QString appId, int volume) //{ // QSlider *slider = stackWidget->findChild(app); // QLabel *sliderLabel = stackWidget->findChild(app+"-label"); // if (slider == nullptr || sliderLabel == nullptr) // return; // int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(volume); // slider->blockSignals(true); // slider->setValue(mediaVolume); // slider->blockSignals(false); // QString percent = QString::number(mediaVolume); // sliderLabel->setText(percent+"%"); // for (QString appName : appList) { // QComboBox *outputBox = stackWidget->findChild(appName + "-output"); // QComboBox *inputBox = stackWidget->findChild(appName + "-output"); // inputBox->blockSignals(true); // outputBox->blockSignals(true); // QString defaultOutPort = getAppOutputDevice(appName); // QString defaultInPort = getAppInputDevice(appName); // inputBox->setCurrentText(defaultInPort); // outputBox->setCurrentText(defaultOutPort); // outputBox->blockSignals(false); // inputBox->blockSignals(false); // } // qDebug() << __func__ << app << volume << stackWidget->children(); //} // å�Œæ­¥ç³»ç»Ÿé�™éŸ³çжæ€� void UkmediaAppCtrlWidget::updateSystemMuteState(bool state) { UkuiButtonDrawSvg *btn = stackWidget->findChild(SYSTEM_VOLUME_CTRL); btn->outputVolumeDarkThemeImage(getSystemVolume(), state); } // å�Œæ­¥åº”用é�™éŸ³çжæ€� void UkmediaAppCtrlWidget::updateAppMuteState(QString app, bool state) { UkuiButtonDrawSvg *btn = stackWidget->findChild(app); btn->outputVolumeDarkThemeImage(getAppVolume(app), state); } void UkmediaAppCtrlWidget::updatePort() { qDebug() << __func__ << sinkPortList; QStringList currentSinkPortList = sinkPortList; QStringList currentSourcePortList = sourcePortList; portInfoMap.clear(); sinkPortList.clear(); sourcePortList.clear(); getAllPortInfo(); getAllInputPort(); getAllOutputPort(); // 1. 删除ä¸�å�¯ç”¨è¾“出端å�£ for (int i = 0; i < currentSinkPortList.count(); i++) { QString port = currentSinkPortList.at(i); if (!sinkPortList.contains(port)) { for (int a = 0; a < appList.count(); a++) { QString appName = appList.at(a); UkmediaAppItemWidget *w = stackWidget->findChild(appName); int index = indexOfItemCombobox(port, w->m_pOutputCombobox); w->m_pOutputCombobox->blockSignals(true); w->m_pOutputCombobox->removeItem(index); w->m_pOutputCombobox->blockSignals(false); } } } // 2. 删除ä¸�å�¯ç”¨è¾“入端å�£ for (int i = 0; i < currentSourcePortList.count(); i++) { QString port = currentSourcePortList.at(i); if (!sourcePortList.contains(port)) { for (int a = 0; a < appList.count(); a++) { QString appName = appList.at(a); UkmediaAppItemWidget *w = stackWidget->findChild(appName); int index = indexOfItemCombobox(port, w->m_pInputCombobox); w->m_pInputCombobox->blockSignals(true); w->m_pInputCombobox->removeItem(index); w->m_pInputCombobox->blockSignals(false); } } } // 3. 增加å�¯ç”¨è¾“出端å�£ for (int i = 0; i < sinkPortList.count(); i++) { QString port = sinkPortList.at(i); if (!currentSinkPortList.contains(port)) { for (int a = 0; a < appList.count(); a++) { QString appName = appList.at(a); UkmediaAppItemWidget *w = stackWidget->findChild(appName); w->m_pOutputCombobox->blockSignals(true); w->m_pOutputCombobox->addItem(port); w->m_pOutputCombobox->blockSignals(false); } } } // 4. 增加å�¯ç”¨è¾“入端å�£ for (int i = 0; i < sourcePortList.count(); i++) { QString port = sourcePortList.at(i); if (!currentSourcePortList.contains(port)) { for (int a = 0; a < appList.count(); a++) { QString appName = appList.at(a); UkmediaAppItemWidget *w = stackWidget->findChild(appName); w->m_pInputCombobox->blockSignals(true); w->m_pInputCombobox->addItem(port); w->m_pInputCombobox->blockSignals(false); } } } // 5. 选择默认输出设备 for (int i = 0; i < appList.count(); i++) { QString appName = appList.at(i); UkmediaAppItemWidget *w = stackWidget->findChild(appName); w->m_pOutputCombobox->blockSignals(true); w->m_pOutputCombobox->setCurrentText(getAppOutputDevice(appName)); w->m_pOutputCombobox->blockSignals(false); w->m_pInputCombobox->blockSignals(true); w->m_pInputCombobox->setCurrentText(getAppInputDevice(appName)); w->m_pInputCombobox->blockSignals(false); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (appName.compare(QString(SYSTEM_VOLUME_CTRL)) == 0) { if (!sinkPortList.isEmpty()) { if (QString(sinkPortList.at(0)).compare(QString(tr("None"))) == 0) { w->m_pVolumeSlider->setEnabled(false); w->m_pVolumeBtn->setEnabled(false); } else { w->m_pVolumeSlider->setEnabled(true); w->m_pVolumeBtn->setEnabled(true); } } } #endif } } int UkmediaAppCtrlWidget::indexOfItemCombobox(QString port, QComboBox *box) { for (int index = 0; index < box->count(); ++index) { QString textport = box->itemText(index); if (textport == port) { return index; } } return -1; } QString UkmediaAppCtrlWidget::getAppName(QString appName) { GError* error = nullptr; GKeyFileFlags flag = G_KEY_FILE_NONE; GKeyFile* keyfile = g_key_file_new(); appName = AppDesktopFileAdaption(appName); QString path = "/usr/share/applications/"; path.append(appName); path.append(".desktop"); /* Some applications desktop file exist in /etc/xdg/autostart/ path */ QFileInfo file(path); if (!file.exists()) { path = "/etc/xdg/autostart/"; path.append(appName); path.append(".desktop"); } QByteArray fpbyte = path.toLocal8Bit(); char* filepath = fpbyte.data(); if (!g_key_file_load_from_file(keyfile, filepath, flag, &error)) qDebug() << "g_key_file_load_from_file() failed" << error->message; char* name= g_key_file_get_locale_string(keyfile, "Desktop Entry", "Name", nullptr, nullptr); QString namestr=QString::fromLocal8Bit(name); g_key_file_free(keyfile); if (appName == SYSTEM_VOLUME_CTRL) namestr = tr("System Volume"); namestr = (namestr != "") ? namestr : appName; return namestr; } QString UkmediaAppCtrlWidget::getAppIcon(QString appName) { GError** error=nullptr; GKeyFileFlags flags=G_KEY_FILE_NONE; GKeyFile* keyfile=g_key_file_new (); appName = AppDesktopFileAdaption(appName); QString path = "/usr/share/applications/"; path.append(appName); path.append(".desktop"); /* Some applications desktop file exist in /etc/xdg/autostart/ path */ QFileInfo file(path); if (!file.exists()) { path = "/etc/xdg/autostart/"; path.append(appName); path.append(".desktop"); } QByteArray fpbyte=path.toLocal8Bit(); char* filepath=fpbyte.data(); g_key_file_load_from_file(keyfile,filepath,flags,error); char* name=g_key_file_get_locale_string(keyfile,"Desktop Entry","Icon", nullptr, nullptr); QString namestr=QString::fromLocal8Bit(name); g_key_file_free(keyfile); if (appName == SYSTEM_VOLUME_CTRL) namestr = SYSTEM_VOLUME_CTRL; /* If we can't find the app icon * we need to set a default icon for it */ namestr = (namestr != "") ? namestr : "application-x-desktop"; return namestr; } int UkmediaAppCtrlWidget::findAppDirection(QString appName) { int stream = PA_STREAM_NODIRECTION; for (appInfo info : playbackAppInfoList) { if (info.name == appName) { stream = PA_STREAM_PLAYBACK; break; } } for (appInfo info : recordAppInfoList) { if (info.name == appName) { if (stream == PA_STREAM_PLAYBACK) stream = PA_STREAM_NODIRECTION; else stream = PA_STREAM_RECORD; break; } } return stream; } #ifdef PA_PROP_APPLICATION_MOVE bool UkmediaAppCtrlWidget::checkAppMoveStatus(int appType, QString appName) { bool moveStatus = false; if (appName == SYSTEM_VOLUME_CTRL) return true; if (appType == PA_STREAM_PLAYBACK) { //start #227383 if ((appName == "kylin-recorder") && (findAppDirection(appName) == PA_STREAM_NODIRECTION)) { return false; } //end for (appInfo info : playbackAppInfoList) { if (info.name == appName) { moveStatus = (info.move == "yes") ? true : false; break; } } } else { for (appInfo info : recordAppInfoList) { // #214516 Circumvention deals with kylin-recorder if (appName == "kylin-recorder") return false; if (info.name == appName) { moveStatus = (info.move == "yes") ? true : false; break; } } } return moveStatus; } #endif QString UkmediaAppCtrlWidget::AppDesktopFileAdaption(QString appName) { //æŸ�些第三方应用获å�–到appName与它的desktop文件å��ä¸�一致,需手动适é…� if (appName.contains("qaxbrowser")) appName = "qaxbrowser-safe"; return appName; } UkmediaAppCtrlWidget::~UkmediaAppCtrlWidget() { } ukui-media/audio/app-device-control/ukmedia_app_item_widget.cpp0000664000175000017500000003063015170054730023676 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_app_item_widget.h" UkmediaAppItemWidget::UkmediaAppItemWidget(QWidget *parent) : QWidget(parent) { if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *nThemeSetting = new QGSettings("org.ukui.style"); if (nThemeSetting->keys().contains("styleName")) { mThemeName = nThemeSetting->get("style-name").toString(); } } initUI(); onPaletteChanged(); } void UkmediaAppItemWidget::initUI() { this->setFixedSize(560,477); m_pAppLabel = new FixLabel(tr("Application"), this); m_pAppLabel->setContentsMargins(17,0,0,0); m_pAppWidget = new QFrame(this); m_pInputWidget = new QFrame(m_pAppWidget); m_pOutputWidget = new QFrame(m_pAppWidget); m_pVolumeWidget = new QFrame(m_pAppWidget); m_pCheckWidget = new QFrame(m_pAppWidget); m_pAppWidget->setFrameShape(QFrame::Shape::Box); m_pInputWidget->setFrameShape(QFrame::Shape::Box); m_pOutputWidget->setFrameShape(QFrame::Shape::Box); m_pVolumeWidget->setFrameShape(QFrame::Shape::Box); m_pCheckWidget->setFrameShape(QFrame::Shape::Box); m_pInputWidget->setObjectName("InputWidget"); m_pOutputWidget->setObjectName("OutputWidget"); m_pVolumeWidget->setObjectName("VolumeWidget"); m_pAppWidget->setFixedSize(512, 415); m_pInputWidget->setFixedSize(512, 90); m_pOutputWidget->setFixedSize(512, 90); m_pVolumeWidget->setFixedSize(512, 60); m_pCheckWidget->setFixedSize(512, 36); //应用音é‡�布局 m_pVolumeLabel = new FixLabel(tr("Output Volume"), m_pVolumeWidget); m_pVolumeBtn = new UkuiButtonDrawSvg(m_pVolumeWidget); m_pVolumeSlider = new KSlider(m_pVolumeWidget); m_pVolumeSlider->setRange(0,100); m_pVolumeSlider->setSliderType(SmoothSlider); m_pVolumeSlider->setNodeVisible(false); m_pVolumeNumLabel = new FixLabel("0%", m_pVolumeWidget); m_pVolumeBtn->setFixedSize(24,24); m_pVolumeSlider->setFixedSize(260,55); m_pVolumeLabel->setFixedSize(120,20); m_pVolumeNumLabel->setFixedSize(55,20); m_pVolumeSlider->setOrientation(Qt::Horizontal); m_pVolumeNumLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); QHBoxLayout *volumeLayout = new QHBoxLayout(m_pVolumeWidget); volumeLayout->addItem(new QSpacerItem(17,20,QSizePolicy::Fixed)); volumeLayout->addWidget(m_pVolumeLabel); volumeLayout->addItem(new QSpacerItem(12,20,QSizePolicy::Expanding)); volumeLayout->addWidget(m_pVolumeBtn); volumeLayout->addItem(new QSpacerItem(10,20,QSizePolicy::Fixed)); volumeLayout->addWidget(m_pVolumeSlider); // volumeLayout->addItem(new QSpacerItem(14,20,QSizePolicy::Fixed)); volumeLayout->addWidget(m_pVolumeNumLabel); volumeLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); volumeLayout->setSpacing(0); m_pVolumeWidget->setLayout(volumeLayout); m_pVolumeWidget->layout()->setContentsMargins(0,0,0,0); //输入设备布局 m_pInputDevLabel = new FixLabel(tr("Input Device"), m_pInputWidget); m_pInputCombobox = new QComboBox(m_pInputWidget); m_pInputDevLabel->setFixedSize(120, 36); m_pInputCombobox->setFixedSize(347, 36); m_pInputHintIcon = new QLabel(m_pInputWidget); m_pInputHintIcon->setFixedSize(16, 16); m_pInputHintIcon->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(16, 16))); m_pInputHintLabel = new FixLabel(tr("This case does not support setting the input device"), m_pInputWidget); m_pInputHintWidget = new QFrame(m_pInputWidget); QHBoxLayout *lay = new QHBoxLayout(m_pInputHintWidget); lay->addWidget(m_pInputHintIcon); lay->addWidget(m_pInputHintLabel); lay->setSpacing(3); m_pInputHintWidget->setLayout(lay); m_pInputHintWidget->layout()->setContentsMargins(0, 0, 0, 0); QGridLayout *gridLayout = new QGridLayout(m_pInputWidget); gridLayout->addWidget(m_pInputDevLabel, 0, 0); gridLayout->addWidget(m_pInputCombobox, 0, 1); gridLayout->addItem(new QSpacerItem(132, 20, QSizePolicy::Fixed), 1, 0); gridLayout->addWidget(m_pInputHintWidget); gridLayout->setSpacing(0); m_pInputWidget->setLayout(gridLayout); m_pInputWidget->layout()->setContentsMargins(17, 11, 16, 0); //输出设备布局 m_pOutputDevLabel = new FixLabel(tr("Output Device"), m_pOutputWidget); m_pOutputCombobox = new QComboBox(m_pOutputWidget); m_pOutputDevLabel->setFixedSize(120, 36); m_pOutputCombobox->setFixedSize(347, 36); m_pOutputHintIcon = new QLabel(m_pOutputWidget); m_pOutputHintIcon->setFixedSize(16, 16); m_pOutputHintIcon->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(QSize(16, 16))); m_pOutputHintLabel = new FixLabel(tr("This case does not support setting the output device"), m_pOutputWidget); m_pOutputHintWidget = new QFrame(m_pOutputWidget); QHBoxLayout *outputLay = new QHBoxLayout(m_pOutputHintWidget); outputLay->addWidget(m_pOutputHintIcon); outputLay->addWidget(m_pOutputHintLabel); outputLay->setSpacing(3); m_pOutputHintWidget->setLayout(outputLay); m_pOutputHintWidget->layout()->setContentsMargins(0, 0, 0, 0); QGridLayout *outputGridLayout = new QGridLayout(m_pOutputWidget); outputGridLayout->addWidget(m_pOutputDevLabel, 0, 0); outputGridLayout->addWidget(m_pOutputCombobox, 0, 1); outputGridLayout->addItem(new QSpacerItem(132, 20, QSizePolicy::Fixed), 1, 0); outputGridLayout->addWidget(m_pOutputHintWidget); outputGridLayout->setSpacing(0); m_pOutputWidget->setLayout(outputGridLayout); m_pOutputWidget->layout()->setContentsMargins(17, 11, 16, 0); // check Btn m_pConfirmBtn = new QPushButton(tr("Confirm"), m_pCheckWidget); m_pConfirmBtn->setFixedSize(96, 36); m_pConfirmBtn->setProperty("isImportant", true); QHBoxLayout *checkLayout = new QHBoxLayout(m_pCheckWidget); checkLayout->addStretch(); checkLayout->addWidget(m_pConfirmBtn); checkLayout->setSpacing(0); m_pCheckWidget->setLayout(checkLayout); m_pCheckWidget->layout()->setContentsMargins(0,0,0,0); // line1 = myLine(); // line2 = myLine(); QVBoxLayout *vlayout = new QVBoxLayout(m_pAppWidget); vlayout->addWidget(m_pVolumeWidget); vlayout->addSpacing(1); vlayout->addWidget(m_pOutputWidget); vlayout->addSpacing(1); vlayout->addWidget(m_pInputWidget); vlayout->addItem(new QSpacerItem(16,197,QSizePolicy::Fixed)); vlayout->addStretch(); vlayout->addWidget(m_pCheckWidget); vlayout->setSpacing(0); vlayout->setContentsMargins(0,0,0,0); //整体布局 QVBoxLayout *appLayout = new QVBoxLayout(this); appLayout->addItem(new QSpacerItem(16,8,QSizePolicy::Fixed)); appLayout->addWidget(m_pAppLabel); appLayout->addItem(new QSpacerItem(16,8,QSizePolicy::Fixed)); appLayout->addWidget(m_pAppWidget); appLayout->addItem(new QSpacerItem(16,24,QSizePolicy::Fixed)); appLayout->addStretch(); appLayout->setSpacing(0); this->setLayout(appLayout); this->layout()->setContentsMargins(25,0,23,0); } void UkmediaAppItemWidget::setInputHintWidgetShow(bool status) { if (status) { m_pInputHintWidget->hide(); m_pInputWidget->setFixedSize(512, 60); m_pInputCombobox->setDisabled(false); } else { m_pInputHintWidget->show(); m_pInputWidget->setFixedSize(512, 90); m_pInputCombobox->setDisabled(true); } } void UkmediaAppItemWidget::setOutputHintWidgetShow(bool status) { if (status) { m_pOutputHintWidget->hide(); m_pOutputWidget->setFixedSize(512, 60); m_pOutputCombobox->setDisabled(false); } else { m_pOutputHintWidget->show(); m_pOutputWidget->setFixedSize(512, 90); m_pOutputCombobox->setDisabled(true); } } // 设置窗å�£åº”用标题 void UkmediaAppItemWidget::setTitleName(QString name) { m_pAppLabel->setText(name); } void UkmediaAppItemWidget::setChildObjectName(QString name) { m_pVolumeNumLabel->setObjectName(name+"-label"); m_pVolumeBtn->setObjectName(name); m_pVolumeSlider->setObjectName(name); m_pInputCombobox->setObjectName(name+"-input"); m_pOutputCombobox->setObjectName(name+"-output"); this->setObjectName(name); } void UkmediaAppItemWidget::setSliderValue(int value) { if (m_pVolumeSlider->objectName() == "kylin-settings-system") { if (QGSettings::isSchemaInstalled("org.ukui.sound")) { QGSettings *nThemeSetting = new QGSettings("org.ukui.sound"); if (nThemeSetting->keys().contains("volumeIncrease")) { if (nThemeSetting->get("volumeIncrease").toBool()) m_pVolumeSlider->setRange(0, 125); } } } m_pVolumeSlider->blockSignals(true); m_pVolumeSlider->setValue(value); m_pVolumeSlider->blockSignals(false); QString percent = QString::number(value); m_pVolumeNumLabel->setText(percent+"%"); } void UkmediaAppItemWidget::addInputCombobox(QString port) { m_pInputCombobox->blockSignals(true); m_pInputCombobox->addItem(port); m_pInputCombobox->blockSignals(false); } void UkmediaAppItemWidget::addOutputCombobox(QString port) { m_pOutputCombobox->blockSignals(true); m_pOutputCombobox->addItem(port); m_pOutputCombobox->blockSignals(false); } void UkmediaAppItemWidget::onPaletteChanged() { QPalette palette = m_pInputHintLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::Text, color); m_pInputHintLabel->setPalette(palette); palette = m_pOutputHintLabel->palette(); color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::Text, color); m_pOutputHintLabel->setPalette(palette); if (mThemeName == UKUI_THEME_LIGHT || mThemeName == UKUI_THEME_DEFAULT) { m_pInputWidget->setStyleSheet("#InputWidget{border-radius: 6px; background-color: #F5F5F5;}"); m_pOutputWidget->setStyleSheet("#OutputWidget{border-radius: 6px; background-color: #F5F5F5;}"); m_pVolumeWidget->setStyleSheet("#VolumeWidget{border-radius: 6px; background-color: #F5F5F5;}"); } else if (mThemeName == UKUI_THEME_DARK) { m_pInputWidget->setStyleSheet("#InputWidget{border-radius: 6px; background-color: #333333;}"); m_pOutputWidget->setStyleSheet("#OutputWidget{border-radius: 6px; background-color: #333333;}"); m_pVolumeWidget->setStyleSheet("#VolumeWidget{border-radius: 6px; background-color: #333333;}"); } } // 更新音é‡�图标 void UkmediaAppItemWidget::outputVolumeDarkThemeImage(int value, bool status) { QImage image; QColor color = QColor(0,0,0,216); if (mThemeName == UKUI_THEME_LIGHT || mThemeName == UKUI_THEME_DEFAULT) color = QColor(0,0,0,216); else if (mThemeName == UKUI_THEME_DARK) color = QColor(255,255,255,216); if (status) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value <= 0) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value > 0 && value <= 33) { image = QIcon::fromTheme("audio-volume-low-symbolic").pixmap(24,24).toImage(); } else if (value >33 && value <= 66) { image = QIcon::fromTheme("audio-volume-medium-symbolic").pixmap(24,24).toImage(); } else { image = QIcon::fromTheme("audio-volume-high-symbolic").pixmap(24,24).toImage(); } m_pVolumeBtn->refreshIcon(image, color); } QFrame* UkmediaAppItemWidget::myLine() { QFrame *line = new QFrame(this); line->setFixedSize(512, 1); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } UkmediaAppItemWidget::~UkmediaAppItemWidget() { } ukui-media/audio/titlelabel.cpp0000664000175000017500000000303415170052044015456 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "titlelabel.h" #include #include #include #include TitleLabel::TitleLabel(QWidget *parent): QLabel(parent) { /*åˆ�始化字体*/ // QFont font; // QGSettings *m_fontSetting = new QGSettings("org.ukui.style"); // font.setFamily(m_fontSetting->get("systemFont").toString()); // font.setPixelSize(m_fontSetting->get("systemFontSize").toInt() * 18 / 11); //设置的是pt,按照公å¼�计算为px,标题默认字为18px // font.setWeight(QFont::Medium); // this->setFont(font); this ->setContentsMargins(16,0,0,0); // delete m_fontSetting; // m_fontSetting = nullptr; } TitleLabel::~TitleLabel() { } ukui-media/audio/ukui_list_widget_item.h0000664000175000017500000000405415170054730017402 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKUILISTWIDGETITEM_H #define UKUILISTWIDGETITEM_H #include #include #include #include #include #include #include #include class UkuiListWidget : public QListWidget { Q_OBJECT public: UkuiListWidget(QWidget *parent = nullptr); ~UkuiListWidget(); protected: void paintEvent(QPaintEvent*event) { int i; for (i = 0 ;i < this->count();i++) { QListWidgetItem *item = this->item(i); // item->setTextColor(QColor(0,0,0,0)); delete item; } QListWidget::paintEvent(event); } }; class UkuiListWidgetItem : public QWidget { Q_OBJECT public: UkuiListWidgetItem(QWidget *parent = 0); ~UkuiListWidgetItem(); public: void setLabelText(QString portText,QString deviceLabel); // void setLabelTextIsWhite(bool selected); void setSelected(bool selected); // QString text(); QString portName; QLabel * portLabel; QLabel * deviceLabel; protected: // void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *ev); private: QWidget * widget; }; #endif // UKUILISTWIDGETITEM_H ukui-media/audio/ukmedia_input_widget.h0000664000175000017500000000461215170054730017212 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIAINPUTWIDGET_H #define UKMEDIAINPUTWIDGET_H #include #include #include #include #include #include #include "ukmedia_output_widget.h" #include #include #include #include #include "ukui_custom_style.h" #include "kswitchbutton.h" using namespace kdk; class UkmediaInputWidget : public QWidget { Q_OBJECT public: explicit UkmediaInputWidget(QWidget *parent = nullptr); ~UkmediaInputWidget(); friend class UkmediaMainWidget; Q_SIGNALS: public Q_SLOTS: void onPaletteChanged(); private: void setLabelAlignment(Qt::Alignment alignment); QFrame* myLine(); private: QFrame *m_pInputWidget; QFrame *m_pVolumeWidget; QFrame *m_pInputLevelWidget; QFrame *m_pNoiseReducteWidget; QFrame *m_pLoopBackWidget; QFrame *m_pLoopbackLine; TitleLabel *m_pInputLabel; FixLabel *m_pInputDeviceLabel; FixLabel *m_pIpVolumeLabel; FixLabel *m_pInputLevelLabel; QLabel *m_pIpVolumePercentLabel; FixLabel *m_pNoiseReducteLabel; UkuiButtonDrawSvg *m_pInputIconBtn; AudioSlider *m_pIpVolumeSlider; QProgressBar *m_pInputLevelProgressBar; KSwitchButton *m_pNoiseReducteButton; QString sliderQss; QVBoxLayout *m_pVlayout; QComboBox *m_pInputDeviceSelectBox; QFrame *m_pInputSlectWidget; FixLabel *m_pLoopBackLabel; FixLabel *m_pLoopBackTipsLabel; KSwitchButton *m_pLoopBackButton; }; #endif // UKMEDIAINPUTWIDGET_H ukui-media/audio/ukui_custom_style.h0000664000175000017500000000614715170054730016605 0ustar fengfeng /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKUICUSTOMSTYLE_H #define UKUICUSTOMSTYLE_H #include #include #include #include #include #include #include "kslider.h" #include #include #include #include using namespace kdk; static QColor symbolic_color = Qt::gray; //文本长自动çœ�略并添加悬浮 class FixLabel : public QLabel { Q_OBJECT public: explicit FixLabel(QWidget *parent = nullptr); explicit FixLabel(QString text , QWidget *parent = nullptr); ~FixLabel(); void setText(const QString &text, bool saveTextFlag = true); QString fullText; private: void paintEvent(QPaintEvent *event); private: }; class AudioSlider : public KSlider { Q_OBJECT public: AudioSlider(QWidget *parent = nullptr); ~AudioSlider(); bool isMouseWheel = false; private: int blueValue = 0; Q_SIGNALS: void blueValueChanged(int value); //针对è“�牙a2dp模å¼�下滑动æ�¡è·³åŠ¨ï¼Œä»¥10为间隔设置音é‡� protected: void wheelEvent(QWheelEvent *e); void keyReleaseEvent(QKeyEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); }; class UkmediaVolumeSlider : public KSlider { Q_OBJECT public: UkmediaVolumeSlider(QWidget *parent = nullptr); ~UkmediaVolumeSlider(); void initStyleOption(QStyleOptionSlider *option); void showTooltip(); protected: bool eventFilter(QObject *watched, QEvent *event); }; class UkuiButtonDrawSvg:public QPushButton { Q_OBJECT public: UkuiButtonDrawSvg(QWidget *parent = nullptr); ~UkuiButtonDrawSvg(); QPixmap filledSymbolicColoredPixmap(QImage &source, QColor &baseColor); QRect IconGeometry(); void drawIcon(QPaintEvent* e); //绘制图标 void refreshIcon(QImage image ,QColor color); //刷新图标 void outputVolumeDarkThemeImage(int value, bool status); friend class UkmediaMainWidget; protected: void paintEvent(QPaintEvent *event); bool event(QEvent *e); private: QImage mImage; QColor mColor; bool mousePress = false; }; class TitleLabel : public QLabel { Q_OBJECT public: TitleLabel(QWidget *parent = nullptr); ~TitleLabel(); }; #endif // UKUICUSTOMSTYLE_H ukui-media/audio/ukmedia_volume_control.cpp0000664000175000017500000021663615170054730020125 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_volume_control.h" #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include //pa_sink_info *m_pDefaultSink; /* Used for profile sorting */ struct profile_prio_compare { bool operator() (pa_card_profile_info2 const * const lhs, pa_card_profile_info2 const * const rhs) const { if (lhs->priority == rhs->priority) return strcmp(lhs->name, rhs->name) > 0; return lhs->priority > rhs->priority; } }; struct sink_port_prio_compare { bool operator() (const pa_sink_port_info& lhs, const pa_sink_port_info& rhs) const { if (lhs.priority == rhs.priority) return strcmp(lhs.name, rhs.name) > 0; return lhs.priority > rhs.priority; } }; struct source_port_prio_compare { bool operator() (const pa_source_port_info& lhs, const pa_source_port_info& rhs) const { if (lhs.priority == rhs.priority) return strcmp(lhs.name, rhs.name) > 0; return lhs.priority > rhs.priority; } }; pa_context* UkmediaVolumeControl::context = nullptr; int UkmediaVolumeControl::reconnectTimeout = 3; pa_mainloop_api* UkmediaVolumeControl::api = nullptr; QTimer UkmediaVolumeControl::deviceChangedTimer; UkmediaVolumeControl::UkmediaVolumeControl(): m_connected(false), m_config_filename(nullptr) { profileNameMap.clear(); connectToPulse(this); } /* * 设置输出设备é�™éŸ³ */ void UkmediaVolumeControl::setSinkMute(bool status) { pa_operation* o; if (!(o = pa_context_set_sink_mute_by_index(getContext(), sinkIndex, status, nullptr, nullptr))) { showError(tr("pa_context_set_sink_mute_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } /* * 设置输出设备音é‡� */ void UkmediaVolumeControl::setSinkVolume(int index, int value) { if (nullptr == m_pDefaultSink) { qWarning() << "m_pDefaultSink is nullptr, set sink volume failed"; return; } pa_cvolume v = m_pDefaultSink->volume; v.channels = channel; for (int i = 0; i < v.channels; i++) v.values[i] = value; if (balance != 0) pa_cvolume_set_balance(&v, &channelMap, balance); /* To set the volume in silent state, unmute the volume first */ if (sinkMuted) setSinkMute(false); pa_operation* o; if (!(o = pa_context_set_sink_volume_by_index(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << "index" << value; } /* * 设置输入设备é�™éŸ³ */ void UkmediaVolumeControl::setSourceMute(bool status) { pa_operation* o; if (!(o = pa_context_set_source_mute_by_index(getContext(), sourceIndex, status, nullptr, nullptr))) { showError(tr("pa_context_set_source_mute_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } /* * 设置输入设备音é‡� */ void UkmediaVolumeControl::setSourceVolume(int index, int value) { pa_cvolume v = m_pDefaultSource->volume; v.channels = inputChannel; for (int i = 0; i < v.channels; i++) v.values[i] = value; if (sourceMuted) setSourceMute(false); pa_operation* o; if (!(o = pa_context_set_source_volume_by_index(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_source_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << index << value; } /* * 设置音é‡�平衡值 */ void UkmediaVolumeControl::setBalanceVolume(int index, int value, float b) { if (nullptr == m_pDefaultSink) { qWarning() << "m_pDefaultSink is nullptr, set sink balance failed"; return; } pa_cvolume v = m_pDefaultSink->volume; v.channels = channel; for (int i = 0; i < v.channels; i++) v.values[i] = value; if (b != 0) { balance = b; pa_cvolume_set_balance(&v, &channelMap, balance); } pa_operation* o; if (!(o = pa_context_set_sink_volume_by_index(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << index << value << balance; } /* * 获å�–输出设备的é�™éŸ³çжæ€� */ bool UkmediaVolumeControl::getSinkMute() { return sinkMuted; } /* * 获å�–输出设备的音é‡�值 */ int UkmediaVolumeControl::getSinkVolume() { return sinkVolume; } /* * 获å�–平衡音é‡� */ float UkmediaVolumeControl::getBalanceVolume() { return balance; } /* * 获å�–输入设备的é�™éŸ³çжæ€� */ bool UkmediaVolumeControl::getSourceMute() { return sourceMuted; } /* * 获å�–输入设备的音é‡�值 */ int UkmediaVolumeControl::getSourceVolume() { return sourceVolume; } /* * 获å�–默认的输出设备å��字和输入设备的å��字还有此时系统的输出的音é‡� */ int UkmediaVolumeControl::getDefaultSinkIndex() { pa_operation *o; if (!(o = pa_context_get_server_info(getContext(), serverInfoIndexCb, this))) { showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return -1; } pa_operation_unref(o); qDebug() << "getDefaultSinkIndex" << "defalutSinkName&defaultSourceName" << defaultSinkName << sinkVolume << defaultSourceName << sourceVolume; return sinkIndex; } int UkmediaVolumeControl::getDefaultSourceIndex() { return sourceIndex; } /* * 滑动æ�¡æ›´æ”¹è®¾ç½®sink input 音é‡�值 */ void UkmediaVolumeControl::setSinkInputVolume(int index, int value) { pa_cvolume v = m_pDefaultSink->volume; if (v.channels > 10) v.channels = 2; for (int i = 0; i < v.channels; i++) v.values[i] = value; qDebug() << "set sink input volume " << index << v.channels << value; pa_operation* o; if (!(o = pa_context_set_sink_input_mute(getContext(), index,false, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); } if (!(o = pa_context_set_sink_input_volume(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); } } /* * 滑动æ�¡æ›´æ”¹è®¾ç½®sink inputé�™éŸ³çжæ€� */ void UkmediaVolumeControl::setSinkInputMuted(int index, bool status) { qDebug() << "set sink input muted" << index << status; pa_operation* o; if (!(o = pa_context_set_sink_input_mute(getContext(), index,status, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); } } /* * 滑动æ�¡æ›´æ”¹è®¾ç½®source output 音é‡�值 */ void UkmediaVolumeControl::setSourceOutputVolume(int index, int value) { pa_cvolume v = m_pDefaultSink->volume; if (v.channels > 10) v.channels = 2; for (int i=0;isecond); clientNames.erase(i); } } static void updatePorts(UkmediaVolumeControl *d, std::map &ports) { std::map::iterator it; PortInfo p; for (auto & port : d->dPorts) { QByteArray desc; it = ports.find(port.first); if (it == ports.end()) continue; p = it->second; desc = p.description; if (p.available == PA_PORT_AVAILABLE_YES) desc += UkmediaVolumeControl::tr(" (plugged in)").toUtf8().constData(); else if (p.available == PA_PORT_AVAILABLE_NO) { if (p.name == "analog-output-speaker" || p.name == "analog-input-microphone-internal") desc += UkmediaVolumeControl::tr(" (unavailable)").toUtf8().constData(); else desc += UkmediaVolumeControl::tr(" (unplugged)").toUtf8().constData(); } port.second = desc; qDebug() << "updatePorts" << p.name << p.description; } Q_EMIT d->updatePortSignal(); it = ports.find(d->activePort); if (it != ports.end()) { p = it->second; // d->setLatencyOffset(p.latency_offset); } } static void setIconByName(QLabel* label, const char* name) { QIcon icon = QIcon::fromTheme(name); int size = label->style()->pixelMetric(QStyle::PM_ToolBarIconSize); QPixmap pix = icon.pixmap(size, size); label->setPixmap(pix); } void UkmediaVolumeControl::updateCard(UkmediaVolumeControl *c, const pa_card_info &info) { bool insertInputPort = false; bool insertOutputPort = false; bool is_new = false; const char *description; QMultiMap tempInput; QMultiMap tempOutput; QList profileName; QMapportMap; QMultiMap outputPortNameLabelMap; QMultiMapinputPortNameLabelMap; QMap profilePriorityMap; std::set profile_priorities; // 记录声å�¡é…�置文件优先级 profile_priorities.clear(); for (pa_card_profile_info2 **p_profile = info.profiles2; *p_profile != nullptr; ++p_profile) { if (((*p_profile)->available == PA_PORT_AVAILABLE_UNKNOWN) || ((*p_profile)->available == PA_PORT_AVAILABLE_YES)) { profile_priorities.insert(*p_profile); profileName.append((*p_profile)->name); profilePriorityMap.insert((*p_profile)->name, (*p_profile)->priority); } } cardProfilePriorityMap.insert(info.index, profilePriorityMap); description = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_DESCRIPTION); c->ports.clear(); for (uint32_t i = 0; i < info.n_ports; ++i) { PortInfo p; p.name = info.ports[i]->name; p.description = info.ports[i]->description; p.priority = info.ports[i]->priority; p.available = info.ports[i]->available; p.direction = info.ports[i]->direction; p.latency_offset = info.ports[i]->latency_offset; if (info.ports[i]->profiles2) for (pa_card_profile_info2 ** p_profile = info.ports[i]->profiles2; *p_profile != nullptr; ++p_profile) { if (((*p_profile)->available == PA_PORT_AVAILABLE_UNKNOWN) || ((*p_profile)->available == PA_PORT_AVAILABLE_YES)) { p.profiles.push_back((*p_profile)->name); } } #ifdef PA_PORT_AVAILABLE_DISABLE if (p.direction == 1 && p.available != PA_PORT_AVAILABLE_NO && p.available != PA_PORT_AVAILABLE_DISABLE) { // portMap.insertMulti(p.name,p.description.data()); insertOutputPort = true; //新增UI设计,combobox显示portname+description QString outputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString outputPortName_and_description = outputPortName + "(" + description + ")"; qDebug() << "add sink port name "<< info.index << p.name << p.description.data() << description ; tempOutput.insertMulti(p.name,outputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); outputPortNameLabelMap.insertMulti(p.description.data(),p_profile.data()); qDebug() << "ctf profilename map 111 insert -----------" << p.description.data() << p_profile.data(); } profileNameMap.insert(info.index,outputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } else if (p.direction == 2 && p.available != PA_PORT_AVAILABLE_NO && p.available != PA_PORT_AVAILABLE_DISABLE) { insertInputPort = true; //新增UI设计,combobox显示portname+description QString inputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString inputPortName_and_description = inputPortName + "(" + description + ")"; qDebug() << "add source port name "<< info.index << p.name << p.description.data(); tempInput.insertMulti(p.name,inputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); inputPortNameLabelMap.insertMulti(p.description.data(),p_profile.data()); qDebug() << "ctf profilename map 222 insert -----------" << p.description.data() << p_profile.data(); } inputPortProfileNameMap.insert(info.index,inputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } #else if (p.direction == 1 && p.available != PA_PORT_AVAILABLE_NO) { // portMap.insertMulti(p.name,p.description.data()); insertOutputPort = true; //新增UI设计,combobox显示portname+description QString outputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString outputPortName_and_description = outputPortName + "(" + description + ")"; qDebug() << "add sink port name "<< info.index << p.name << p.description.data() << description ; tempOutput.insert(p.name,outputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); outputPortNameLabelMap.insert(p.description.data(),p_profile.data()); qDebug() << "ctf profilename map insert -----------" << p.description.data() << p_profile.data(); } profileNameMap.insert(info.index,outputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } else if (p.direction == 2 && p.available != PA_PORT_AVAILABLE_NO) { insertInputPort = true; //新增UI设计,combobox显示portname+description QString inputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString inputPortName_and_description = inputPortName + "(" + description + ")"; qDebug() << "add source port name "<< info.index << p.name << p.description.data(); tempInput.insert(p.name,inputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); inputPortNameLabelMap.insert(p.description.data(),p_profile.data()); } inputPortProfileNameMap.insert(info.index,inputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } #endif c->ports[p.name] = p; } if (insertInputPort) { inputPortMap.insert(info.index,tempInput); } else { inputPortMap.remove(info.index); } if (insertOutputPort) { outputPortMap.insert(info.index,tempOutput); } else { outputPortMap.remove(info.index); } cardActiveProfileMap.insert(info.index,info.active_profile->name); c->profiles.clear(); for (auto p_profile : profile_priorities) { bool hasNo = false, hasOther = false; std::map::iterator portIt; QByteArray desc = p_profile->description; for (portIt = c->ports.begin(); portIt != c->ports.end(); portIt++) { PortInfo port = portIt->second; if (std::find(port.profiles.begin(), port.profiles.end(), p_profile->name) == port.profiles.end()) continue; if (port.available == PA_PORT_AVAILABLE_NO) hasNo = true; else { hasOther = true; break; } } if (hasNo && !hasOther) desc += tr(" (unplugged)").toUtf8().constData(); if (!p_profile->available) desc += tr(" (unavailable)").toUtf8().constData(); c->profiles.push_back(std::pair(p_profile->name, desc)); if (p_profile->n_sinks == 0 && p_profile->n_sources == 0) c->noInOutProfile = p_profile->name; } c->activeProfile = info.active_profile ? info.active_profile->name : ""; /* Because the port info for sinks and sources is discontinued we need * to update the port info for them here. */ updatePorts(c,c->ports); if (is_new) { updateDeviceVisibility(); } Q_EMIT checkDeviceSelectionSianal(&info); // c->updating = false; } /* * Update output device when the default output device or port is updated */ bool UkmediaVolumeControl::updateSink(UkmediaVolumeControl *w,const pa_sink_info &info) { bool is_new = false; QMultiMaptemp; int volume; if (info.volume.channels >= 2) volume = MAX(info.volume.values[0],info.volume.values[1]); else volume = info.volume.values[0]; //默认的输出音é‡� if (info.name && strcmp(defaultSinkName.data(),info.name) == 0) { //channelå’ŒsinkIndex在此处必须更新 channel = info.volume.channels; sinkIndex= info.index; balance = pa_cvolume_get_balance(&info.volume,&info.channel_map); channelMap = info.channel_map; if (info.active_port) { sinkActivePortMap.insert(info.name,info.active_port->name);//huawei特殊处ç�† if(strcmp(sinkPortName.toLatin1().data(),info.active_port->name) != 0) { sinkPortName = info.active_port->name; sendDeviceChangedSignal(this); } else { sinkPortName = info.active_port->name; } } defaultOutputCard = info.card; /* bug:96232ã€�95568ã€�95523 解决 hw-panguw 机型,找ä¸�到对于sinkPortName导致音é‡�无法å�Œæ­¥ã€�é�™éŸ³æŒ‰é’®å�ªèƒ½æŒ‰ä¸€æ¬¡ç­‰é—®é¢˜ */ QString temp = ""; if (sinkPortName.contains("histen-algo",Qt::CaseInsensitive)) { sinkPortName = findSinkActivePortName(PANGUW_SINK); temp = "histen-algo"; } if (sinkVolume != volume || sinkMuted != info.mute) { if (temp != "") { sinkPortName = temp; } // å�Œæ­¥éŸ³é‡�,å�Œæ­¥UI w->refreshVolume(SoundType::SINK, volume, info.mute); } } if (info.ports) { for (pa_sink_port_info ** sinkPort = info.ports; *sinkPort != nullptr; ++sinkPort) { temp.insert(info.name,(*sinkPort)->name); } QList > sinkPortMapList; if(sinkPortMap.isEmpty()) sinkPortMap.insert(info.card,temp); sinkPortMapList.clear(); for (auto it = sinkPortMap.begin(); it != sinkPortMap.end(); ++it) { sinkPortMapList.append(it.value()); } if(!sinkPortMapList.contains(temp)) sinkPortMap.insert(static_cast(info.card),temp); qDebug() << "updateSink" << "defauleSinkName:" << defaultSinkName.data() << "sinkport" << sinkPortName << "sinkVolume" << sinkVolume ; if(strstr(defaultSinkName.data(),".headset_head_unit") || strstr(defaultSourceName.data(),"bt_sco_source")) { Q_EMIT updateMonoAudio(false); qDebug() << "Q_EMIT updateMonoAudio false" << sinkPortName << info.volume.channels; } else if(!strstr(defaultSourceName.data(),"bluez_source.") && !strstr(defaultSourceName.data(),"bt_sco_source")){ Q_EMIT updateMonoAudio(true); qDebug() << "Q_EMIT updateMonoAudio true" << sinkPortName << info.volume.channels; } const char *icon; // std::map::iterator cw; std::set port_priorities; port_priorities.clear(); for (uint32_t i=0; iports.clear(); }else{ qDebug() << " no sink port -> updateSink -> Q_EMIT updateMonoAudio true"; Q_EMIT updateMonoAudio(true); } if (is_new) updateDeviceVisibility(); return is_new; } QString UkmediaVolumeControl::findSinkActivePortName(QString name) { QString portName = ""; QMap::iterator at; for (at=sinkActivePortMap.begin();at!=sinkActivePortMap.end();++at) { if (at.key() == name) { portName = at.value(); break; } } return portName; } /* * stream suspend callback */ static void suspended_callback(pa_stream *s, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (pa_stream_is_suspended(s)) w->updateVolumeMeter(pa_stream_get_device_index(s), PA_INVALID_INDEX, -1); } void UkmediaVolumeControl::readCallback(pa_stream *s, size_t length, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); const void *data; double v; int index; index = pa_stream_get_device_index(s); /* when the default input device is monitor * no input feedback is provided */ if(strstr(w->defaultSourceName, ".monitor")) { Q_EMIT w->peakChangedSignal(0); return; } if (pa_stream_peek(s, &data, &length) < 0) { w->showError(UkmediaVolumeControl::tr("Failed to read data from stream").toUtf8().constData()); return; } if (!data) { /* nullptr data means either a hole or empty buffer. * Only drop the stream when there is a hole (length > 0) */ if (length) pa_stream_drop(s); return; } assert(length > 0); assert(length % sizeof(float) == 0); v = ((const float*) data)[length / sizeof(float) -1]; pa_stream_drop(s); if (v < 0) v = 0; if (v > 1) v = 1; w->updateVolumeMeter(index,pa_stream_get_monitor_stream(s),v); } pa_stream* UkmediaVolumeControl::createMonitorStreamForSource(uint32_t source_idx, uint32_t stream_idx = -1, bool suspend = false) { pa_stream *s; char t[16]; pa_buffer_attr attr; pa_sample_spec ss; pa_stream_flags_t flags; ss.channels = 1; ss.format = PA_SAMPLE_FLOAT32; ss.rate = 25; memset(&attr, 0, sizeof(attr)); attr.fragsize = sizeof(float); attr.maxlength = (uint32_t) -1; snprintf(t, sizeof(t), "%u", source_idx); if (!(s = pa_stream_new(getContext(), tr("Peak detect").toUtf8().constData(), &ss, nullptr))) { showError(tr("Failed to create monitoring stream").toUtf8().constData()); return nullptr; } if (stream_idx != (uint32_t) -1) pa_stream_set_monitor_stream(s, stream_idx); pa_stream_set_read_callback(s, readCallback, this); pa_stream_set_suspended_callback(s, suspended_callback, this); flags = (pa_stream_flags_t) (PA_STREAM_PEAK_DETECT | PA_STREAM_ADJUST_LATENCY | (suspend ? PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND : PA_STREAM_NOFLAGS)); if (pa_stream_connect_record(s, t, &attr, flags) < 0) { showError(tr("Failed to connect monitoring stream").toUtf8().constData()); pa_stream_unref(s); return nullptr; } return s; } void UkmediaVolumeControl::updateSource(const pa_source_info &info) { int volume = (info.volume.channels >= 2) ? MAX(info.volume.values[0], info.volume.values[1]) : info.volume.values[0]; // Update some variables for the default input if (UKMedia_Equal(defaultSourceName.data(), info.name)) { sourceIndex = info.index; inputChannel = info.volume.channels; if (pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { masterDevice = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE); sourceInfo s = getSourceInfoByName(masterDevice); defaultInputCard = s.card; sourcePortName = s.active_port_name; qInfo() << "This is a filter source:" << info.name << "master device:" << masterDevice; } else { defaultInputCard = info.card; sourcePortName = (info.active_port) ? info.active_port->name : ""; } //bug#254769/256035 输入设备为内置mic或为空时,需è¦�éš�è—�侦å�¬åŠŸèƒ½ï¼ˆæŽ§åˆ¶é�¢æ�¿ä»£ç �实现)并å�¸è½½ä¾¦å�¬æ¨¡å�— if(!strstr(sourcePortName.toUtf8().constData(), "internal") \ && !strstr(sourcePortName.toUtf8().constData(), "[In] Mic1")) { updateLoopBack(true); qDebug() << "updateSource -> Q_EMIT updateLoopBack true" << sourcePortName; }else{ updateLoopBack(false); qDebug() << "updateSource -> Q_EMIT updateLoopBack false" << sourcePortName; } sendDeviceChangedSignal(this); refreshVolume(SoundType::SOURCE, volume, info.mute); qInfo() << __func__ << "Status1 defaultSource:" << sourceIndex << defaultSourceName << "sourcePort" << sourcePortName; } /* å¼€å�¯é™�噪状æ€�下,如果这个source存在多个端å�£ï¼Œä¸”ä¸�å�Œç«¯å�£éŸ³é‡�相å�Œæ—¶ï¼Œä¸�会触å�‘ noiseReduceSource 回调,导致无法更新 portName */ else if (UKMedia_Equal(masterDevice.toLatin1().data(), info.name) && UKMedia_Equal(defaultSourceName.data(), ("noiseReduceSource"))) { defaultInputCard = info.card; sourcePortName = (info.active_port) ? info.active_port->name : ""; sendDeviceChangedSignal(this); qInfo() << __func__ << "Status2 defaultSource:" << sourceIndex << defaultSourceName << "sourcePort" << sourcePortName; } if (info.ports) { QMultiMaptemp; for (pa_source_port_info **sourcePort = info.ports; *sourcePort != nullptr; ++sourcePort) temp.insert(info.name, (*sourcePort)->name); if(sourcePortMap.isEmpty()) sourcePortMap.insert(static_cast(info.card), temp); QList> sourcePortMapList; sourcePortMapList = sourcePortMap.values(); if(!sourcePortMapList.contains(temp)) sourcePortMap.insert(info.card, temp); } } void UkmediaVolumeControl::updateSinkInput(const pa_sink_input_info &info) { const char *t; if ((t = pa_proplist_gets(info.proplist, "module-stream-restore.id"))) { if (t && strcmp(t, "sink-input-by-media-role:event") == 0) { g_debug("%s", tr("Ignoring sink-input due to it being designated as an event and thus handled by the Event widget").toUtf8().constData()); return; } } const gchar *description = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_NAME); const gchar *appId = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID); //没制定应用å��ç§°çš„ä¸�加入到应用音é‡�中 if (description && !strstr(description,"QtPulseAudio")) { if (!info.corked) { sinkInputMap.insert(description,info.volume.values[0]); if (!sinkInputList.contains(description)) { sinkInputList.append(description); Q_EMIT addSinkInputSignal(description,appId,info.index); } } else { Q_EMIT removeSinkInputSignal(description); sinkInputList.removeAll(description); QMap::iterator it; for(it = sinkInputMap.begin();it!=sinkInputMap.end();) { if(it.key() == description) { sinkInputMap.erase(it); break; } ++it; } } } } void UkmediaVolumeControl::updateSourceOutput(const pa_source_output_info &info) { const char *app; // bool is_new = false; if ((app = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID))) if (app && strcmp(app, "org.PulseAudio.pavucontrol") == 0 || strcmp(app, "org.gnome.VolumeControl") == 0 || strcmp(app, "org.kde.kmixd") == 0) return; const gchar *description = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_NAME); const gchar *appId = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID); //没制定应用å��ç§°çš„ä¸�加入到应用音é‡�中 if (description && !strstr(description,"QtPulseAudio")) { if (appId && !info.corked) { sourceOutputMap.insert(description,info.volume.values[0]); Q_EMIT addSourceOutputSignal(description,appId,info.index); } else { Q_EMIT removeSourceOutputSignal(description); QMap::iterator it; for(it = sourceOutputMap.begin();it!=sourceOutputMap.end();) { if(it.key() == description) { sourceOutputMap.erase(it); break; } ++it; } } } } void UkmediaVolumeControl::updateClient(const pa_client_info &info) { g_free(clientNames[info.index]); clientNames[info.index] = g_strdup(info.name); } void UkmediaVolumeControl::updateServer(const pa_server_info &info) { defaultSourceName = info.default_source_name ? info.default_source_name : ""; defaultSinkName = info.default_sink_name ? info.default_sink_name : ""; qDebug() << "updateServer" << "default_sink:" << info.default_sink_name << "default_source:" << info.default_source_name; if (peak == nullptr && !strstr(defaultSourceName, ".monitor")) { QTimer::singleShot(100, this, [=](){ peak = createMonitorStreamForSource(sourceIndex, -1, !!(sourceFlags & PA_SOURCE_NETWORK)); qDebug() << "Created peak sourceIndex" << sourceIndex; }); } else if (strstr(defaultSourceName, ".monitor")) { peak = nullptr; pa_operation *o; if (!(o = pa_context_kill_source_output(getContext(), peakDetectIndex, nullptr, nullptr))) showError(tr("pa_context_kill_source_output() failed").toUtf8().constData()); } } void UkmediaVolumeControl::updateVolumeMeter(uint32_t index, uint32_t sinkInputIdx, double v) { Q_UNUSED(index); Q_UNUSED(sinkInputIdx); if (lastPeak >= DECAY_STEP) if (v < lastPeak - DECAY_STEP) v = lastPeak - DECAY_STEP; lastPeak = v; Q_EMIT peakChangedSignal(v); } static guint idleSource = 0; gboolean idleCb(gpointer data) { idleSource = 0; return FALSE; } void UkmediaVolumeControl::setConnectionState(gboolean connected) { if (m_connected != connected) { m_connected = connected; if (m_connected) { // connectingLabel->hide(); // notebook->show(); } else { // notebook->hide(); // connectingLabel->show(); } } } void UkmediaVolumeControl::updateDeviceVisibility() { if (idleSource) return; idleSource = g_idle_add(idleCb, this); } void UkmediaVolumeControl::removeCard(uint32_t index) { // if (!cardWidgets.count(index)) // return; // delete cardWidgets[index]; // cardWidgets.erase(index); updateDeviceVisibility(); } //移除对应声å�¡ä¸‹çš„对应sink void UkmediaVolumeControl::removeCardSink(int cardIndex,QString sinkName) { QMultiMap>::iterator it1; QMultiMap::iterator it2; for(it1=sinkPortMap.begin();it1!=sinkPortMap.end();) { //1ã€�找到对应声å�¡ if(it1.key()==cardIndex) { for(it2=it1.value().begin();it2!=it1.value().end();) { //2ã€�找到对应声å�¡ä¸‹çš„对应sink,进行移除 if(it2.key()==sinkName) { it2 = it1->erase(it2); return; } ++it2; } } ++it1; } } void UkmediaVolumeControl::removeSink(uint32_t sinkIndex) { #if 1 QMap::iterator it; for(it=sinkMap.begin(); it!=sinkMap.end();) { if (it.key() == sinkIndex) { removeCardSink(it.value().card, it.value().name); if(m_pDefaultSink->volume.channels >= 2 && strstr(it.value().name.toLatin1().data(),".a2dp_sink")\ && !strstr(defaultSourceName.data(),"bluez_source.") && !strstr(defaultSourceName.data(),"bt_sco_source")) { Q_EMIT updateMonoAudio(true); qDebug() << "Q_EMIT updateMonoAudio true" << sinkPortName << m_pDefaultSink->volume.channels << it.value().name; } sinkMap.erase(it); break; } ++it; } updateDeviceVisibility(); #else QMap>::iterator it1; QMap::iterator it2; for (it1=sinkMap.begin(); it1!=sinkMap.end();) { if (it1.key() == index) { for(it2=it1.value().begin();it2!=it1.value().end();) { removeCardSink(it2.key(),it2.value().name); if(m_pDefaultSink->volume.channels >= 2 && strstr(it2.value().name.toLatin1().data(),".a2dp_sink")\ && !strstr(defaultSourceName.data(),"bluez_source.") && !strstr(defaultSourceName.data(),"bt_sco_source")) { Q_EMIT updateMonoAudio(true); qDebug() << "Q_EMIT updateMonoAudio true" << sinkPortName << m_pDefaultSink->volume.channels << it2.value().name; } ++it2; } sinkMap.erase(it1); break; } ++it1; } updateDeviceVisibility(); #endif } //移除对应声å�¡ä¸‹çš„对应source void UkmediaVolumeControl::removeCardSource(int cardIndex,QString sourceName) { QMultiMap>::iterator it1; QMultiMap::iterator it2; for(it1=sourcePortMap.begin();it1!=sourcePortMap.end();) { //1ã€�找到对应声å�¡ if(it1.key()==cardIndex) { for(it2=it1.value().begin();it2!=it1.value().end();) { //2ã€�找到对应声å�¡ä¸‹çš„对应sink,进行移除 if(it2.key()==sourceName) { it2 = it1->erase(it2); return; } ++it2; } } ++it1; } } void UkmediaVolumeControl::removeSource(uint32_t sourceIndex) { #if 1 QMap::iterator it; for (it=sourceMap.begin(); it!=sourceMap.end();) { if (it.key() == sourceIndex) { removeCardSource(it.value().card, it.value().name); sourceMap.erase(it); break; } ++it; } updateDeviceVisibility(); #else QMap>::iterator it1; QMap::iterator it2; for (it1=sourceMap.begin();it1!=sourceMap.end();) { if (it1.key() == index) { for(it2=it1.value().begin();it2!=it1.value().end();) { //it2.key()=cardIndex,it2.value()=sourceName,找到对应声å�¡ä¸‹çš„对应source进行删除 removeCardSource(it2.key(),it2.value().name); ++it2; } sourceMap.erase(it1); break; } ++it1; } updateDeviceVisibility(); #endif } void UkmediaVolumeControl::removeSinkInput(uint32_t index) { updateDeviceVisibility(); } void UkmediaVolumeControl::removeSourceOutput(uint32_t index) { updateDeviceVisibility(); } void UkmediaVolumeControl::removeClient(uint32_t index) { g_free(clientNames[index]); clientNames.erase(index); } void UkmediaVolumeControl::setConnectingMessage(const char *string) { QByteArray markup = ""; if (!string) markup += tr("Establishing connection to PulseAudio. Please wait...").toUtf8().constData(); else markup += string; markup += ""; // connectingLabel->setText(QString::fromUtf8(markup)); } void UkmediaVolumeControl::showError(const char *txt) { char buf[256]; snprintf(buf, sizeof(buf), "%s: %s", txt, pa_strerror(pa_context_errno(context))); qWarning() << QString::fromUtf8(buf); } void UkmediaVolumeControl::decOutstanding(UkmediaVolumeControl *w) { // qDebug() << "decOutstanding---------"; if (n_outstanding <= 0) return; if (--n_outstanding <= 0) { // w->get_window()->set_cursor(); w->setConnectionState(true); } } void UkmediaVolumeControl::cardCb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Card callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->cardMap.insert(i->index,i->name); w->updateCard(w,*i); } void UkmediaVolumeControl::sinkIndexCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Sink callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } int volume; if(i->volume.channels >= 2) volume = MAX(i->volume.values[0],i->volume.values[1]); else volume = i->volume.values[0]; w->channel = i->volume.channels; w->defaultOutputCard = i->card; w->sinkIndex = i->index; w->balance = pa_cvolume_get_balance(&i->volume,&i->channel_map); if(i->active_port) w->sinkPortName = i->active_port->name; else w->sinkPortName = ""; // å�Œæ­¥éŸ³é‡�,å�Œæ­¥UI w->refreshVolume(SoundType::SINK, volume, i->mute); } void UkmediaVolumeControl::sourceIndexCb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Source callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } int volume; if(i->volume.channels >= 2) volume = MAX(i->volume.values[0],i->volume.values[1]); else volume = i->volume.values[0]; w->inputChannel = i->volume.channels; w->sourceIndex = i->index; if (pa_proplist_gets(i->proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { w->masterDevice = pa_proplist_gets(i->proplist, PA_PROP_DEVICE_MASTER_DEVICE); sourceInfo s = w->getSourceInfoByName(w->masterDevice); w->defaultInputCard = s.card; w->sourcePortName = s.active_port_name; } else { w->defaultInputCard = i->card; w->sourcePortName = (i->active_port) ? i->active_port->name : ""; } w->refreshVolume(SoundType::SOURCE, volume, i->mute); qDebug() << __func__ << "defaultInputCard" << w->defaultInputCard << "sourcePort" << w->sourcePortName; } void UkmediaVolumeControl::sinkCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Sink callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->m_pDefaultSink = i; qDebug() << "SinkCb" << i->index << i->name; #if 1 w->sinkMap.insert(i->index, w->addSinkInfo(*i)); w->updateSink(w,*i); #else QMap temp; temp.insert(i->card,w->addSinkInfo(*i)); w->sinkMap.insert(i->index,temp); w->updateSink(w,*i); #endif } void UkmediaVolumeControl::sourceCb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Source callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->m_pDefaultSource = i; qInfo() << "sourceCb" << i->index << i->name; w->sourceMap.insert(i->index, w->addSourceInfo(*i)); w->updateSource(*i); } void UkmediaVolumeControl::sinkInputCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Sink input callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->updateSinkInput(*i); } void UkmediaVolumeControl::sourceOutputCb(pa_context *c, const pa_source_output_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Source output callback failure").toUtf8().constData()); return; } if (eol > 0) { if (n_outstanding > 0) { /* At this point all notebook pages have been populated, so * let's open one that isn't empty */ // if (default_tab != -1) { // if (default_tab < 1 || default_tab > w->notebook->count()) { // if (!w->sinkInputWidgets.empty()) // w->notebook->setCurrentIndex(0); // else if (!w->sourceOutputWidgets.empty()) // w->notebook->setCurrentIndex(1); // else if (!w->sourceWidgets.empty() && w->sinkWidgets.empty()) // w->notebook->setCurrentIndex(3); // else // w->notebook->setCurrentIndex(2); // } else { // w->notebook->setCurrentIndex(default_tab - 1); // } // default_tab = -1; // } } decOutstanding(w); return; } if (i->name && strstr(i->name, "Peak detect")) w->peakDetectIndex = i->index; qDebug() << __func__ << i->index; w->updateSourceOutput(*i); } void UkmediaVolumeControl::clientCb(pa_context *c, const pa_client_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Client callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } // qDebug() << "clientCb" << i->name; w->updateClient(*i); } void UkmediaVolumeControl::serverInfoIndexCb(pa_context *, const pa_server_info *i, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (!i) { w->showError(QObject::tr("Server info callback failure").toUtf8().constData()); return; } pa_operation *o; qDebug() << "serverInfoIndexCb" << i->default_sink_name << i->default_source_name; w->updateServer(*i); decOutstanding(w); } void UkmediaVolumeControl::serverInfoCb(pa_context *, const pa_server_info *i, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (!i) { w->showError(QObject::tr("Server info callback failure").toUtf8().constData()); return; } pa_operation *o; //默认的输出设备改å�˜æ—¶éœ€è¦�获å�–默认的输出音é‡� if(!(o = pa_context_get_sink_info_by_name(w->getContext(),i->default_sink_name,sinkIndexCb,w))) { } if(!(o = pa_context_get_source_info_by_name(w->getContext(),i->default_source_name,sourceIndexCb,w))) { } qDebug() << "serverInfoCb" << i->user_name << i->default_sink_name << i->default_source_name; w->updateServer(*i); sendDeviceChangedSignal(w); decOutstanding(w); } void UkmediaVolumeControl::extStreamRestoreReadCb( pa_context *c, const pa_ext_stream_restore_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { decOutstanding(w); g_debug(QObject::tr("Failed to initialize stream_restore extension: %s").toUtf8().constData(), pa_strerror(pa_context_errno(c))); return; } if (eol > 0) { decOutstanding(w); return; } // qDebug() << "extStreamRestoreReadCb" << i->name; // w->updateRole(*i); } void UkmediaVolumeControl::extStreamRestoreSubscribeCb(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); pa_operation *o; if (!(o = pa_ext_stream_restore_read(c, extStreamRestoreReadCb, w))) { w->showError(QObject::tr("pa_ext_stream_restore_read() failed").toUtf8().constData()); return; } qDebug() << "extStreamRestoreSubscribeCb" ; pa_operation_unref(o); } void UkmediaVolumeControl::extDeviceManagerReadCb( pa_context *c, const pa_ext_device_manager_info *, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { decOutstanding(w); g_debug(QObject::tr("Failed to initialize device manager extension: %s").toUtf8().constData(), pa_strerror(pa_context_errno(c))); return; } if (eol > 0) { decOutstanding(w); return; } qDebug() << "extDeviceManagerReadCb"; /* Do something with a widget when this part is written */ } void UkmediaVolumeControl::extDeviceManagerSubscribeCb(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); pa_operation *o; if (!(o = pa_ext_device_manager_read(c, extDeviceManagerReadCb, w))) { w->showError(QObject::tr("pa_ext_device_manager_read() failed").toUtf8().constData()); return; } qDebug() << "extDeviceManagerSubscribeCb"; pa_operation_unref(o); } void UkmediaVolumeControl::subscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSink(index); else { pa_operation *o; if (!(o = pa_context_get_sink_info_by_index(c, index, sinkCb, w))) { w->showError(QObject::tr("pa_context_get_sink_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSource(index); else { pa_operation *o; if (!(o = pa_context_get_source_info_by_index(c, index, sourceCb, w))) { w->showError(QObject::tr("pa_context_get_source_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSinkInput(index); else { pa_operation *o; if (!(o = pa_context_get_sink_input_info(c, index, sinkInputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSourceOutput(index); else { pa_operation *o; if (!(o = pa_context_get_source_output_info(c, index, sourceOutputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_CLIENT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeClient(index); else { pa_operation *o; if (!(o = pa_context_get_client_info(c, index, clientCb, w))) { w->showError(QObject::tr("pa_context_get_client_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SERVER: { pa_operation *o; if (!(o = pa_context_get_server_info(c, serverInfoCb, w))) { w->showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_CARD: //remove card if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { qDebug() << "remove cards------"; //移除outputPort w->removeSinkPortMap(index); w->removeSourcePortMap(index); w->removeOutputPortMap(index); w->removeInputPortMap(index); Q_EMIT w->updatePortSignal(); w->removeCardMap(index); w->removeCardProfileMap(index); w->removeProfileMap(index); w->removeInputProfile(index); w->removeCard(index); } else { pa_operation *o; if (!(o = pa_context_get_card_info_by_index(c, index, cardCb, w))) { w->showError(QObject::tr("pa_context_get_card_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; } } void UkmediaVolumeControl::contextStateCallback(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); g_assert(c); switch (pa_context_get_state(c)) { case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: { pa_operation *o; qDebug() << "pa_context_get_state" << "PA_CONTEXT_READY" << pa_context_get_state(c); reconnectTimeout = 3; pa_context_set_subscribe_callback(c, subscribeCb, w); if (!(o = pa_context_subscribe(c, (pa_subscription_mask_t) (PA_SUBSCRIPTION_MASK_SINK| PA_SUBSCRIPTION_MASK_SOURCE| PA_SUBSCRIPTION_MASK_SINK_INPUT| PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT| PA_SUBSCRIPTION_MASK_CLIENT| PA_SUBSCRIPTION_MASK_SERVER| PA_SUBSCRIPTION_MASK_CARD), nullptr, nullptr))) { w->showError(QObject::tr("pa_context_subscribe() failed").toUtf8().constData()); return; } pa_operation_unref(o); /* Keep track of the outstanding callbacks for UI tweaks */ n_outstanding = 0; if (!(o = pa_context_get_server_info(c, serverInfoCb, w))) { w->showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_client_info_list(c, clientCb, w))) { w->showError(QObject::tr("pa_context_client_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_card_info_list(c, cardCb, w))) { w->showError(QObject::tr("pa_context_get_card_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_sink_info_list(c, sinkCb, w))) { w->showError(QObject::tr("pa_context_get_sink_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_source_info_list(c, sourceCb, w))) { w->showError(QObject::tr("pa_context_get_source_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_sink_input_info_list(c, sinkInputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; if (!(o = pa_context_get_source_output_info_list(c, sourceOutputCb, w))) { w->showError(QObject::tr("pa_context_get_source_output_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); n_outstanding++; Q_EMIT w->paContextReady(); break; } case PA_CONTEXT_FAILED: w->setConnectionState(false); w->updateDeviceVisibility(); if (w->context != nullptr) { pa_context_unref(w->context); w->context = nullptr; } qWarning("Connection failed, attempting reconnect"); reconnectTimeout--; if (reconnectTimeout <= 0) { qWarning("reconnect pulseaudio Three times failed"); return; } g_timeout_add_seconds(5, connectToPulse, w); return; case PA_CONTEXT_TERMINATED: default: return; } } pa_context* UkmediaVolumeControl::getContext(void) { g_assert(context); return context; } gboolean UkmediaVolumeControl::connectToPulse(gpointer userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (context) { qWarning("pulseAudio is connected"); return false; } pa_glib_mainloop *m = pa_glib_mainloop_new(g_main_context_default()); api = pa_glib_mainloop_get_api(m); pa_proplist *proplist = pa_proplist_new(); pa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, QObject::tr("Ukui Media Volume Control").toUtf8().constData()); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "org.PulseAudio.pavucontrol"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "audio-card"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "PACKAGE_VERSION"); context = pa_context_new_with_proplist(api, nullptr, proplist); g_assert(context); pa_proplist_free(proplist); pa_context_set_state_callback(context, contextStateCallback, w); if (pa_context_connect(context, nullptr, PA_CONTEXT_NOFAIL, nullptr) < 0) { if (pa_context_errno(context) == PA_ERR_INVALID) { /*w->setConnectingMessage(QObject::tr("Connection to PulseAudio failed. Automatic retry in 5s\n\n" "In this case this is likely because PULSE_SERVER in the Environment/X11 Root Window Properties\n" "or default-server in client.conf is misconfigured.\n" "This situation can also arrise when PulseAudio crashed and left stale details in the X11 Root Window.\n" "If this is the case, then PulseAudio should autospawn again, or if this is not configured you should\n" "run start-pulseaudio-x11 manually.").toUtf8().constData());*/ qFatal("connect pulseaudio failed"); } else { reconnectTimeout--; if (reconnectTimeout <= 0) { qWarning("reconnect pulseaudio Three times failed"); return false; } g_timeout_add_seconds(5, connectToPulse, w); } } return false; } /* * æ ¹æ�®å��称获å�–sink input音é‡� */ int UkmediaVolumeControl::getSinkInputVolume(const gchar *name) { int value = 0; for(auto it = sinkInputMap.begin();it!=sinkInputMap.end();) { if(it.key() == name) { qDebug() << "getSinkInputVolume" << "name:" <>::iterator it; for(it=sinkPortMap.begin();it!=sinkPortMap.end();){ if(it.key() == index) { sinkPortMap.remove(index); break; } ++it; } } void UkmediaVolumeControl::removeSourcePortMap(int index) { for(auto it=sourcePortMap.begin();it!=sourcePortMap.end();){ if(it.key() == index) { sourcePortMap.erase(it); break; } ++it; } } void UkmediaVolumeControl::removeProfileMap(int index) { qDebug() << "removeProfileMap" << index << profileNameMap; for (auto it=profileNameMap.begin();it!=profileNameMap.end();) { if(it.key() == index){ profileNameMap.erase(it); break; } ++it; } } void UkmediaVolumeControl::removeInputProfile(int index) { qDebug() << "removeInputProfile" << index << inputPortProfileNameMap; for (auto it=inputPortProfileNameMap.begin();it!=inputPortProfileNameMap.end();) { if(it.key() == index){ inputPortProfileNameMap.erase(it); break; } ++it; } } sinkInfo UkmediaVolumeControl::addSinkInfo(const pa_sink_info& i) { sinkInfo info; info.name = i.name; info.index = i.index; info.description = i.description; info.volume = i.volume; info.mute = i.mute; info.card = i.card; if (i.active_port) { info.active_port_name = i.active_port->name; info.active_port_description = i.active_port->description; } if (pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) info.master_device = pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE); if (i.ports) { for (pa_sink_port_info** sinkPort = i.ports; *sinkPort != nullptr; ++sinkPort) { portInfo pInfo; pInfo.name = (*sinkPort)->name; pInfo.description = (*sinkPort)->description; pInfo.priority = (*sinkPort)->priority; pInfo.available = (*sinkPort)->available; info.sink_port_list.append(pInfo); } } return info; } sourceInfo UkmediaVolumeControl::addSourceInfo(const pa_source_info& i) { sourceInfo info; info.name = i.name; info.index = i.index; info.description = i.description; info.volume = i.volume; info.mute = i.mute; info.card = i.card; if (i.active_port) { info.active_port_name = i.active_port->name; info.active_port_description = i.active_port->description; } if(pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) info.master_device = pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE); return info; } /** * @brief UkmediaVolumeControl::refreshVolume * å�‘é€�ä¿¡å�·åˆ·æ–°éŸ³é‡� */ void UkmediaVolumeControl::refreshVolume(int soundType, int info_Vol, bool info_Mute) { switch (soundType) { case SoundType::SINK: { if (sinkMuted != info_Mute) { //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (outputPortMap.isEmpty() || defaultSinkName.isEmpty()) { sinkMuted = true; } else { sinkMuted = info_Mute; } #elif 0 sinkMuted = info_Mute; #endif Q_EMIT updateSinkMute(sinkMuted); } if (sinkVolume != info_Vol) { //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (outputPortMap.isEmpty() || defaultSinkName.isEmpty()) { sinkVolume = 0; sinkMuted = true; } else { sinkVolume = info_Vol; sinkMuted = info_Mute; } #elif 0 sinkVolume = info_Vol; sinkMuted = info_Mute; #endif sendVolumeUpdateSignal(); } } break; case SoundType::SOURCE: { if (sourceMuted != info_Mute) { //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (inputPortMap.isEmpty() || defaultSourceName.isEmpty()) { sourceMuted = true; } else { sourceMuted = info_Mute; } #elif 0 sourceMuted = info_Mute; #endif Q_EMIT updateSourceMute(sourceMuted); } if (sourceVolume != info_Vol) { //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (inputPortMap.isEmpty() || defaultSourceName.isEmpty()) { sourceVolume = 0; sourceMuted = true; } else { sourceVolume = info_Vol; sourceMuted = info_Mute; } #elif 0 sourceVolume = info_Vol; sourceMuted = info_Mute; #endif sendSourceVolumeUpdateSignal(); } } break; default: break; } } void UkmediaVolumeControl::sendDeviceChangedSignal(UkmediaVolumeControl* w) { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® if (nullptr == w) { qDebug() << "w is null"; return; } static UkmediaVolumeControl* control = w; static bool isConnect = false; if (deviceChangedTimer.isActive()) { deviceChangedTimer.stop(); } deviceChangedTimer.setInterval(300); deviceChangedTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&deviceChangedTimer, &QTimer::timeout, control, [&control](){ qDebug() << "deviceChangedSignal"; if (control) { Q_EMIT control->deviceChangedSignal(); } }); } deviceChangedTimer.start(); //end } void UkmediaVolumeControl::sendVolumeUpdateSignal() { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static bool isConnect = false; if (m_updateVolumeTimer.isActive()) { m_updateVolumeTimer.stop(); } m_updateVolumeTimer.setInterval(150); m_updateVolumeTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&m_updateVolumeTimer, &QTimer::timeout, this, [&](){ qDebug() << "refreshVolume sinkVolume:" << sinkVolume; Q_EMIT this->updateVolume(sinkVolume, sinkMuted); }); } m_updateVolumeTimer.start(); //end } void UkmediaVolumeControl::sendSourceVolumeUpdateSignal() { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static bool isConnect = false; if (m_updateSourceVolumeTimer.isActive()) { m_updateSourceVolumeTimer.stop(); } m_updateSourceVolumeTimer.setInterval(150); m_updateSourceVolumeTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&m_updateSourceVolumeTimer, &QTimer::timeout, this, [&](){ qDebug() << "refreshVolume sourceVolume:" << sourceVolume; Q_EMIT this->updateSourceVolume(sourceVolume, sourceMuted); }); } m_updateSourceVolumeTimer.start(); //end } sinkInfo UkmediaVolumeControl::getSinkInfoByIndex(int index) { QMap::iterator it; for (it = sinkMap.begin(); it != sinkMap.end(); ++it) { if (index == it.key()) return it.value(); } qInfo() << "Can't find sink info by index" << index; sinkInfo nullInfo; return nullInfo; } sinkInfo UkmediaVolumeControl::getSinkInfoByName(QString name) { QMap::iterator it; for (it = sinkMap.begin(); it != sinkMap.end(); ++it) { if (name == it.value().name) return it.value(); } qInfo() << "Can't find sink info by name" << name; sinkInfo nullInfo; return nullInfo; } sourceInfo UkmediaVolumeControl::getSourceInfoByIndex(int index) { QMap::iterator it; for (it = sourceMap.begin(); it != sourceMap.end(); ++it) { if (index == it.key()) return it.value(); } qInfo() << "Can't find source info by index" << index; sourceInfo nullInfo; return nullInfo; } sourceInfo UkmediaVolumeControl::getSourceInfoByName(QString name) { QMap::iterator it; for (it = sourceMap.begin(); it != sourceMap.end(); ++it) { if (name == it.value().name) return it.value(); } qInfo() << "Can't find source info by name" << name; sourceInfo nullInfo; return nullInfo; } ukui-media/audio/audio.pro0000664000175000017500000000425215170054730014463 0ustar fengfeng#------------------------------------------------- # # Project created by QtCreator 2019-05-30T09:45:54 # #------------------------------------------------- #include(../../../env.pri) QT += widgets xml dbus TEMPLATE = lib CONFIG += plugin #include($$PROJECT_COMPONENTSOURCE/label.pri) include(app-device-control/app-device-control.pri) include(audio-device-control/audio-device-control.pri) INCLUDEPATH += ../../.. \ $$PROJECT_COMPONENTSOURCE \ TARGET = $$qtLibraryTarget(audio) DESTDIR = ../ target.path = $$[QT_INSTALL_LIBS]/ukui-control-center CONFIG += c++11 \ no_keywords link_pkgconfig PKGCONFIG += gio-2.0 \ libxml-2.0 \ gsettings-qt6 \ libcanberra \ dconf \ libpulse \ libpulse-mainloop-glib \ kysdk-qtwidgets \ kysdk-sysinfo \ kysdk-hardware #DEFINES += QT_DEPRECATED_WARNINGS LIBS += -lukcc SOURCES += \ audio.cpp \ ukmedia_input_widget.cpp \ ukmedia_main_widget.cpp \ ukmedia_output_widget.cpp \ ukmedia_settings_widget.cpp \ ukmedia_sound_effects_widget.cpp \ ukmedia_volume_control.cpp \ ukui_custom_style.cpp \ customstyle.cpp \ ukmedia_slider_tip_label_helper.cpp \ ukui_list_widget_item.cpp \ ../common/ukmedia_common.cpp HEADERS += \ audio.h \ ukmedia_input_widget.h \ ukmedia_main_widget.h \ ukmedia_output_widget.h \ ukmedia_settings_widget.h \ ukmedia_sound_effects_widget.h \ ukmedia_volume_control.h \ ukui_custom_style.h \ customstyle.h \ ukmedia_slider_tip_label_helper.h \ ukui_list_widget_item.h \ ../common/ukmedia_common.h FORMS += \ audio.ui TRANSLATIONS += \ translations/zh_CN.ts \ translations/tr.ts \ translations/zh_HK.ts \ translations/bo_CN.ts \ translations/en_US.ts \ translations/mn_MN.ts isEmpty(PREFIX) { PREFIX = /usr } qm_files.path = $${PREFIX}/share/ukui-media/translations/audio/ qm_files.files = translations/* CONFIG(release, debug|release) { !system($$PWD/translate_generation.sh): error("Failed to generate translation") } INSTALLS += target \ qm_files \ ukui-media/audio/translate_generation.sh0000775000175000017500000000054315170054730017406 0ustar fengfeng#!/bin/bash ts_list=(`ls translations/*.ts`) source /etc/os-release version=(`echo $ID`) for ts in "${ts_list[@]}" do printf "\nprocess ${ts}\n" if [ "$version" == "fedora" ] || [ "$version" == "opensuse-leap" ] || [ "$version" == "opensuse-tumbleweed" ];then lrelease-qt6 "${ts}" else /usr/lib/qt6/bin/lrelease "${ts}" fi done ukui-media/audio/ukui_list_widget_item.cpp0000664000175000017500000000667115170052044017740 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukui_list_widget_item.h" #include #include #include #include //#include #include bool isCheckBluetoothInput; UkuiListWidget::UkuiListWidget(QWidget *parent) : QListWidget(parent) { } UkuiListWidget::~UkuiListWidget() { } UkuiListWidgetItem::UkuiListWidgetItem(QWidget *parent) : QWidget(parent) { this->setFixedSize(500,64); QVBoxLayout *vLayout = new QVBoxLayout; portLabel = new QLabel(this); deviceLabel = new QLabel(this); portLabel->setFixedSize(600,24); deviceLabel->setFixedSize(600,24); vLayout->addWidget(portLabel); vLayout->addWidget(deviceLabel); this->setLayout(vLayout); this->show(); } UkuiListWidgetItem::~UkuiListWidgetItem() { } void UkuiListWidgetItem::setSelected(bool selected){ if (selected) { widget->setStyleSheet("QWidget{background: #3D6BE5; border-radius: 4px;}"); } else { widget->setStyleSheet("QListWidget::Item:hover{background:#FF3D6BE5;border-radius: 4px;}"); } } //设置输出设备的设备å��å­—å’Œå��ç§° void UkuiListWidgetItem::setLabelText(QString portLabel, QString deviceLabel){ this->portLabel->setText(portLabel); this->deviceLabel->setText(deviceLabel); } void UkuiListWidgetItem::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); qDebug() << "Mouse Press Event" << this->portLabel->text() << this->deviceLabel->text() << isCheckBluetoothInput; //è“�牙输入去除勾选 if (this->deviceLabel->text().contains("bluez_card")) { if (isCheckBluetoothInput == false) isCheckBluetoothInput = true; else { isCheckBluetoothInput = false; QString cmd = "pactl set-card-profile "+this->deviceLabel->text()+" a2dp_sink"; system(cmd.toLocal8Bit().data()); } } } //void UkuiListWidgetItem::paintEvent(QPaintEvent *event) //{ // QStyleOption opt; // opt.init(this); // QPainter p(this); //// double transparence = transparency * 255; // QColor color = palette().color(QPalette::Base); //// color.setAlpha(transparence); // QBrush brush = QBrush(color); // p.setBrush(brush); // p.setPen(Qt::NoPen); // QPainterPath path; // opt.rect.adjust(0,0,0,0); // path.addRoundedRect(opt.rect,6,6); // p.setRenderHint(QPainter::Antialiasing); // å��锯齿; // p.drawRoundedRect(opt.rect,6,6); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); //// QWidget::paintEvent(event); //} ukui-media/audio/ukmedia_input_widget.cpp0000664000175000017500000002217615170054730017552 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_input_widget.h" #include #include #include UkmediaInputWidget::UkmediaInputWidget(QWidget *parent) : QWidget(parent) { connect(qApp, &QApplication::paletteChanged, this, &UkmediaInputWidget::onPaletteChanged); m_pInputWidget = new QFrame(this); m_pVolumeWidget = new QFrame(m_pInputWidget); m_pInputLevelWidget = new QFrame(m_pInputWidget); m_pInputSlectWidget = new QFrame(m_pInputWidget); m_pNoiseReducteWidget = new QFrame(m_pInputWidget); m_pLoopBackWidget = new QFrame(m_pInputWidget); m_pInputWidget->setFrameShape(QFrame::Shape::Box); m_pVolumeWidget->setFrameShape(QFrame::Shape::Box); m_pInputLevelWidget->setFrameShape(QFrame::Shape::Box); m_pInputSlectWidget->setFrameShape(QFrame::Shape::Box); m_pNoiseReducteWidget->setFrameShape(QFrame::Shape::Box); m_pLoopBackWidget->setFrameShape(QFrame::Shape::Box); //设置大å°� m_pVolumeWidget->setMinimumSize(550,60); m_pVolumeWidget->setMaximumSize(16777215,60); m_pInputLevelWidget->setMinimumSize(550,60); m_pInputLevelWidget->setMaximumSize(16777215,60); m_pInputSlectWidget->setMinimumSize(550,60); m_pInputSlectWidget->setMaximumSize(16777215,60); m_pNoiseReducteWidget->setMinimumSize(550,60); m_pNoiseReducteWidget->setMaximumSize(16777215,60); m_pLoopBackWidget->setMinimumSize(550,90); m_pLoopBackWidget->setMaximumSize(16777215,90); m_pInputLabel = new TitleLabel(this); //~ contents_path /Audio/Input m_pInputLabel->setText(tr("Input")); m_pInputLabel->setContentsMargins(16,0,16,0); m_pInputLabel->setStyleSheet("color: palette(windowText);}"); //~ contents_path /Audio/Input Device m_pInputDeviceLabel = new FixLabel(tr("Input Device"),m_pInputSlectWidget); m_pInputDeviceSelectBox = new QComboBox(m_pInputSlectWidget); //~ contents_path /Audio/Volume m_pIpVolumeLabel = new FixLabel(tr("Volume"),m_pVolumeWidget); m_pInputIconBtn = new UkuiButtonDrawSvg(m_pVolumeWidget); m_pIpVolumeSlider = new AudioSlider(); m_pIpVolumePercentLabel = new QLabel(m_pVolumeWidget); //~ contents_path /Audio/Input Level m_pInputLevelLabel = new FixLabel(tr("Input Level"),m_pInputLevelWidget); m_pInputLevelProgressBar = new QProgressBar(m_pInputLevelWidget); m_pInputLevelProgressBar->setStyle(new CustomStyle); m_pInputLevelProgressBar->setTextVisible(false); m_pInputIconBtn->setFocusPolicy(Qt::NoFocus); //~ contents_path /Audio/Noise Reduction m_pNoiseReducteLabel = new FixLabel(tr("Noise Reduction")); m_pNoiseReducteButton = new KSwitchButton(); //~ contents_path /audio/Voice Monitor m_pLoopBackLabel = new FixLabel(tr("Voice Monitor"),m_pLoopBackWidget);//add 侦å�¬åŠŸèƒ½ m_pLoopBackTipsLabel = new FixLabel(tr("You can hear your voice in the output device of your choice"),m_pLoopBackWidget); m_pLoopBackButton = new KSwitchButton(); QPalette palette = m_pLoopBackTipsLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); m_pLoopBackTipsLabel->setPalette(palette); QPalette pe; pe.setColor(QPalette::WindowText,Qt::red); //输入设备添加布局 m_pInputDeviceLabel->setFixedSize(120,40); m_pInputDeviceSelectBox->setFixedHeight(40); QHBoxLayout *inputdeviceSlectLayout = new QHBoxLayout(); inputdeviceSlectLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); inputdeviceSlectLayout->addWidget(m_pInputDeviceLabel); inputdeviceSlectLayout->addItem(new QSpacerItem(113,20,QSizePolicy::Fixed)); inputdeviceSlectLayout->addWidget(m_pInputDeviceSelectBox); inputdeviceSlectLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); inputdeviceSlectLayout->setSpacing(0); m_pInputSlectWidget->setLayout(inputdeviceSlectLayout); m_pInputSlectWidget->layout()->setContentsMargins(0,0,0,0); //主音é‡�添加布局 QHBoxLayout *m_pMasterLayout = new QHBoxLayout(m_pVolumeWidget); m_pIpVolumeLabel->setFixedSize(110,40); m_pInputIconBtn->setFixedSize(24,24); m_pIpVolumeSlider->setFixedHeight(55); m_pIpVolumePercentLabel->setFixedSize(55,20); m_pMasterLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); m_pMasterLayout->addWidget(m_pIpVolumeLabel); m_pMasterLayout->addItem(new QSpacerItem(123,20,QSizePolicy::Fixed)); m_pMasterLayout->addWidget(m_pInputIconBtn); m_pMasterLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); m_pMasterLayout->addWidget(m_pIpVolumeSlider); m_pMasterLayout->addItem(new QSpacerItem(13,20,QSizePolicy::Maximum)); m_pMasterLayout->addWidget(m_pIpVolumePercentLabel); m_pMasterLayout->addItem(new QSpacerItem(10,20,QSizePolicy::Maximum)); m_pMasterLayout->setSpacing(0); m_pVolumeWidget->setLayout(m_pMasterLayout); m_pVolumeWidget->layout()->setContentsMargins(0,0,0,0); //输入å��馈添加布局 QHBoxLayout *m_pSoundLayout = new QHBoxLayout(m_pInputLevelWidget); m_pInputLevelLabel->setFixedSize(110,40); m_pSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); m_pSoundLayout->addWidget(m_pInputLevelLabel); m_pSoundLayout->addItem(new QSpacerItem(123,20,QSizePolicy::Fixed)); m_pSoundLayout->addWidget(m_pInputLevelProgressBar); m_pSoundLayout->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed)); m_pSoundLayout->setSpacing(0); m_pInputLevelWidget->setLayout(m_pSoundLayout); m_pInputLevelWidget->layout()->setContentsMargins(0,0,0,0); //智能é™�噪 QHBoxLayout *noiseReducteLayout = new QHBoxLayout(m_pNoiseReducteWidget); noiseReducteLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); noiseReducteLayout->addWidget(m_pNoiseReducteLabel); noiseReducteLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); noiseReducteLayout->addWidget(m_pNoiseReducteButton); noiseReducteLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); noiseReducteLayout->setSpacing(0); m_pNoiseReducteWidget->setLayout(noiseReducteLayout); m_pNoiseReducteWidget->layout()->setContentsMargins(0,0,0,0); //侦å�¬åŠŸèƒ½æ·»åŠ å¸ƒå±€ QGridLayout *gridLayout = new QGridLayout(m_pLoopBackWidget); gridLayout->addWidget(m_pLoopBackLabel,0,0); QHBoxLayout *spacer = new QHBoxLayout(m_pLoopBackWidget); spacer->addStretch(); gridLayout->addLayout(spacer,0,2); gridLayout->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed),1,0); gridLayout->addWidget(m_pLoopBackTipsLabel,2,0,1,3); gridLayout->addWidget(m_pLoopBackButton,0,3,3,1); gridLayout->setSpacing(0); m_pLoopBackWidget->setLayout(gridLayout); m_pLoopBackWidget->layout()->setContentsMargins(16,15,16,15); m_pLoopbackLine = myLine(); //进行整体布局 m_pVlayout = new QVBoxLayout(m_pInputWidget); m_pVlayout->addWidget(m_pInputSlectWidget); m_pVlayout->addWidget(myLine()); m_pVlayout->addWidget(m_pVolumeWidget); m_pVlayout->addWidget(myLine()); m_pVlayout->addWidget(m_pInputLevelWidget); m_pVlayout->addWidget(myLine()); m_pVlayout->addWidget(m_pNoiseReducteWidget); m_pVlayout->addWidget(m_pLoopbackLine); m_pVlayout->addWidget(m_pLoopBackWidget); m_pVlayout->setSpacing(0); m_pInputWidget->setLayout(m_pVlayout); m_pInputWidget->layout()->setContentsMargins(0,0,0,0); QVBoxLayout *m_pVlayout1 = new QVBoxLayout(this); m_pVlayout1->addWidget(m_pInputLabel); m_pVlayout1->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed)); m_pVlayout1->addWidget(m_pInputWidget); this->setLayout(m_pVlayout1); this->layout()->setContentsMargins(0,0,0,0); } void UkmediaInputWidget::setLabelAlignment(Qt::Alignment alignment) { m_pIpVolumePercentLabel->setAlignment(alignment); } QFrame* UkmediaInputWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } void UkmediaInputWidget::onPaletteChanged(){ QPalette palette = m_pLoopBackTipsLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); m_pLoopBackTipsLabel->setPalette(palette); } UkmediaInputWidget::~UkmediaInputWidget() { } ukui-media/audio/ukmedia_slider_tip_label_helper.cpp0000664000175000017500000001254415170052044021676 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include "ukui_custom_style.h" MediaSliderTipLabel::MediaSliderTipLabel(){ setAttribute(Qt::WA_TranslucentBackground); } MediaSliderTipLabel::~MediaSliderTipLabel(){ } void MediaSliderTipLabel::paintEvent(QPaintEvent *e) { QStyleOptionFrame opt; initStyleOption(&opt); QStylePainter p(this); // p.setBrush(QBrush(QColor(0x1A,0x1A,0x1A,0x4C))); p.setBrush(QBrush(QColor(0xFF,0xFF,0xFF,0x33))); p.setPen(Qt::NoPen); p.drawRoundedRect(this->rect(), 1, 1); QPainterPath path; path.addRoundedRect(opt.rect,6,6); p.setRenderHint(QPainter::Antialiasing); setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); this->setProperty("blurRegion", QRegion(QRect(0, 0, 1, 1))); QLabel::paintEvent(e); } SliderTipLabelHelper::SliderTipLabelHelper(QObject *parent) :QObject(parent) { m_pTiplabel = new MediaSliderTipLabel(); m_pTiplabel->setWindowFlags(Qt::ToolTip); qApp->installEventFilter(new AppEventFilter(this)); m_pTiplabel->setFixedSize(52,30); m_pTiplabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); } void SliderTipLabelHelper::registerWidget(QWidget *w) { w->removeEventFilter(this); w->installEventFilter(this); } void SliderTipLabelHelper::unregisterWidget(QWidget *w) { w->removeEventFilter(this); } bool SliderTipLabelHelper::eventFilter(QObject *obj, QEvent *e) { auto slider = qobject_cast(obj); if (obj == slider) { switch (e->type()) { case QEvent::MouseMove: { QMouseEvent *event = static_cast(e); mouseMoveEvent(obj, event); return false; } case QEvent::MouseButtonRelease: { QMouseEvent *event = static_cast(e); mouseReleaseEvent(obj, event); return false; } case QEvent::MouseButtonPress:{ QMouseEvent *event = static_cast(e); mousePressedEvent(obj,event); } default: return false; } } return QObject::eventFilter(obj,e); } void SliderTipLabelHelper::mouseMoveEvent(QObject *obj, QMouseEvent *e) { Q_UNUSED(e); QRect rect; QStyleOptionSlider m_option; auto slider = qobject_cast(obj); slider->initStyleOption(&m_option); rect = slider->style()->subControlRect(QStyle::CC_Slider, &m_option,QStyle::SC_SliderHandle,slider); QPoint gPos = slider->mapToGlobal(rect.topLeft()); QString percent; percent = QString::number(slider->value()); percent.append("%"); m_pTiplabel->setText(percent); m_pTiplabel->move(gPos.x()-(m_pTiplabel->width()/2)+9,gPos.y()-m_pTiplabel->height()-1); m_pTiplabel->show(); } void SliderTipLabelHelper::mouseReleaseEvent(QObject *obj, QMouseEvent *e) { Q_UNUSED(obj); Q_UNUSED(e); m_pTiplabel->hide(); } void SliderTipLabelHelper::mousePressedEvent(QObject *obj, QMouseEvent *e) { Q_UNUSED(e); QStyleOptionSlider m_option; auto slider = qobject_cast(obj); QRect rect; //获å�–鼠标的ä½�置,这里并ä¸�能直接从ev中å�–值(因为如果是拖动的è¯�,鼠标开始点击的ä½�置没有æ„�义了) double pos = e->pos().x() / (double)slider->width(); slider->setValue(pos *(slider->maximum() - slider->minimum()) + slider->minimum()); //å�‘父窗å�£å�‘é€�自定义事件event type,这样就å�¯ä»¥åœ¨çˆ¶çª—å�£ä¸­æ�•获这个事件进行处ç�† QEvent evEvent(static_cast(QEvent::User + 1)); QCoreApplication::sendEvent(obj, &evEvent); int value = pos *(slider->maximum() - slider->minimum()) + slider->minimum(); slider->initStyleOption(&m_option); rect = slider->style()->subControlRect(QStyle::CC_Slider, &m_option,QStyle::SC_SliderHandle,slider); QPoint gPos = slider->mapToGlobal(rect.topLeft()); QString percent; percent = QString::number(slider->value());//(m_option.sliderValue); percent.append("%"); m_pTiplabel->setText(percent); m_pTiplabel->move(gPos.x()-(m_pTiplabel->width()/2)+9,gPos.y()-m_pTiplabel->height()-1); m_pTiplabel->show(); } // AppEventFilter AppEventFilter::AppEventFilter(SliderTipLabelHelper *parent) : QObject(parent) { m_wm = parent; } bool AppEventFilter::eventFilter(QObject *obj, QEvent *e) { Q_UNUSED(obj); Q_UNUSED(e); return false; } ukui-media/audio/customstyle.h0000664000175000017500000001763215170054730015412 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "ukmedia_slider_tip_label_helper.h" #include /*! * \brief The CustomStyle class * \details * 自定义QStyle * 基于QProxyStyle,默认使用QProxyStyle的实例绘制控件,你需è¦�针对æŸ�一个控件é‡�新实现若干对应的接å�£ã€‚ * QProxyStyleå�¯ä»¥ä»ŽçŽ°æœ‰çš„qt style实例化,我们å�ªéœ€è¦�知é�“这个styleçš„å��å­—å�³å�¯ã€‚ * è¿™ç§�å�𿳕另æ�¥äº†ä¸�错的扩展性和自由度,因为我们ä¸�需è¦�å°†æŸ�个style的代ç �直接引入我们的项目中, * 也能够“继承â€�这个style类进行二次开å�‘。 * * 下é�¢çš„æ–¹æ³•展现了QStyle的所有的接å�£ï¼Œä½¿ç”¨QStyle进行控件的绘制使得qt应用能够进行风格的切æ�¢ï¼Œ * 从而达到ä¸�修改项目æº�ç �å�´å¯¹åº”用外观产生巨大影å“�的效果。 * * \note * 需è¦�注æ„�QStyle与QSSå¹¶ä¸�兼容,因为QSS本身其实上也是QStyle的一ç§�实现,对一个控件而言,本身ç�†è®ºä¸Šå�ªèƒ½ * 在å�Œä¸€æ—¶é—´è°ƒç”¨å”¯ä¸€ä¸€ä¸ªQStyle进行绘制。 */ class CustomStyle : public QProxyStyle { Q_OBJECT public: explicit CustomStyle(const QString &proxyStyleName = "windows", QObject *parent = nullptr); ~CustomStyle(); /*! * \brief drawComplexControl * \param control 比如ScrollBar,对应CC枚举类型 * \param option * \param painter * \param widget * \details * drawComplexControl用于绘制具有å­�控件的å¤�æ�‚控件,它本身一般ä¸�直接绘制控件, * 而是通过QStyle的其它方法将å¤�æ�‚控件分解æˆ�å­�控件å†�调用其它的draw方法绘制。 * 如果你需è¦�é‡�新实现一个å¤�æ�‚控件的绘制方法,首先考虑的应该是在ä¸�改å�˜å®ƒåŽŸæœ‰çš„ç»˜åˆ¶æµ�程的情况下, * 对它调用到的其它方法进行é‡�写。 * * 如果你ä¸�想使用原有的绘制æµ�程,那你需è¦�é‡�写这个接å�£ï¼Œç„¶å�Žè‡ªå·±å®žçŽ°ä¸€åˆ‡ï¼Œ * 包括背景的绘制,å­�控件的ä½�置和状æ€�计算,å­�控件的绘制等。 * 所以,你需è¦�对这个控件有足够的了解之å�Žå†�å°�试直接é‡�写这个接å�£ã€‚ */ virtual void drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = nullptr) const; /*! * \brief drawControl * \param element 比如按钮,对应CE枚举类型 * \param option * \param painter * \param widget * \details * drawControl用于绘制基本控件元素,它本身一般å�ªè´Ÿè´£ç»˜åˆ¶æŽ§ä»¶çš„一部分或者一层。 * 如果你想è¦�知é�“控件具体如何绘制,你需è¦�å�Œæ—¶ç ”究这个控件的æº�ç �å’ŒQStyle中的æº�ç �, * 因为它们都有å�¯èƒ½æ”¹å�˜æŽ§ä»¶çš„绘制æµ�程。 * * QStyle一般会é�µå¾ªQCommonStyle的绘制æµ�程,QCommenStyle是大部分主æµ�style的最基类, * 它本身ä¸�能完全称之为一个主题,如果你直接使用它,你的控件将ä¸�能被正常绘制,因为它有å�¯èƒ½å�ªæ˜¯ * 在特定的时候执行了特定å�´æœªå®žçŽ°çš„ç»˜åˆ¶æ–¹æ³•ï¼Œå®ƒæ›´åƒ�一个框架或者规范。 */ virtual void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const; virtual void drawItemPixmap(QPainter *painter, const QRect &rectangle, int alignment, const QPixmap &pixmap) const; virtual void drawItemText(QPainter *painter, const QRect &rectangle, int alignment, const QPalette &palette, bool enabled, const QString &text, QPalette::ColorRole textRole = QPalette::NoRole) const; /*! * \brief drawPrimitive * \param element 背景绘制,对应PE枚举类型 * \param option * \param painter * \param widget * \details * drawPrimitive用于绘制控件背景,比如按钮和è�œå�•的背景, * 我们一般需è¦�判断控件的状æ€�æ�¥ç»˜åˆ¶ä¸�å�Œçš„背景, * 比如按钮的hover和点击效果。 */ virtual void drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const; virtual QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *option) const; virtual QStyle::SubControl hitTestComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, const QPoint &position, const QWidget *widget = nullptr) const; virtual QRect itemPixmapRect(const QRect &rectangle, int alignment, const QPixmap &pixmap) const; virtual QRect itemTextRect(const QFontMetrics &metrics, const QRect &rectangle, int alignment, bool enabled, const QString &text) const; //virtual int layoutSpacing(QSizePolicy::ControlType control1, QSizePolicy::ControlType control2, Qt::Orientation orientation, const QStyleOption *option, const QWidget *widget); virtual int pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = nullptr, const QWidget *widget = nullptr) const; /*! * \brief polish * \param widget * \details * polish用于对widget进行预处ç�†ï¼Œä¸€èˆ¬æˆ‘们å�¯ä»¥åœ¨polish中修改其属性, * å�¦å¤–,polish是对动画和特效实现而言å��分é‡�è¦�的一个方法, * 通过polish我们能够使widget和特效和动画形æˆ�对应关系。 */ virtual void polish(QWidget *widget); virtual void polish(QApplication *application); virtual void polish(QPalette &palette); virtual void unpolish(QWidget *widget); virtual void unpolish(QApplication *application); virtual QSize sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget = nullptr) const; virtual QIcon standardIcon(QStyle::StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const; virtual QPalette standardPalette() const; /*! * \brief styleHint * \param hint 对应的枚举是SH * \param option * \param widget * \param returnData * \return * \details * styleHint比较特殊,通过它我们能够改å�˜ä¸€äº›æŽ§ä»¶çš„绘制æµ�程或者方å¼�,比如说QMenu是å�¦å�¯ä»¥æ»šåŠ¨ã€‚ */ virtual int styleHint(QStyle::StyleHint hint, const QStyleOption *option = nullptr, const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const; /*! * \brief subControlRect * \param control * \param option * \param subControl * \param widget * \return * \details * subControlRect返回å­�控件的ä½�置和大å°�ä¿¡æ�¯ï¼Œè¿™ä¸ªæ–¹æ³•一般在内置æµ�程中调用, * 如果我们è¦�é‡�写æŸ�个绘制方法,å�¯èƒ½éœ€è¦�用到它 */ virtual QRect subControlRect(QStyle::ComplexControl control, const QStyleOptionComplex *option, QStyle::SubControl subControl, const QWidget *widget = nullptr) const; /*! * \brief subElementRect * \param element * \param option * \param widget * \return * \details * 与subControlRect类似 */ virtual QRect subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget = nullptr) const; Q_SIGNALS: public Q_SLOTS: private: SliderTipLabelHelper *m_helpTip; }; #endif // CUSTOMSTYLE_H ukui-media/audio/ukmedia_volume_control.h0000664000175000017500000002463415170054730017565 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIAVOLUMECONTROL_H #define UKMEDIAVOLUMECONTROL_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ukui_custom_style.h" #include "../common/ukmedia_common.h" #include #define NOISE_REDUCE_SOURCE "noiseReduceSource" #define PANGUW_SINK "alsa_output.platform-raoliang-sndcard.analog-stereo" #define DECAY_STEP .04 static int n_outstanding = 0; class PortInfo { public: QByteArray name; QByteArray description; uint32_t priority; int available; int direction; int64_t latency_offset; std::vector profiles; }; class UkmediaVolumeControl : public QObject { Q_OBJECT public: UkmediaVolumeControl(); friend class UkmediaMainWidget; virtual ~UkmediaVolumeControl(); public: // Connect to pulseaudio pa_context* getContext(void); static gboolean connectToPulse(gpointer userdata); static void contextStateCallback(pa_context *c, void *userdata); static void subscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata); static void clientCb(pa_context *, const pa_client_info *i, int eol, void *userdata); static void serverInfoCb(pa_context *, const pa_server_info *i, void *userdata); static void cardCb(pa_context *, const pa_card_info *i, int eol, void *userdata); static void sinkCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void sourceCb(pa_context *, const pa_source_info *i, int eol, void *userdata); static void sinkInputCb(pa_context *, const pa_sink_input_info *i, int eol, void *userdata); static void sourceOutputCb(pa_context *, const pa_source_output_info *i, int eol, void *userdata); static void readCallback(pa_stream *s, size_t length, void *userdata); // 待优化 void showError(const char *txt); static void decOutstanding(UkmediaVolumeControl *w); static void serverInfoIndexCb(pa_context *, const pa_server_info *i, void *userdata); static void sinkIndexCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void sourceIndexCb(pa_context *c, const pa_source_info *i, int eol, void *userdata); // 暂未使用 void updateDeviceVisibility(); void setConnectionState(gboolean connected); void setConnectingMessage(const char *string = NULL); static void extStreamRestoreReadCb(pa_context *,const pa_ext_stream_restore_info *i,int eol,void *userdata); static void extStreamRestoreSubscribeCb(pa_context *c, void *userdata); // void ext_device_restore_read_cb(pa_context *,const pa_ext_device_restore_info *i,int eol,void *userdata); // static void ext_device_restore_subscribe_cb(pa_context *c, pa_device_type_t type, uint32_t idx, void *userdata); static void extDeviceManagerReadCb(pa_context *,const pa_ext_device_manager_info *,int eol,void *userdata); static void extDeviceManagerSubscribeCb(pa_context *c, void *userdata); // Update audio info void updateClient(const pa_client_info &info); void updateServer(const pa_server_info &info); void updateCard(UkmediaVolumeControl *c,const pa_card_info &info); bool updateSink(UkmediaVolumeControl *c,const pa_sink_info &info); void updateSource(const pa_source_info &info); void updateSinkInput(const pa_sink_input_info &info); void updateSourceOutput(const pa_source_output_info &info); void updateVolumeMeter(uint32_t source_index, uint32_t sink_input_index, double v); void refreshVolume(int soundType, int info_Vol, bool info_Mute); // Sink volume bool getSinkMute(); int getSinkVolume(); void setSinkMute(bool status); void setSinkVolume(int index, int value); void setBalanceVolume(int index, int value, float balance); float getBalanceVolume(); // Source volume bool getSourceMute(); int getSourceVolume(); void setSourceMute(bool status); void setSourceVolume(int index,int value); // Sink-input volume int getSinkInputVolume(const gchar *name); void setSinkInputMuted(int index,bool status); void setSinkInputVolume(int index,int value); // Source-output volume int getSourceOutputVolume(const gchar *name); void setSourceOutputMuted(int index, bool status); void setSourceOutputVolume(int index, int value); // sinkInfo sinkInfo addSinkInfo(const pa_sink_info& i); sinkInfo getSinkInfoByIndex(int index); sinkInfo getSinkInfoByName(QString name); // sourceInfo sourceInfo addSourceInfo(const pa_source_info& i); sourceInfo getSourceInfoByIndex(int index); sourceInfo getSourceInfoByName(QString name); int getDefaultSinkIndex(); int getDefaultSourceIndex(); bool setCardProfile(int index,const gchar *name); bool setDefaultSink(const gchar *name); bool setDefaultSource(const gchar *name); bool setSinkPort(const gchar *sinkName ,const gchar *portName); bool setSourcePort(const gchar *sourceName, const gchar *portName); // Remove info void removeCard(uint32_t index); void removeSink(uint32_t sinkIndex); void removeSource(uint32_t sourceIndex); void removeSinkInput(uint32_t index); void removeSourceOutput(uint32_t index); void removeClient(uint32_t index); // 确认å�¯ç§»é™¤ï¼Ÿ void removeCardSink(int cardIndex,QString sinkName); void removeCardSource(int cardIndex,QString sourceName); void removeCardMap(int index); //移除指定索引的 card void removeCardProfileMap(int index); //移除声å�¡profile map void removeInputPortMap(int index); //移除指定索引的input port void removeOutputPortMap(int index); //移除指定索引的output port void removeSinkPortMap(int index); void removeSourcePortMap(int index); void removeProfileMap(int index); void removeInputProfile(int index); QString findSinkActivePortName(QString name); // 输入å��馈功能 pa_stream* createMonitorStreamForSource(uint32_t source_idx, uint32_t stream_idx, bool suspend); private: static void sendDeviceChangedSignal(UkmediaVolumeControl* w=nullptr); void sendVolumeUpdateSignal(); void sendSourceVolumeUpdateSignal(); Q_SIGNALS: void paContextReady(); void updateMonoAudio(bool show); void updateLoopBack(bool show); void updateSinkMute(bool isMute); void updateSourceMute(bool isMute); void updateVolume(int value,bool state); void updateSourceVolume(int value,bool state); void addSinkInputSignal(const gchar* name,const gchar *id,int index); void removeSinkInputSignal(const gchar* name); void addSourceOutputSignal(const gchar* name,const gchar *id,int index); void removeSourceOutputSignal(const gchar* name); void checkDeviceSelectionSianal(const pa_card_info *info); void peakChangedSignal(double v); void updatePortSignal(); void updateCboxPortSignal(); void deviceChangedSignal(); public: static pa_context *context; static int reconnectTimeout; static pa_mainloop_api* api; // 输出 int sinkIndex; bool sinkMuted; int sinkVolume = 0; int channel = 2; float balance = 0.0; int defaultOutputCard = -1; QString sinkPortName = ""; QByteArray defaultSinkName; const pa_sink_info *m_pDefaultSink = nullptr; // 输入 int sourceIndex; bool sourceMuted; int sourceVolume = 0; int inputChannel; int defaultInputCard = -1; QString sourcePortName = ""; QString masterDevice = ""; QByteArray defaultSourceName; pa_channel_map channelMap; const pa_source_info *m_pDefaultSource = nullptr; // Card Info QMap cardMap; QMap> cardProfileMap; QMap cardActiveProfileMap; QMap> profileNameMap; //声å�¡è¾“出é…�置文件 QMap> cardProfilePriorityMap; //记录声å�¡ä¼˜å…ˆçº§é…�置文件 QMap> inputPortProfileNameMap; // Sink Info QMap sinkMap; QMap sinkActivePortMap; QMultiMap> sinkPortMap; QMap> outputPortMap; // Source Info QMap sourceMap; QMap> inputPortMap; QMultiMap> sourcePortMap; // Sink-Input Info QStringList sinkInputList; QMap sinkInputMap; // Source-Output Info QMap sourceOutputMap; QByteArray activePort; QByteArray activeProfile; QByteArray noInOutProfile; std::map ports; std::map clientNames; std::vector< std::pair > dPorts; std::vector< std::pair > profiles; double lastPeak = 0; int peakDetectIndex = -1; pa_stream *peak = nullptr; pa_source_flags sourceFlags= PA_SOURCE_NOFLAGS; private: gboolean m_connected; gchar* m_config_filename; //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static QTimer deviceChangedTimer; QTimer m_updateVolumeTimer; QTimer m_updateSourceVolumeTimer; //end }; #endif // UKMEDIAVOLUMECONTROL_H ukui-media/audio/ukmedia_settings_widget.h0000664000175000017500000000342115170054730017710 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIA_SETTINGS_WIDGET_H #define UKMEDIA_SETTINGS_WIDGET_H #include #include #include #include #include "ukui_custom_style.h" #include "kswitchbutton.h" using namespace kdk; class UkmediaSettingsWidget : public QWidget { Q_OBJECT public: explicit UkmediaSettingsWidget(QWidget *parent = nullptr); ~UkmediaSettingsWidget(); friend class UkmediaMainWidget; private: QFrame *myLine(); private: QFrame *m_pAdvancedSettingsWidget; //用于存放声音设备管ç�†ã€�应用声音的窗å�£çš„窗å�£ QFrame *m_pEquipmentControlWidget; //声音设备管ç�†çª—å�£ QFrame *m_pAppSoundCtrlWidget; //应用声音窗å�£ TitleLabel *m_pAdvancedSettingsLabel; QLabel *m_pAppSoundLabel; QLabel *m_pEquipmentControlLabel; QPushButton *m_pAppSoundDetailsBtn; QPushButton *m_pDevControlDetailsBtn; }; #endif // UKMEDIA_SETTINGS_WIDGET_H ukui-media/audio/ukmedia_output_widget.cpp0000664000175000017500000003034715170054730017752 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_output_widget.h" #include "ukui_list_widget_item.h" #include #include UkmediaOutputWidget::UkmediaOutputWidget(QWidget *parent) : QWidget(parent) { connect(qApp, &QApplication::paletteChanged, this, &UkmediaOutputWidget::onPaletteChanged); //加载qssæ ·å¼�文件 QFile QssFile("://combox.qss"); QssFile.open(QFile::ReadOnly); if (QssFile.isOpen()){ sliderQss = QLatin1String(QssFile.readAll()); QssFile.close(); } else { qDebug()<<"combox.qss is not found"; } m_pOutputWidget = new QFrame(this); m_pMasterVolumeWidget = new QFrame(m_pOutputWidget); m_pOutputSlectWidget = new QFrame(m_pOutputWidget); m_pVolumeIncreaseWidget = new QFrame(m_pOutputWidget); m_pAudioBlanceWidget = new QFrame(this); //MonoAudio m_pChannelBalanceWidget = new QFrame(m_pAudioBlanceWidget); m_pMonoAudioWidget = new QFrame(m_pAudioBlanceWidget); m_pOutputWidget->setFrameShape(QFrame::Shape::Box); m_pMasterVolumeWidget->setFrameShape(QFrame::Shape::Box); m_pOutputSlectWidget->setFrameShape(QFrame::Shape::Box); m_pVolumeIncreaseWidget->setFrameShape(QFrame::Shape::Box); m_pAudioBlanceWidget->setFrameShape(QFrame::Shape::Box); //MonoAudio m_pChannelBalanceWidget->setFrameShape(QFrame::Shape::Box); m_pMonoAudioWidget->setFrameShape(QFrame::Shape::Box); //设置大å°� m_pOutputWidget->setMinimumSize(550,0); m_pOutputWidget->setMaximumSize(16777215,360); m_pMasterVolumeWidget->setMinimumSize(550,60); m_pMasterVolumeWidget->setMaximumSize(16777215,60); m_pOutputSlectWidget->setMinimumSize(550,60); m_pOutputSlectWidget->setMaximumSize(16777215,60); m_pVolumeIncreaseWidget->setMinimumSize(550,90); m_pVolumeIncreaseWidget->setMaximumSize(16777215,90); m_pChannelBalanceWidget->setMinimumSize(550,60); //MonoAudio m_pChannelBalanceWidget->setMaximumSize(16777215,60); m_pMonoAudioWidget->setMinimumSize(550,90); m_pMonoAudioWidget->setMaximumSize(16777215,90); m_pOutputLabel = new TitleLabel(this); //~ contents_path /Audio/Output m_pOutputLabel->setText(tr("Output")); m_pOutputLabel->setContentsMargins(16,0,16,0); m_pOutputLabel->setStyleSheet("QLabel{color: palette(windowText);}"); //~ contents_path /Audio/Output Device m_pOutputDeviceLabel = new FixLabel(tr("Output Device"),m_pOutputSlectWidget); m_pDeviceSelectBox = new QComboBox(m_pOutputSlectWidget); //~ contents_path /Audio/Master Volume m_pOpVolumeLabel = new FixLabel(tr("Master Volume"),m_pMasterVolumeWidget); m_pOutputIconBtn = new UkuiButtonDrawSvg(m_pMasterVolumeWidget); m_pOpVolumeSlider = new AudioSlider(m_pMasterVolumeWidget); m_pOpVolumePercentLabel = new QLabel(m_pMasterVolumeWidget); //~ contents_path /Audio/Balance m_pOpBalanceLabel = new FixLabel(tr("Balance"),m_pChannelBalanceWidget); m_pLeftBalanceLabel = new FixLabel(tr("Left"),m_pChannelBalanceWidget); m_pOpBalanceSlider = new UkmediaVolumeSlider(m_pChannelBalanceWidget); m_pRightBalanceLabel = new FixLabel(tr("Right"),m_pChannelBalanceWidget); //~ contents_path /Audio/Volume Increase VolumeIncreaseTipsWidget = new QWidget(m_pVolumeIncreaseWidget); m_pVolumeIncreaseLabel = new FixLabel(tr("Volume Increase"),VolumeIncreaseTipsWidget); VolumeIncreaseTipsLabel = new FixLabel(tr("Volume above 100% can cause sound distortion and damage your speakers."),VolumeIncreaseTipsWidget); m_pVolumeIncreaseButton = new KSwitchButton(); QPalette palette = VolumeIncreaseTipsLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); VolumeIncreaseTipsLabel->setPalette(palette); QVBoxLayout *vlay = new QVBoxLayout(this); vlay->addStretch(); vlay->addWidget(m_pVolumeIncreaseLabel); vlay->addWidget(VolumeIncreaseTipsLabel); vlay->addStretch(); vlay->setSpacing(0); VolumeIncreaseTipsWidget->setLayout(vlay); VolumeIncreaseTipsWidget->layout()->setContentsMargins(0,0,0,0); m_pOutputIconBtn->setFocusPolicy(Qt::NoFocus); //~ contents_path /Audio/Mono Audio MonoAudioTipsWidget = new QWidget(m_pMonoAudioWidget); m_pMonoAudioLabel = new FixLabel(tr("Mono Audio"),MonoAudioTipsWidget); MonoAudioTipsLabel = new FixLabel(tr("It merges the left and right channels into one channel."),MonoAudioTipsWidget); m_pMonoAudioButton = new KSwitchButton(); QPalette palette1 = MonoAudioTipsLabel->palette(); QColor color1 = palette1.color(QPalette::PlaceholderText); palette1.setColor(QPalette::WindowText,color1); MonoAudioTipsLabel->setPalette(palette1); QVBoxLayout *vlay1 = new QVBoxLayout(this); vlay1->addStretch(); vlay1->addWidget(m_pMonoAudioLabel); vlay1->addWidget(MonoAudioTipsLabel); vlay1->addStretch(); vlay1->setSpacing(0); MonoAudioTipsWidget->setLayout(vlay1); MonoAudioTipsWidget->layout()->setContentsMargins(0,0,0,0); //选择输出设备框添加布局 m_pOutputDeviceLabel->setFixedSize(140,20); m_pDeviceSelectBox->setFixedHeight(40); QHBoxLayout *deviceSlectLayout = new QHBoxLayout(); deviceSlectLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); deviceSlectLayout->addWidget(m_pOutputDeviceLabel); deviceSlectLayout->addItem(new QSpacerItem(93,20,QSizePolicy::Fixed)); deviceSlectLayout->addWidget(m_pDeviceSelectBox); deviceSlectLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); deviceSlectLayout->setSpacing(0); m_pOutputSlectWidget->setLayout(deviceSlectLayout); m_pOutputSlectWidget->layout()->setContentsMargins(0,0,0,0); //主音é‡�添加布局 QHBoxLayout *masterLayout = new QHBoxLayout(m_pMasterVolumeWidget); m_pOpVolumeLabel->setFixedSize(110,40); m_pOutputIconBtn->setFixedSize(24,24); m_pOpVolumeSlider->setFixedHeight(55); m_pOpVolumePercentLabel->setFixedSize(55,20); masterLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); masterLayout->addWidget(m_pOpVolumeLabel); masterLayout->addItem(new QSpacerItem(123,20,QSizePolicy::Fixed)); masterLayout->addWidget(m_pOutputIconBtn); masterLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); masterLayout->addWidget(m_pOpVolumeSlider); masterLayout->addItem(new QSpacerItem(13,20,QSizePolicy::Fixed)); masterLayout->addWidget(m_pOpVolumePercentLabel); masterLayout->addItem(new QSpacerItem(10,20,QSizePolicy::Fixed)); masterLayout->setSpacing(0); m_pMasterVolumeWidget->setLayout(masterLayout); m_pMasterVolumeWidget->layout()->setContentsMargins(0,0,0,0); //声é�“平衡添加布局 QHBoxLayout *soundLayout = new QHBoxLayout(m_pChannelBalanceWidget); m_pOpBalanceLabel->setFixedSize(110,20); m_pLeftBalanceLabel->setFixedSize(40,30); m_pOpBalanceSlider->setFixedHeight(55); m_pRightBalanceLabel->setFixedSize(55,30); soundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); soundLayout->addWidget(m_pOpBalanceLabel); soundLayout->addItem(new QSpacerItem(123,20,QSizePolicy::Fixed)); soundLayout->addWidget(m_pLeftBalanceLabel); // soundLayout->addItem(new QSpacerItem(26,20,QSizePolicy::Fixed)); soundLayout->addWidget(m_pOpBalanceSlider); soundLayout->addItem(new QSpacerItem(14,20,QSizePolicy::Fixed)); soundLayout->addWidget(m_pRightBalanceLabel); soundLayout->addItem(new QSpacerItem(10,20,QSizePolicy::Fixed)); soundLayout->setSpacing(0); m_pChannelBalanceWidget->setLayout(soundLayout); m_pChannelBalanceWidget->layout()->setContentsMargins(0,0,0,0); //音é‡�增强 QHBoxLayout *volumeIncreaseLayout = new QHBoxLayout(m_pVolumeIncreaseWidget); volumeIncreaseLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); volumeIncreaseLayout->addWidget(VolumeIncreaseTipsWidget); volumeIncreaseLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); volumeIncreaseLayout->addWidget(m_pVolumeIncreaseButton); volumeIncreaseLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); volumeIncreaseLayout->setSpacing(0); m_pVolumeIncreaseWidget->setLayout(volumeIncreaseLayout); m_pVolumeIncreaseWidget->layout()->setContentsMargins(0,0,0,0); // QFrame *outputselectAndVolume = myLine(); // QFrame *volumeAndBalance = myLine(); //å�•声é�“音频 QHBoxLayout *monoAudioLayout = new QHBoxLayout(m_pMonoAudioWidget); monoAudioLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); monoAudioLayout->addWidget(MonoAudioTipsWidget); monoAudioLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); monoAudioLayout->addWidget(m_pMonoAudioButton); monoAudioLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); monoAudioLayout->setSpacing(0); m_pMonoAudioWidget->setLayout(monoAudioLayout); m_pMonoAudioWidget->layout()->setContentsMargins(0,0,0,0); //进行整体布局 m_pVlayout = new QVBoxLayout(m_pOutputWidget); m_pVlayout->setContentsMargins(0,0,0,0); m_pVlayout->addWidget(m_pOutputSlectWidget); m_pVlayout->addWidget(myLine()); m_pVlayout->addWidget(m_pMasterVolumeWidget); m_pVlayout->addWidget(myLine()); m_pVlayout->addWidget(m_pVolumeIncreaseWidget); m_pVlayout->setSpacing(0); // m_pOutputWidget->setLayout(m_pVlayout); // m_pOutputWidget->layout()->setContentsMargins(0,0,0,0); m_pMonoLine = myLine(); //进行monoAudio布局 QVBoxLayout *m_pVlayout1 = new QVBoxLayout(m_pAudioBlanceWidget); m_pVlayout1->setContentsMargins(0,0,0,0); m_pVlayout1->addWidget(m_pChannelBalanceWidget); m_pVlayout1->addWidget(m_pMonoLine); m_pVlayout1->addWidget(m_pMonoAudioWidget); m_pVlayout1->setSpacing(0); QVBoxLayout *vLayout1 = new QVBoxLayout(this); vLayout1->addWidget(m_pOutputLabel); vLayout1->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed)); vLayout1->addWidget(m_pOutputWidget); vLayout1->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed)); vLayout1->addWidget(m_pAudioBlanceWidget); this->setLayout(vLayout1); this->layout()->setContentsMargins(0,0,0,0); m_pMasterVolumeWidget->setObjectName("masterVolumeWidget"); //设置样å¼� m_pOutputLabel->setObjectName("m_pOutputLabel"); } void UkmediaOutputWidget::setVolumeSliderRange(bool status) { int maxValue = (status) ? 125 : 100; m_pOpVolumeSlider->blockSignals(true); m_pOpVolumeSlider->setRange(0, maxValue); m_pOpVolumeSlider->blockSignals(false); } void UkmediaOutputWidget::setLabelAlignment(Qt::Alignment alignment) { m_pOpVolumePercentLabel->setAlignment(alignment); m_pRightBalanceLabel->setAlignment(alignment); } QFrame* UkmediaOutputWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } void UkmediaOutputWidget::onPaletteChanged(){ QPalette palette = VolumeIncreaseTipsLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); VolumeIncreaseTipsLabel->setPalette(palette); palette = MonoAudioTipsLabel->palette(); color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); MonoAudioTipsLabel->setPalette(palette); } UkmediaOutputWidget::~UkmediaOutputWidget() { } ukui-media/audio/ukmedia_sound_effects_widget.h0000664000175000017500000000611515170054730020702 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIASOUNDEFFECTSWIDGET_H #define UKMEDIASOUNDEFFECTSWIDGET_H #include #include #include #include #include #include #include "ukui_custom_style.h" #include "kswitchbutton.h" using namespace kdk; class UkuiMessageBox : public QMessageBox { public: explicit UkuiMessageBox(); }; class UkmediaSoundEffectsWidget : public QWidget { Q_OBJECT public: explicit UkmediaSoundEffectsWidget(QWidget *parent = nullptr); ~UkmediaSoundEffectsWidget(); friend class UkmediaMainWidget; void alertSoundWidgetShow(bool status); Q_SIGNALS: public Q_SLOTS: private: QFrame *myLine(); private: QFrame *m_pSystemSoundWidget;//存放注销ã€�唤醒ã€�开机ã€�关机æ��示音的窗å�£ QFrame *m_pLagoutWidget;//注销æ��示音窗å�£ QFrame *m_pWakeupMusicWidget;//唤醒音ä¹�窗å�£ QFrame *m_pStartupMusicWidget;//设置开机音ä¹�窗å�£ QFrame *m_pPoweroffMusicWidget;//关机æ��示音 QFrame *m_pAlertSoundFrame;//存放注销ã€�唤醒ã€�开机ã€�关机æ��示音的窗å�£ QFrame *m_pAlertSoundSwitchWidget;//æ��示音开关窗å�£ QFrame *m_pThemeWidget;//æ��示音下的系统音效主题 QString qss; QStyledItemDelegate *itemDelegate; TitleLabel *m_pSoundEffectLabel; FixLabel *m_pSoundThemeLabel; FixLabel *m_pLagoutLabel; FixLabel *m_pAlertSoundSwitchLabel; FixLabel *m_pWakeupMusicLabel; FixLabel *m_pPoweroffMusicLabel; FixLabel *m_pStartupMusicLabel; QComboBox *m_pSoundThemeCombobox; QVBoxLayout *m_pSoundLayout; KSwitchButton *m_pStartupButton; KSwitchButton *m_pPoweroffButton; KSwitchButton *m_pLogoutButton; KSwitchButton *m_pAlertSoundSwitchButton; KSwitchButton *m_pWakeupMusicButton; FixLabel *m_pVolumeChangeLabel; FixLabel *m_pNotificationLabel; QComboBox *m_pVolumeChangeCombobox; QComboBox *m_pNotificationCombobox; QFrame *m_pVolumeChangeWidget;//æ��示音下的音é‡�调节 QFrame *m_pNotificationWidget;//æ��示音下的通知æ��示 QFrame *line1; QFrame *line2; QFrame *line3; // UkmediaVolumeSlider *m_pAlertSlider; // UkuiButtonDrawSvg *m_pAlertIconBtn; }; #endif // UKMEDIASOUNDEFFECTSWIDGET_H ukui-media/audio/ukmedia_sound_effects_widget.cpp0000664000175000017500000003145515170054730021242 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_sound_effects_widget.h" #include #include #include #include #include UkuiMessageBox::UkuiMessageBox() { } UkmediaSoundEffectsWidget::UkmediaSoundEffectsWidget(QWidget *parent) : QWidget(parent) { m_pSystemSoundWidget = new QFrame(this); m_pStartupMusicWidget = new QFrame(m_pSystemSoundWidget); m_pPoweroffMusicWidget = new QFrame(m_pSystemSoundWidget); m_pLagoutWidget = new QFrame(m_pSystemSoundWidget); m_pWakeupMusicWidget = new QFrame(m_pSystemSoundWidget); m_pAlertSoundFrame = new QFrame(this); m_pAlertSoundSwitchWidget = new QFrame(m_pAlertSoundFrame); m_pThemeWidget = new QFrame(m_pAlertSoundSwitchWidget); m_pNotificationWidget = new QFrame(m_pAlertSoundSwitchWidget); m_pVolumeChangeWidget = new QFrame(m_pAlertSoundSwitchWidget); m_pSystemSoundWidget->setFrameShape(QFrame::Shape::Box); m_pStartupMusicWidget->setFrameShape(QFrame::Shape::Box); m_pPoweroffMusicWidget->setFrameShape(QFrame::Shape::Box); m_pLagoutWidget->setFrameShape(QFrame::Shape::Box); m_pWakeupMusicWidget->setFrameShape(QFrame::Shape::Box); m_pAlertSoundFrame->setFrameShape(QFrame::Shape::Box); m_pAlertSoundSwitchWidget->setFrameShape(QFrame::Shape::Box); m_pThemeWidget->setFrameShape(QFrame::Shape::Box); m_pNotificationWidget->setFrameShape(QFrame::Shape::Box); m_pVolumeChangeWidget->setFrameShape(QFrame::Shape::Box); //~ contents_path /Audio/System Sound 系统音效文本框 m_pSoundEffectLabel = new TitleLabel(this); m_pSoundEffectLabel->setText(tr("System Sound")); m_pSoundEffectLabel->setContentsMargins(16,0,16,0); m_pSoundEffectLabel->setStyleSheet("QLabel{color: palette(windowText);}"); //~ contents_path /Audio/Sound Theme m_pSoundThemeLabel = new FixLabel(tr("Sound Theme"),m_pThemeWidget);//æ��示音下的系统音效主题 m_pSoundThemeCombobox = new QComboBox(m_pThemeWidget); //~ contents_path /Audio/Beep Switch m_pAlertSoundSwitchLabel = new FixLabel(tr("Beep Switch"),m_pAlertSoundSwitchWidget);//æ��示音 //~ contents_path /Audio/Poweroff Music m_pPoweroffMusicLabel = new FixLabel(tr("Poweroff Music"),m_pPoweroffMusicWidget);//关机 //~ contents_path /Audio/Startup Music m_pStartupMusicLabel = new FixLabel(tr("Startup Music"),m_pStartupMusicWidget);//开机 //~ contents_path /Audio/Wakeup Music m_pWakeupMusicLabel = new FixLabel(tr("Wakeup Music"),m_pWakeupMusicWidget);//唤醒 //~ contents_path /Audio/Logout Music m_pLagoutLabel = new FixLabel(tr("Logout Music"),m_pLagoutWidget);//注销 //~ contents_path /Audio/Notification Sound m_pNotificationLabel = new FixLabel(tr("Notification Sound"),m_pNotificationWidget);//æ��示音下的通知æ��示 m_pNotificationCombobox = new QComboBox(m_pNotificationWidget); m_pNotificationCombobox->setObjectName("notifyCbox"); //~ contents_path /Audio/Volume Control Sound m_pVolumeChangeLabel = new FixLabel(tr("Volume Control Sound"),m_pVolumeChangeWidget);//音é‡�调节 m_pVolumeChangeCombobox = new QComboBox(m_pVolumeChangeWidget); m_pVolumeChangeCombobox->setObjectName("volChangeCbox"); m_pStartupButton = new KSwitchButton(m_pStartupMusicWidget); m_pLogoutButton = new KSwitchButton(m_pLagoutWidget); m_pWakeupMusicButton = new KSwitchButton(m_pWakeupMusicWidget); m_pPoweroffButton = new KSwitchButton(m_pPoweroffMusicWidget); m_pAlertSoundSwitchButton = new KSwitchButton(m_pAlertSoundSwitchWidget); //设置大å°� m_pSystemSoundWidget->setMinimumSize(550,0); m_pSystemSoundWidget->setMaximumSize(16777215,240); m_pStartupMusicWidget->setMinimumSize(550,60); m_pStartupMusicWidget->setMaximumSize(16777215,60); m_pPoweroffMusicWidget->setMinimumSize(550,60); m_pPoweroffMusicWidget->setMaximumSize(16777215,60); m_pLagoutWidget->setMinimumSize(550,60); m_pLagoutWidget->setMaximumSize(16777215,60); m_pWakeupMusicWidget->setMinimumSize(550,60); m_pWakeupMusicWidget->setMaximumSize(16777215,60); m_pAlertSoundSwitchWidget->setMinimumSize(550,60); m_pAlertSoundSwitchWidget->setMaximumSize(16777215,60); m_pThemeWidget->setMinimumSize(550,60); m_pThemeWidget->setMaximumSize(16777215,60); m_pSoundEffectLabel->setFixedSize(150,32); m_pSoundThemeLabel->setFixedSize(150,40); m_pPoweroffMusicLabel->setFixedSize(150,32); m_pSoundThemeCombobox->setFixedHeight(40); m_pNotificationWidget->setMinimumSize(550,60); m_pNotificationWidget->setMaximumSize(16777215,60); m_pVolumeChangeWidget->setMinimumSize(550,60); m_pVolumeChangeWidget->setMaximumSize(16777215,60); m_pNotificationCombobox->setFixedHeight(40); m_pVolumeChangeCombobox->setFixedHeight(40); m_pVolumeChangeLabel->setFixedSize(220,40); m_pNotificationLabel->setFixedSize(220,40); //添加布局 QHBoxLayout *themeLayout = new QHBoxLayout(m_pThemeWidget); themeLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); themeLayout->addWidget(m_pSoundThemeLabel); themeLayout->addItem(new QSpacerItem(83,20,QSizePolicy::Fixed)); themeLayout->addWidget(m_pSoundThemeCombobox); themeLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); themeLayout->setSpacing(0); m_pThemeWidget->setLayout(themeLayout); m_pThemeWidget->layout()->setContentsMargins(0,0,0,0); QHBoxLayout *NotificationLayout = new QHBoxLayout(m_pNotificationWidget); NotificationLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); NotificationLayout->addWidget(m_pNotificationLabel); NotificationLayout->addItem(new QSpacerItem(13,20,QSizePolicy::Fixed)); NotificationLayout->addWidget(m_pNotificationCombobox); NotificationLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); NotificationLayout->setSpacing(0); m_pNotificationWidget->setLayout(NotificationLayout); NotificationLayout->layout()->setContentsMargins(0,0,0,0); //开机音ä¹�设置开关 QHBoxLayout *startupLayout = new QHBoxLayout(m_pStartupMusicWidget); startupLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); startupLayout->addWidget(m_pStartupMusicLabel); startupLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); startupLayout->addWidget(m_pStartupButton); startupLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); startupLayout->setSpacing(0); m_pStartupMusicWidget->setLayout(startupLayout); m_pStartupMusicWidget->layout()->setContentsMargins(0,0,0,0); //注销æ��示音布局 QHBoxLayout *lagoutLayout = new QHBoxLayout(m_pLagoutWidget); lagoutLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); lagoutLayout->addWidget(m_pLagoutLabel); lagoutLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); lagoutLayout->addWidget(m_pLogoutButton); lagoutLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); lagoutLayout->setSpacing(0); m_pLagoutWidget->setLayout(lagoutLayout); m_pLagoutWidget->layout()->setContentsMargins(0,0,0,0); // m_pLagoutCombobox->setVisible(false); //æ��示音开关布局 QHBoxLayout *alertSoundLayout = new QHBoxLayout(m_pAlertSoundSwitchWidget); alertSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); alertSoundLayout->addWidget(m_pAlertSoundSwitchLabel); alertSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); alertSoundLayout->addWidget(m_pAlertSoundSwitchButton); alertSoundLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); alertSoundLayout->setSpacing(0); m_pAlertSoundSwitchWidget->setLayout(alertSoundLayout); m_pAlertSoundSwitchWidget->layout()->setContentsMargins(0,0,0,0); //窗å�£å…³é—­æ��示音 QHBoxLayout *wakeupMusicLayout = new QHBoxLayout(m_pWakeupMusicWidget); wakeupMusicLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); wakeupMusicLayout->addWidget(m_pWakeupMusicLabel); wakeupMusicLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); wakeupMusicLayout->addWidget(m_pWakeupMusicButton); wakeupMusicLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); wakeupMusicLayout->setSpacing(0); m_pWakeupMusicWidget->setLayout(wakeupMusicLayout); m_pWakeupMusicWidget->layout()->setContentsMargins(0,0,0,0); //音é‡�改å�˜æ��示音 QHBoxLayout *volumeChangedLayout = new QHBoxLayout(m_pVolumeChangeWidget); volumeChangedLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); volumeChangedLayout->addWidget(m_pVolumeChangeLabel); volumeChangedLayout->addItem(new QSpacerItem(13,20,QSizePolicy::Fixed)); volumeChangedLayout->addWidget(m_pVolumeChangeCombobox); volumeChangedLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); volumeChangedLayout->setSpacing(0); m_pVolumeChangeWidget->setLayout(volumeChangedLayout); m_pVolumeChangeWidget->layout()->setContentsMargins(0,0,0,0); //关机æ��示音 QHBoxLayout *poweroffLayout = new QHBoxLayout(m_pPoweroffMusicWidget); poweroffLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); poweroffLayout->addWidget(m_pPoweroffMusicLabel); poweroffLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Expanding)); poweroffLayout->addWidget(m_pPoweroffButton); poweroffLayout->addItem(new QSpacerItem(16,20,QSizePolicy::Fixed)); poweroffLayout->setSpacing(0); m_pPoweroffMusicWidget->setLayout(poweroffLayout); m_pPoweroffMusicWidget->layout()->setContentsMargins(0,0,0,0); QFrame *startupAndPoweroff = myLine(); QFrame *poweroffAndLagout = myLine(); QFrame *lagoutAndWakeup = myLine(); line1 = myLine(); line2 = myLine(); line3 = myLine(); QVBoxLayout *systemSoundLayout = new QVBoxLayout(m_pSystemSoundWidget); systemSoundLayout->setContentsMargins(0,0,0,0); systemSoundLayout->addWidget(m_pStartupMusicWidget); systemSoundLayout->addWidget(startupAndPoweroff); systemSoundLayout->addWidget(m_pPoweroffMusicWidget); systemSoundLayout->addWidget(poweroffAndLagout); systemSoundLayout->addWidget(m_pLagoutWidget); systemSoundLayout->addWidget(lagoutAndWakeup); systemSoundLayout->addWidget(m_pWakeupMusicWidget); systemSoundLayout->setSpacing(0); m_pSystemSoundWidget->setLayout(systemSoundLayout); QVBoxLayout *SoundLayout = new QVBoxLayout(m_pAlertSoundFrame); SoundLayout->setContentsMargins(0,0,0,0); SoundLayout->addWidget(m_pAlertSoundSwitchWidget); SoundLayout->addWidget(line1); SoundLayout->addWidget(m_pThemeWidget); SoundLayout->addWidget(line2); SoundLayout->addWidget(m_pVolumeChangeWidget); SoundLayout->addWidget(line3); SoundLayout->addWidget(m_pNotificationWidget); SoundLayout->setSpacing(0); m_pAlertSoundFrame->setLayout(SoundLayout); //进行整体布局 m_pSoundLayout = new QVBoxLayout(this); m_pSoundLayout->addWidget(m_pSoundEffectLabel); m_pSoundLayout->addItem(new QSpacerItem(16,4,QSizePolicy::Fixed)); m_pSoundLayout->addWidget(m_pSystemSoundWidget); m_pSoundLayout->addItem(new QSpacerItem(16,8,QSizePolicy::Fixed)); m_pSoundLayout->addWidget(m_pAlertSoundFrame); this->setLayout(m_pSoundLayout); m_pSoundLayout->setSpacing(0); this->layout()->setContentsMargins(0,0,0,0); } void UkmediaSoundEffectsWidget::alertSoundWidgetShow(bool status) { if (status) { m_pThemeWidget->show(); m_pVolumeChangeWidget->show(); m_pNotificationWidget->show(); line1->show(); line2->show(); line3->show(); } else { m_pThemeWidget->hide(); m_pVolumeChangeWidget->hide(); m_pNotificationWidget->hide(); line1->hide(); line2->hide(); line3->hide(); } } QFrame* UkmediaSoundEffectsWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } UkmediaSoundEffectsWidget::~UkmediaSoundEffectsWidget() { } ukui-media/audio/titlelabel.h0000664000175000017500000000207215170052044015124 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef TITLE_LABEL_H #define TITLE_LABEL_H #include class TitleLabel : public QLabel { Q_OBJECT public: TitleLabel(QWidget *parent = nullptr); ~TitleLabel(); }; #endif // TITLE_LABEL_H ukui-media/audio/audio.h0000664000175000017500000000377515170052044014117 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef AUDIO_H #define AUDIO_H #include #include #include #include #include "ukmedia_main_widget.h" #include #include #include #if defined(LIBUKCC_LIBRARY) # define LIBUKCC_EXPORT Q_DECL_EXPORT #else # define LIBUKCC_EXPORT Q_DECL_IMPORT #endif namespace Ui { class Audio; } class Audio : public QObject, CommonInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.ukcc.CommonInterface") Q_INTERFACES(CommonInterface) public: Audio(); ~Audio(); QString plugini18nName() Q_DECL_OVERRIDE; int pluginTypes() Q_DECL_OVERRIDE; QWidget *pluginUi() Q_DECL_OVERRIDE; bool isEnable() const Q_DECL_OVERRIDE; const QString name() const Q_DECL_OVERRIDE; bool isShowOnHomePage() const Q_DECL_OVERRIDE; QIcon icon() const Q_DECL_OVERRIDE; QString translationPath() const Q_DECL_OVERRIDE; private: QString pluginName; int pluginType; QWidget *widget; bool mFirstLoad; private: void initSearchText(); // æ�œç´¢ç¿»è¯‘ }; #endif // AUDIO_H ukui-media/audio/ukmedia_main_widget.h0000664000175000017500000002714315170054730017003 0ustar fengfeng /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef WIDGET_H #define WIDGET_H #include #include "ukmedia_volume_control.h" #include "ukmedia_output_widget.h" #include "ukmedia_input_widget.h" #include "ukmedia_sound_effects_widget.h" #include "ukui_list_widget_item.h" #include #include #include #include #include #include #include extern "C" { #include #include #include #include #include #include #include #include } #include #include #include #include #include #include #include #include #include #include #include #include "ukcc/interface/ukcccommon.h" #include "audio-device-control/ukmedia_device_control_widget.h" #include "ukmedia_settings_widget.h" #include "app-device-control/ukmedia_app_device_ctrl.h" #define DEFAULT_ALERT_ID "__default" #define CUSTOM_THEME_NAME "__custom" #define NO_SOUNDS_THEME_NAME "__no_sounds" #ifdef __GNUC__ #define CA_CLAMP(x, low, high) \ __extension__ ({ typeof(x) _x = (x); \ typeof(low) _low = (low); \ typeof(high) _high = (high); \ ((_x > _high) ? _high : ((_x < _low) ? _low : _x)); \ }) #else #define CA_CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) #endif typedef enum { GVC_LEVEL_SCALE_LINEAR, GVC_LEVEL_SCALE_LOG } LevelScale; class UkmediaMainWidget : public QWidget { Q_OBJECT public: UkmediaMainWidget(QWidget *parent = nullptr); ~UkmediaMainWidget(); private: void initWidget(); //åˆ�始化界é�¢ void initGsettings(); //åˆ�始化gsetting值 void initLabelAlignment(); //åˆ�始化label对é½�æ–¹å¼� void initButtonSliderStatus(QString key); void dealSlot(); //处ç�†æ§½å‡½æ•° void handleBalanceSlider(float balanceVolume); void themeChangeIcons(); int caProplistMergeAp(ca_proplist *p, va_list ap); int caPlayForWidget(UkmediaMainWidget *w, uint32_t id, ...); int caProplistSetForWidget(ca_proplist *p, UkmediaMainWidget *widget); void inputVolumeDarkThemeImage(int value,bool status); void outputVolumeDarkThemeImage(int value,bool status); int getInputVolume(); int getOutputVolume(); // void comboboxCurrentTextInit(); QList listExistsPath(); QString findFreePath(); void addValue(QString name,QString filename); static void updateTheme (UkmediaMainWidget *w); static void setupThemeSelector (UkmediaMainWidget *w); static void soundThemeInDir (UkmediaMainWidget *w,GHashTable *hash,const char *dir); static char *loadIndexThemeName (const char *index,char **parent); static void setComboxForThemeName (UkmediaMainWidget *w,const char *name); static void updateAlertsFromThemeName (UkmediaMainWidget *w,const gchar *name); static void updateAlert (UkmediaMainWidget *w,const char *alert_id); static int getFileType (const char *sound_name,char **linked_name); static char *customThemeDirPath (const char *child); void initAlertSound(const char *path); void addSoundFileInCombobox(QString path, QString dirName); bool resetCustomSoundEffects(QString theme, QString soundFile); static void populateModelFromDir (UkmediaMainWidget *w,const char *dirname); static void populateModelFromFile (UkmediaMainWidget *w,const char *filename); static void populateModelFromNode (UkmediaMainWidget *w,xmlNodePtr node); static xmlChar *xmlGetAndTrimNames (xmlNodePtr node); void playAlretSoundFromPath (UkmediaMainWidget *w,QString path); static gboolean saveAlertSounds (QComboBox *combox,const char *id); static void deleteOldFiles (const char **sounds); static void deleteOneFile (const char *sound_name, const char *pattern); static void deleteDisabledFiles (const char **sounds); static void addCustomFile (const char **sounds, const char *filename); static gboolean cappletFileDeleteRecursive (GFile *file, GError **error); static gboolean directoryDeleteRecursive (GFile *directory, GError **error); static void createCustomTheme (const char *parent); static void customThemeUpdateTime (void); static gboolean customThemeDirIsEmpty (void); void addNoneItem(int soundType); void removeNoneItem(int soundType); void initOutputComboboxItem();//åˆ�始化输出的Combobox选项框 void initInputComboboxItem();//åˆ�始化输入的Combobox选项框 void findOutputComboboxItem(QString cardName,QString portLabel); //åˆ�始化Combobox output/input list widget的选项 void addComboboxAvailableOutputPort(); void addComboboxOutputListWidgetItem(QString portLabel, QString cardName); void deleteNotAvailableComboboxOutputPort();//删除ä¸�å�¯ç”¨çš„端å�£ int indexOfOutputPortInOutputCombobox(QString portName); bool comboboxOutputPortIsNeedAdd(int index,QString name);//port是å�¦éœ€è¦�在Combobox list中添加 bool comboboxOutputPortIsNeedDelete(int index,QString name);//port是å�¦éœ€è¦�在Combobox list删除 void findInputComboboxItem(QString cardName,QString portLabel); //åˆ�始化Combobox output/input list widget的选项 void addComboboxAvailableInputPort(); void addComboboxInputListWidgetItem(QString portLabel, QString cardName); //添加input listwidget item void deleteNotAvailableComboboxInputPort(); int indexOfInputPortInInputCombobox(QString portName);//获å�–输入combobox当å‰�的选项框的index bool comboboxInputPortIsNeedAdd(int index,QString name);//port是å�¦éœ€è¦�在Combobox list中添加 bool comboboxInputPortIsNeedDelete(int index,QString name);//port是å�¦éœ€è¦�在Combobox list删除 int findCardIndex(QString cardName, QMap cardMap);//查找声å�¡æŒ‡å®šçš„索引 QString findCardName(int index,QMap cardMap); QString findHighPriorityProfile(int index,QString profile); QString findPortSink(int cardIndex,QString portName); QString findPortSource(int cardIndex,QString portName); bool inputComboboxDeviceContainBluetooth(); QString blueCardNameInCombobox();//记录è“�牙声å�¡å��ç§° bool exitBluetoochDevice(); QString findOutputPortName(int index,QString portLabel); //找到outputPortLabel对应的portName QString findInputPortName(int index,QString portLabel); //找到inputPortLabel对应的portName QString findOutputPortLabel(int index,QString portName); //查找å��为portName对应的portLabel QString findInputPortLabel(int index,QString portName); //查找å��为portName对应的portLabel void setCardProfile(QString name,QString profile); //设置声å�¡çš„é…�置文件 void setDefaultOutputPortDevice(QString devName,QString portName); //设置默认的输出端å�£ void setDefaultInputPortDevice(QString devName,QString portName); //设置默认的输入端å�£ QString findCardActiveProfile(int index); //查找声å�¡çš„active profile private Q_SLOTS: void initVoulmeSlider(); //åˆ�始化音é‡�滑动æ�¡çš„值 void themeComboxIndexChangedSlot(int index); //主题下拉框改å�˜ void customSoundEffectsSlot(int index); //自定义音效改å�˜ void outputWidgetSliderChangedSlot(int v); //输出音é‡�改å�˜ void outputWidgetSliderChangedSlotInBlue(int value); //è“�牙模å¼�下调节音é‡�特殊处ç�† void inputWidgetSliderChangedSlot(int v); //输入滑动æ�¡æ›´æ”¹ void inputMuteButtonSlot(); //输入音é‡�é�™éŸ³æŽ§åˆ¶ void outputMuteButtonSlot(); //输出音é‡�é�™éŸ³æŽ§åˆ¶ void balanceSliderChangedMono(int balanceSliderValue,int sinkVolume ,int sinkIndex); //å¼€å�¯å�•声é�“ void balanceSliderChangedSlot(int balanceSliderValue); //平衡值改å�˜ void peakVolumeChangedSlot(double v); //输入等级 void updateCboxDevicePort(); //æ›´æ–°combobox设备端å�£ void updateComboboxListWidgetItemSlot(); void timeSliderSlot(); void ukuiThemeChangedSlot(const QString &); void onKeyChanged (const QString &); void globalThemeChangedSlot(const QString &); void startupButtonSwitchChangedSlot(bool status); //开机音ä¹�开关 void poweroffButtonSwitchChangedSlot(bool status); //关机音ä¹�开关 void logoutMusicButtonSwitchChangedSlot(bool status); //注销音ä¹�开关 void wakeButtonSwitchChangedSlot(bool status); //唤醒音ä¹�开关 void alertSoundButtonSwitchChangedSlot(bool status); void noiseReductionButtonSwitchChangedSlot(bool status); //é™�噪开关 void loopbackButtonSwitchChangedSlot(bool status);//侦å�¬å¼€å…³ void setAllSinkMono(); //å¼€å�¯å�•声é�“,é��历sinkMap,将所有å�Œå£°é�“sink设置为å�•声é�“输出 void monoAudioBtuuonSwitchChangedSlot(bool status); //å�•声é�“开关 void volumeIncreaseBtuuonSwitchChangedSlot(bool status); void bootMusicSettingsChanged(const QString &); void cboxoutputListWidgetCurrentRowChangedSlot();//combobox output list widget选项改å�˜ void cboxinputListWidgetCurrentRowChangedSlot();//combobox input list widget选项改å�˜ private: UkmediaInputWidget *m_pInputWidget; UkmediaOutputWidget *m_pOutputWidget; UkmediaSoundEffectsWidget *m_pSoundWidget; UkmediaVolumeControl *m_pVolumeControl; UkmediaSettingsWidget *m_pSettingsWidget; QStringList m_pSoundList; QStringList m_pSoundNameList; QStringList m_pThemeNameList; QStringList m_soundThemeList; QStringList m_soundThemeDirList; QStringList m_soundThemeXmlNameList; QGSettings *m_pSoundSettings; QGSettings *m_pBootSetting; QGSettings *m_pThemeSetting; QGSettings *m_pGlobalThemeSetting; QString mThemeName; QString m_languageEnvStr; bool m_hasMusic; bool firstEnterSystem = true; const gchar* m_privOutputPortLabel = ""; int callBackCount = 0; bool firstEntry = true; bool cboxfirstEntry = true; QMap currentOutputPortLabelMap; QMap currentInputPortLabelMap; QMultiMap currentCboxOutputPortLabelMap; QMultiMap currentCboxInputPortLabelMap; bool updatePort = true; bool setDefaultstream = true; int reconnectTime; QTimer *time; QTimer *timeSlider; bool mousePress = false; bool mouseReleaseState = false; QTimer *timeSliderBlance; bool mousePressBlance = false; bool mouseReleaseStateBlance = false; ca_context* m_caContext = nullptr; QElapsedTimer m_boxRepeatTime; QTimer m_boxoutputRepeatTimer; int m_boxoutputRow = 0; QTimer m_boxinputRepeatTimer; int m_boxinputRow = 0; SystemVersion m_version; }; #endif // WIDGET_H ukui-media/audio/ukui_custom_style.cpp0000664000175000017500000002165115170054730017135 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukui_custom_style.h" #include #include #include #include #include #include #include #include #include FixLabel::FixLabel(QWidget *parent): QLabel(parent) { } FixLabel::FixLabel(QString text , QWidget *parent): QLabel(parent) { this->setText(text); } FixLabel::~FixLabel() { } void FixLabel::paintEvent(QPaintEvent *event) { QFontMetrics fontMetrics(this->font()); #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) int fontSize = fontMetrics.horizontalAdvance(fullText); #else int fontSize = fontMetrics.width(fullText); #endif if (fontSize > this->width()) { this->setText(fontMetrics.elidedText(fullText, Qt::ElideRight, this->width()), false); this->setToolTip(fullText); } else { this->setText(fullText, false); this->setToolTip(""); } QLabel::paintEvent(event); } void FixLabel::setText(const QString & text, bool saveTextFlag) { if (saveTextFlag) fullText = text; QLabel::setText(text); } AudioSlider::AudioSlider(QWidget *parent) : KSlider(parent) { Q_UNUSED(parent); setRange(0,100); setSliderType(SmoothSlider); setOrientation(Qt::Horizontal); setFocusPolicy(Qt::StrongFocus); setNodeVisible(false); } void AudioSlider::wheelEvent(QWheelEvent *e) { if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::wheelEvent(e); } void AudioSlider::keyReleaseEvent(QKeyEvent *e) { if (e->key() == Qt::Key_VolumeMute) { qDebug() << "UkmediaVolumeSlider keyReleaseEvent " << e->key(); // 过滤掉快æ�·é”®çš„æ“�作 e->ignore(); // 忽略该事件 return; } //start 长按左键或者下键调低音é‡� if (e->isAutoRepeat()) { if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return; } //end if (this->value() != blueValue) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::keyReleaseEvent(e); } void AudioSlider::mouseMoveEvent(QMouseEvent *e) { isMouseWheel = true; if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::mouseMoveEvent(e); } void AudioSlider::mouseReleaseEvent(QMouseEvent *e) { isMouseWheel = false; if (this->value() != blueValue) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::mouseReleaseEvent(e); } AudioSlider::~AudioSlider() { } UkmediaVolumeSlider::UkmediaVolumeSlider(QWidget *parent) : KSlider(parent) { Q_UNUSED(parent); setRange(-100,100); setSingleStep(100); setTickInterval(100); setSliderType(SmoothSlider); setOrientation(Qt::Horizontal); setFocusPolicy(Qt::StrongFocus); this->installEventFilter(this); } void UkmediaVolumeSlider::showTooltip() { QString percent = QString::number(this->value()); percent.append("%"); QStyleOptionSlider opt; this->initStyleOption(&opt); QRect handleRect = this->style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); QPoint point = this->mapToGlobal(handleRect.topLeft()); QFontMetrics fontMetrics = QFontMetrics(this->font()); QRect fontRect = fontMetrics.boundingRect(percent); QToolTip::showText(point - QPoint(fontRect.width()/2 +3, fontRect.height() + 40), percent); return; } bool UkmediaVolumeSlider::eventFilter(QObject *watched, QEvent *event) { if (watched == this) { if (event->type() == QEvent::HoverEnter) showTooltip(); } return KSlider::eventFilter(watched, event); } void UkmediaVolumeSlider::initStyleOption(QStyleOptionSlider *option) { KSlider::initStyleOption(option); } UkmediaVolumeSlider::~UkmediaVolumeSlider() { } /** * @brief UkuiButtonDrawSvg::refreshIcon * 刷新图标 */ void UkuiButtonDrawSvg::refreshIcon(QImage img, QColor color) { mImage = img; mColor = color; this->repaint(); } /** * @brief UkuiButtonDrawSvg::paintEvent * 绘制按钮背景é€�明 */ void UkuiButtonDrawSvg::paintEvent(QPaintEvent *event) { Q_UNUSED(event) QStyleOption opt; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) opt.initFrom(this); #else opt.init(this); #endif QPainter p(this); p.setBrush(QBrush(QColor(0x13,0x13,0x14,0x00))); p.setPen(Qt::NoPen); QPainterPath path; opt.rect.adjust(0,0,0,0); path.addRoundedRect(opt.rect,6,6); p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); p.drawRoundedRect(opt.rect,6,6); setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } QRect UkuiButtonDrawSvg::IconGeometry() { QRect res = QRect(QPoint(0,0),QSize(16,16)); res.moveCenter(QRect(0,0,width(),height()).center()); return res; } /** * @brief UkuiButtonDrawSvg::drawIcon * 绘制按钮图标 */ void UkuiButtonDrawSvg::drawIcon(QPaintEvent* e) { Q_UNUSED(e); QPainter painter(this); QRect iconRect = IconGeometry(); if (mImage.size() != iconRect.size()) { mImage = mImage.scaled(iconRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QRect r = mImage.rect(); r.moveCenter(iconRect.center()); iconRect = r; } this->setProperty("fillIconSymbolicColor", true); filledSymbolicColoredPixmap(mImage,mColor); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); //抗锯齿 + 高比例模糊处ç�† painter.drawImage(iconRect, mImage); } // 更新音é‡�图标 void UkuiButtonDrawSvg::outputVolumeDarkThemeImage(int value, bool status) { QImage image; QColor color = QColor(0,0,0,216); if (status) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value <= 0) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value > 0 && value <= 33) { image = QIcon::fromTheme("audio-volume-low-symbolic").pixmap(24,24).toImage(); } else if (value >33 && value <= 66) { image = QIcon::fromTheme("audio-volume-medium-symbolic").pixmap(24,24).toImage(); } else { image = QIcon::fromTheme("audio-volume-high-symbolic").pixmap(24,24).toImage(); } refreshIcon(image, color); } bool UkuiButtonDrawSvg::event(QEvent *event) { switch (event->type()) { case QEvent::Paint: drawIcon(static_cast(event)); break; case QEvent::Move: case QEvent::Resize: { QRect rect = IconGeometry(); } break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: event->accept(); break; default: break; } return QPushButton::event(event); } UkuiButtonDrawSvg::UkuiButtonDrawSvg(QWidget *parent) { Q_UNUSED(parent); } UkuiButtonDrawSvg::~UkuiButtonDrawSvg() { } QPixmap UkuiButtonDrawSvg::filledSymbolicColoredPixmap(QImage &img, QColor &baseColor) { for (int x = 0; x < img.width(); x++) { for (int y = 0; y < img.height(); y++) { auto color = img.pixelColor(x, y); if (color.alpha() > 0) { int hue = color.hue(); if (!qAbs(hue - symbolic_color.hue()) < 10) { color.setRed(baseColor.red()); color.setGreen(baseColor.green()); color.setBlue(baseColor.blue()); img.setPixelColor(x, y, color); } } } } return QPixmap::fromImage(img); } TitleLabel::TitleLabel(QWidget *parent): QLabel(parent) { this ->setContentsMargins(16,0,0,0); } TitleLabel::~TitleLabel() { } ukui-media/audio/audio.ui0000664000175000017500000000206015170052044014267 0ustar fengfeng Audio 0 0 800 710 0 0 16777215 16777215 Audio 0 0 0 32 48 ukui-media/audio/ukmedia_main_widget.cpp0000664000175000017500000041171215170054730017335 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_main_widget.h" #include #include #include #include #include #include #include #include #include #include #include #define GVC_SOUND_SOUND (xmlChar *) "sound" #define GVC_SOUND_NAME (xmlChar *) "name" #define GVC_SOUND_FILENAME (xmlChar *) "filename" #define KEYBINDINGS_CUSTOM_SCHEMA "org.ukui.media.sound" #define KEYBINDINGS_CUSTOM_DIR "/org/ukui/sound/keybindings/" #define SOUND_THEME_DIR "/usr/share/sounds" #define SOUND_FILE_STARTUP_PATH "/usr/share/ukui-media/sounds/startup.ogg" #define SOUND_FILE_SHUTDOWN_PATH "/usr/share/ukui-media/sounds/shutdown.ogg" #define SOUND_FILE_LOGOUT_PATH "/usr/share/ukui-media/sounds/logout.ogg" #define SOUND_FILE_WEAKUP_PATH "/usr/share/ukui-media/sounds/weakup.ogg" #define MAX_CUSTOM_SHORTCUTS 1000 #define FILENAME_KEY "filename" #define NAME_KEY "name" guint appnum = 0; extern bool isCheckBluetoothInput; enum { SOUND_TYPE_UNSET, SOUND_TYPE_OFF, SOUND_TYPE_DEFAULT_FROM_THEME, SOUND_TYPE_BUILTIN, SOUND_TYPE_CUSTOM }; UkmediaMainWidget::UkmediaMainWidget(QWidget *parent) : QWidget(parent), m_languageEnvStr(getenv("LANGUAGE")), m_version(UkmediaCommon::getInstance().getSystemVersion()) { m_pVolumeControl = new UkmediaVolumeControl; // 获å�–声音gsettings值 if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)) m_pSoundSettings = new QGSettings(KEY_SOUNDS_SCHEMA); // åˆ�始化界é�¢ initWidget(); initLabelAlignment(); // åˆ�始化系统音效主题 setupThemeSelector(this); updateTheme(this); // åˆ�始化自定义音效 initAlertSound(SOUND_THEME_DIR); // åˆ�始化gsetting值 initGsettings(); time = new QTimer(); // 处ç�†æ§½å‡½æ•° dealSlot(); } /* * åˆ�始化界é�¢ */ void UkmediaMainWidget::initWidget() { m_pOutputWidget = new UkmediaOutputWidget(); m_pInputWidget = new UkmediaInputWidget(); m_pSoundWidget = new UkmediaSoundEffectsWidget(); m_pSettingsWidget = new UkmediaSettingsWidget(); cboxfirstEntry = true; mThemeName = UKUI_THEME_LIGHT; QVBoxLayout *m_pvLayout = new QVBoxLayout(); m_pvLayout->addWidget(m_pOutputWidget); m_pvLayout->addWidget(m_pInputWidget); m_pvLayout->addWidget(m_pSoundWidget); m_pvLayout->addWidget(m_pSettingsWidget); m_pvLayout->setSpacing(40); m_pvLayout->addStretch(); this->setLayout(m_pvLayout); this->setMinimumWidth(0); this->setMaximumWidth(16777215); this->layout()->setContentsMargins(0,0,0,0); m_pInputWidget->m_pInputLevelProgressBar->setMaximum(101); /* The following functions are not integrated into openkylin. * Therefore, need to hide the corresponding modules */ if (SystemVersion::SYSTEM_VERSION_OKNILE == m_version \ || SystemVersion::SYSTEM_VERSION_KYLIN_2501_V11 == m_version) { m_pOutputWidget->m_pMonoLine->hide(); m_pOutputWidget->m_pMonoAudioWidget->hide(); m_pInputWidget->m_pLoopbackLine->hide(); m_pInputWidget->m_pLoopBackWidget->hide(); m_pSettingsWidget->hide(); } } QList UkmediaMainWidget::listExistsPath() { char ** childs; int len; DConfClient * client = dconf_client_new(); childs = dconf_client_list (client, KEYBINDINGS_CUSTOM_DIR, &len); g_object_unref (client); QList vals; for (int i = 0; childs[i] != NULL; i++){ if (dconf_is_rel_dir (childs[i], NULL)){ char * val = g_strdup (childs[i]); vals.append(val); } } g_strfreev (childs); return vals; } QString UkmediaMainWidget::findFreePath(){ int i = 0; char * dir; bool found; QList existsdirs; existsdirs = listExistsPath(); for (; i < MAX_CUSTOM_SHORTCUTS; i++){ found = true; dir = QString("custom%1/").arg(i).toLatin1().data(); for (int j = 0; j < existsdirs.count(); j++) if (!g_strcmp0(dir, existsdirs.at(j))){ found = false; break; } if (found) break; } if (i == MAX_CUSTOM_SHORTCUTS){ qDebug() << "Keyboard Shortcuts" << "Too many custom shortcuts"; return ""; } return QString("%1%2").arg(KEYBINDINGS_CUSTOM_DIR).arg(QString(dir)); } void UkmediaMainWidget::addValue(QString name,QString filename) { //在创建setting表时,先判断是å�¦å­˜åœ¨è¯¥è®¾ç½®ï¼Œå­˜åœ¨æ—¶ä¸�创建 QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = g_strconcat(prepath, path, nullptr); if (allpath == nullptr) { g_warning("Memory allocation failed for allpath"); continue; } const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); QString filenameStr = settings->get(FILENAME_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); g_warning("full path: %s", allpath); qDebug() << filenameStr << FILENAME_KEY <set(FILENAME_KEY, filename); settings->set(NAME_KEY, name); } } void UkmediaMainWidget::initLabelAlignment() { if (!UkmediaCommon::getInstance().isHWKLanguageEnv(m_languageEnvStr)) { m_pInputWidget->setLabelAlignment(Qt::AlignCenter); m_pOutputWidget->setLabelAlignment(Qt::AlignCenter); } else { m_pInputWidget->setLabelAlignment(Qt::AlignLeft | Qt::AlignCenter); m_pOutputWidget->setLabelAlignment(Qt::AlignLeft | Qt::AlignCenter); } } /* * åˆ�始化gsetting */ void UkmediaMainWidget::initGsettings() { //获å�–声音gsettings值 bool status; if (m_pSoundSettings->keys().contains("eventSounds")) { status = m_pSoundSettings->get(EVENT_SOUNDS_KEY).toBool(); m_pSoundWidget->m_pAlertSoundSwitchButton->setChecked(status); m_pSoundWidget->alertSoundWidgetShow(status);//åˆ�始化æ��示音窗å�£éƒ¨ä»¶æ˜¯å�¦æ˜¾ç¤º } if (m_pSoundSettings->keys().contains("dnsNoiseReduction")) { status = m_pSoundSettings->get(DNS_NOISE_REDUCTION).toBool(); m_pInputWidget->m_pNoiseReducteButton->setChecked(status); } if (m_pSoundSettings->keys().contains("loopback")) { status = m_pSoundSettings->get(LOOP_BACK).toBool(); m_pInputWidget->m_pLoopBackButton->setChecked(status); } if (m_pSoundSettings->keys().contains("monoAudio")) { status = m_pSoundSettings->get(MONO_AUDIO).toBool(); m_pOutputWidget->m_pMonoAudioButton->setChecked(status); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (m_pVolumeControl->outputPortMap.count() == 0) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { if (status) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); } } #elif 0 if (status) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); } #endif } if (m_pSoundSettings->keys().contains("volumeIncrease")) { status = m_pSoundSettings->get(VOLUME_INCREASE).toBool(); m_pOutputWidget->m_pVolumeIncreaseButton->setChecked(status); m_pOutputWidget->setVolumeSliderRange(status); } if(m_pSoundSettings->keys().contains("themeName")) { QString soundThemeStr = m_pSoundSettings->get(SOUND_THEME_KEY).toString(); int index = m_pSoundWidget->m_pSoundThemeCombobox->findData(soundThemeStr); m_pSoundWidget->m_pSoundThemeCombobox->setCurrentIndex(index); } if (m_pSoundSettings->keys().contains("customTheme")) { if (m_pSoundSettings->get(SOUND_CUSTOM_THEME_KEY).toBool()) { m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(true); m_pSoundWidget->m_pSoundThemeCombobox->setCurrentText(tr("Custom")); m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(false); } } if (m_pSoundSettings->keys().contains("notificationGeneral")) { QString notification = m_pSoundSettings->get(NOTIFICATION_GENGERAL).toString(); int index = m_pSoundWidget->m_pNotificationCombobox->findData(notification); m_pSoundWidget->m_pNotificationCombobox->setCurrentIndex(index); } if (m_pSoundSettings->keys().contains("audioVolumeChange")) { QString volumeControl = m_pSoundSettings->get(AUDIO_VOLUME_CHANGE).toString(); int index = m_pSoundWidget->m_pVolumeChangeCombobox->findData(volumeControl); m_pSoundWidget->m_pVolumeChangeCombobox->setCurrentIndex(index); } connect(m_pSoundSettings, SIGNAL(changed(const QString &)),this,SLOT(onKeyChanged(const QString &))); // 检测系统全局主题 if (QGSettings::isSchemaInstalled(UKUI_GLOBALTHEME_SETTINGS)) { m_pGlobalThemeSetting = new QGSettings(UKUI_GLOBALTHEME_SETTINGS); QString globalTheme = m_pGlobalThemeSetting->get(GLOBAL_THEME_NAME).toString(); if (globalTheme != "custom") { m_pSoundSettings->set(SOUND_THEME_KEY, globalTheme); m_pSoundSettings->set(SOUND_CUSTOM_THEME_KEY, false); } connect(m_pGlobalThemeSetting, SIGNAL(changed(const QString &)), this, SLOT(globalThemeChangedSlot(QString))); } //检测系统主题 if (QGSettings::isSchemaInstalled(UKUI_THEME_SETTING)){ m_pThemeSetting = new QGSettings(UKUI_THEME_SETTING); if (m_pThemeSetting->keys().contains("styleName")) { mThemeName = m_pThemeSetting->get(UKUI_THEME_NAME).toString(); } connect(m_pThemeSetting, SIGNAL(changed(const QString &)),this,SLOT(ukuiThemeChangedSlot(const QString &))); } //检测设计开关机音ä¹� if (QGSettings::isSchemaInstalled(UKUI_SWITCH_SETTING)) { m_pBootSetting = new QGSettings(UKUI_SWITCH_SETTING); // if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ // if (m_pSoundSettings->keys().contains("startupMusic")) { // m_pSoundWidget->m_pStartupButton->setChecked(m_pSoundSettings->get(STARTUP_MUSIC).toBool());//开机音ä¹� // } // } if (m_pBootSetting->keys().contains("startupMusic")) { bool startup = m_pBootSetting->get(UKUI_STARTUP_MUSIC_KEY).toBool();//开机音ä¹� m_pSoundWidget->m_pStartupButton->setChecked(startup); } if (m_pBootSetting->keys().contains("poweroffMusic")) { bool poweroff = m_pBootSetting->get(UKUI_POWEROFF_MUSIC_KEY).toBool();//关机音ä¹� m_pSoundWidget->m_pPoweroffButton->setChecked(poweroff); } if (m_pBootSetting->keys().contains("logoutMusic")) { bool logout = m_pBootSetting->get(UKUI_LOGOUT_MUSIC_KEY).toBool();//注销音ä¹� m_pSoundWidget->m_pLogoutButton->setChecked(logout); } if (m_pBootSetting->keys().contains("weakupMusic")) { bool m_hasMusic = m_pBootSetting->get(UKUI_WAKEUP_MUSIC_KEY).toBool();//休眠音ä¹� m_pSoundWidget->m_pWakeupMusicButton->setChecked(m_hasMusic); } connect(m_pBootSetting,SIGNAL(changed(const QString &)),this,SLOT(bootMusicSettingsChanged(const QString &))); } } void UkmediaMainWidget::initButtonSliderStatus(QString key) { if (key == "eventSounds") { if (m_pSoundSettings->keys().contains("eventSounds")) m_pSoundWidget->m_pAlertSoundSwitchButton->setChecked(m_pSoundSettings->get(EVENT_SOUNDS_KEY).toBool()); } if (key == "dnsNoiseReduction") { if (m_pSoundSettings->keys().contains("dnsNoiseReduction")) m_pInputWidget->m_pNoiseReducteButton->setChecked(m_pSoundSettings->get(DNS_NOISE_REDUCTION).toBool()); } else if (key == "loopback") { if (m_pSoundSettings->keys().contains("loopback")) m_pInputWidget->m_pLoopBackButton->setChecked(m_pSoundSettings->get(LOOP_BACK).toBool()); } else if (key == "volumeIncrease") { if (m_pSoundSettings->keys().contains("volumeIncrease")) { bool status = m_pSoundSettings->get(VOLUME_INCREASE).toBool(); m_pOutputWidget->m_pVolumeIncreaseButton->setChecked(status); m_pOutputWidget->setVolumeSliderRange(status); } } else if (key == "monoAudio") { if (m_pSoundSettings->keys().contains("monoAudio")) { m_pOutputWidget->m_pMonoAudioButton->setChecked(m_pSoundSettings->get(MONO_AUDIO).toBool()); } } else if (key == "themeName") { int index = m_pSoundWidget->m_pSoundThemeCombobox->findData(m_pSoundSettings->get(SOUND_THEME_KEY).toString()); m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(true); m_pSoundWidget->m_pSoundThemeCombobox->setCurrentIndex(index); m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(false); } else if (key == "customTheme") { if (m_pSoundSettings->get(SOUND_CUSTOM_THEME_KEY).toBool()) m_pSoundWidget->m_pSoundThemeCombobox->setCurrentText(tr("Custom")); } else if (key == "audioVolumeChange") { int index = m_pSoundWidget->m_pVolumeChangeCombobox->findData(m_pSoundSettings->get(AUDIO_VOLUME_CHANGE).toString()); m_pSoundWidget->m_pVolumeChangeCombobox->setCurrentIndex(index); } else if (key == "notificationGeneral") { int index = m_pSoundWidget->m_pNotificationCombobox->findData(m_pSoundSettings->get(NOTIFICATION_GENGERAL).toString()); m_pSoundWidget->m_pNotificationCombobox->setCurrentIndex(index); } } /* * 处ç�†æ§½å‡½æ•° */ void UkmediaMainWidget::dealSlot() { QTimer::singleShot(500, this, SLOT(initVoulmeSlider())); m_boxRepeatTime.start(); // 输出模å�—槽函数 m_boxoutputRepeatTimer.setInterval(1000 * 1); m_boxoutputRepeatTimer.setSingleShot(true); connect(m_pOutputWidget->m_pDeviceSelectBox,QOverload::of(&QComboBox::currentIndexChanged),this,[=](int index){ m_boxoutputRow = index; if (m_boxRepeatTime.elapsed() < (1000 * 1)) { //start 频ç¹�点击é‡�置开å�¯ m_boxoutputRepeatTimer.stop(); m_boxoutputRepeatTimer.start(); //end } else { //start å�•点一次直接å“�应 cboxoutputListWidgetCurrentRowChangedSlot(); //end } m_boxRepeatTime.start(); }); connect(&m_boxoutputRepeatTimer,&QTimer::timeout,this,&UkmediaMainWidget::cboxoutputListWidgetCurrentRowChangedSlot); connect(m_pOutputWidget->m_pOutputIconBtn,SIGNAL(clicked()),this,SLOT(outputMuteButtonSlot())); connect(m_pOutputWidget->m_pOpVolumeSlider,SIGNAL(valueChanged(int)),this,SLOT(outputWidgetSliderChangedSlot(int))); connect(m_pOutputWidget->m_pOpVolumeSlider,SIGNAL(blueValueChanged(int)),this,SLOT(outputWidgetSliderChangedSlotInBlue(int))); connect(m_pOutputWidget->m_pVolumeIncreaseButton,SIGNAL(stateChanged(bool)),this,SLOT(volumeIncreaseBtuuonSwitchChangedSlot(bool))); connect(m_pOutputWidget->m_pOpBalanceSlider,SIGNAL(valueChanged(int)),this,SLOT(balanceSliderChangedSlot(int))); connect(m_pOutputWidget->m_pMonoAudioButton,SIGNAL(stateChanged(bool)),this,SLOT(monoAudioBtuuonSwitchChangedSlot(bool))); // 输入模å�—槽函数 m_boxinputRepeatTimer.setInterval(1000*1); m_boxinputRepeatTimer.setSingleShot(true); connect(m_pInputWidget->m_pInputDeviceSelectBox,QOverload::of(&QComboBox::currentIndexChanged),this,[=](int index){ m_boxinputRow = index; if (m_boxRepeatTime.elapsed() < (1000 * 1)) { //start 频ç¹�点击é‡�置开å�¯ m_boxinputRepeatTimer.stop(); m_boxinputRepeatTimer.start(); //end } else { //start å�•点一次直接å“�应 cboxinputListWidgetCurrentRowChangedSlot(); //end } m_boxRepeatTime.start(); }); connect(&m_boxinputRepeatTimer,&QTimer::timeout,this,&UkmediaMainWidget::cboxinputListWidgetCurrentRowChangedSlot); connect(m_pInputWidget->m_pInputIconBtn,SIGNAL(clicked()),this,SLOT(inputMuteButtonSlot())); connect(m_pInputWidget->m_pIpVolumeSlider,SIGNAL(valueChanged(int)),this,SLOT(inputWidgetSliderChangedSlot(int))); connect(m_pVolumeControl,SIGNAL(peakChangedSignal(double)),this,SLOT(peakVolumeChangedSlot(double))); // 输入å��馈槽函数 connect(m_pInputWidget->m_pNoiseReducteButton,SIGNAL(stateChanged(bool)),this,SLOT(noiseReductionButtonSwitchChangedSlot(bool))); connect(m_pInputWidget->m_pLoopBackButton,SIGNAL(stateChanged(bool)),this,SLOT(loopbackButtonSwitchChangedSlot(bool))); // 系统音效模å�—槽函数 connect(m_pSoundWidget->m_pStartupButton,SIGNAL(stateChanged(bool)),this,SLOT(startupButtonSwitchChangedSlot(bool))); connect(m_pSoundWidget->m_pPoweroffButton,SIGNAL(stateChanged(bool)),this,SLOT(poweroffButtonSwitchChangedSlot(bool))); connect(m_pSoundWidget->m_pLogoutButton,SIGNAL(stateChanged(bool)),this,SLOT(logoutMusicButtonSwitchChangedSlot(bool))); connect(m_pSoundWidget->m_pWakeupMusicButton,SIGNAL(stateChanged(bool)),this,SLOT(wakeButtonSwitchChangedSlot(bool))); connect(m_pSoundWidget->m_pAlertSoundSwitchButton,SIGNAL(stateChanged(bool)),this,SLOT(alertSoundButtonSwitchChangedSlot(bool))); connect(m_pSoundWidget->m_pSoundThemeCombobox,SIGNAL(currentIndexChanged(int)),this,SLOT(themeComboxIndexChangedSlot(int))); connect(m_pSoundWidget->m_pVolumeChangeCombobox,SIGNAL(currentIndexChanged(int)),this,SLOT(customSoundEffectsSlot(int))); connect(m_pSoundWidget->m_pNotificationCombobox,SIGNAL(currentIndexChanged(int)),this,SLOT(customSoundEffectsSlot(int))); // 更新设备端å�£ connect(m_pVolumeControl,SIGNAL(updatePortSignal()),this,SLOT(updateCboxDevicePort())); connect(m_pVolumeControl,SIGNAL(deviceChangedSignal()),this,SLOT(updateComboboxListWidgetItemSlot())); timeSlider = new QTimer(this); connect(timeSlider,SIGNAL(timeout()),this,SLOT(timeSliderSlot())); //判断设备是å�¦ä¸ºå�•声é�“æ�¥æ˜¾ç¤º/éš�è—� å�•声é�“模å�— connect(m_pVolumeControl,&UkmediaVolumeControl::updateMonoAudio,this,[=](bool show){ if (SystemVersion::SYSTEM_VERSION_OKNILE == m_version \ || SystemVersion::SYSTEM_VERSION_KYLIN_2501_V11 == m_version) { return; } if (show) { m_pOutputWidget->m_pAudioBlanceWidget->show(); m_pOutputWidget->m_pMonoAudioWidget->show(); } else { m_pOutputWidget->m_pAudioBlanceWidget->hide(); m_pOutputWidget->m_pMonoAudioWidget->hide(); } qDebug() << "mono audio show:" << show; }); //bug#254769/256035 输入设备为内置mic或为空时,需è¦�éš�è—�侦å�¬åŠŸèƒ½ï¼ˆæŽ§åˆ¶é�¢æ�¿ä»£ç �实现)并å�¸è½½ä¾¦å�¬æ¨¡å�— connect(m_pVolumeControl,&UkmediaVolumeControl::updateLoopBack,this,[=](bool show){ if (ukcc::UkccCommon::isOpenkylin()) return; if (show) { m_pInputWidget->m_pLoopbackLine->show(); m_pInputWidget->m_pLoopBackWidget->show(); } else { m_pInputWidget->m_pLoopBackButton->setChecked(false); m_pInputWidget->m_pLoopbackLine->hide(); m_pInputWidget->m_pLoopBackWidget->hide(); } qDebug() << "loopback show:" << show; }); connect(m_pVolumeControl,&UkmediaVolumeControl::updateSinkMute,this,[=](bool state) { themeChangeIcons(); }); connect(m_pVolumeControl,&UkmediaVolumeControl::updateSourceMute,this,[=](bool state) { themeChangeIcons(); }); //切æ�¢è¾“出设备或者音é‡�改å�˜æ—¶éœ€è¦�å�Œæ­¥æ›´æ–°éŸ³é‡� connect(m_pVolumeControl,&UkmediaVolumeControl::updateVolume,this,[=](int value, bool state){ qDebug() << "Sink Volume Changed" << value << state; bool isChecked = m_pOutputWidget->m_pVolumeIncreaseButton->isChecked(); if(!isChecked && value > PA_VOLUME_NORMAL){ m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex,PA_VOLUME_NORMAL); return; } int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); QString percent = QString::number(mediaVolume); float balanceVolume = m_pVolumeControl->getBalanceVolume(); m_pOutputWidget->m_pOpVolumePercentLabel->setText(percent+"%"); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(true); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(true); handleBalanceSlider(balanceVolume); m_pOutputWidget->m_pOpVolumeSlider->setValue(mediaVolume); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(false); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(false); initOutputComboboxItem(); themeChangeIcons(); }); connect(m_pVolumeControl,&UkmediaVolumeControl::updateSourceVolume,this,[=](int value, bool state){ qDebug() << "Source Volume Changed" << value << state; int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); QString percent = QString::number(mediaVolume); m_pInputWidget->m_pIpVolumePercentLabel->setText(percent+"%"); m_pInputWidget->m_pIpVolumeSlider->blockSignals(true); m_pInputWidget->m_pIpVolumeSlider->setValue(mediaVolume); m_pInputWidget->m_pIpVolumeSlider->blockSignals(false); //当所有å�¯ç”¨çš„输入设备全部移除,å�°å¼�机æ‰�会出现该情况 if (strstr(m_pVolumeControl->defaultSourceName,"monitor")) { m_pInputWidget->m_pInputLevelProgressBar->setValue(0); } //start 无输入设备时需è¦�自动关闭侦å�¬,æ­¤æ“�作è¦�在pa的回调中执行,å�¦åˆ™ä¼šè¯¯å…³é—­ if (m_pVolumeControl->sourcePortName =="") { m_pSoundSettings->set(LOOP_BACK,false); } //end initInputComboboxItem(); themeChangeIcons(); }); //音频设备管控窗å�£ connect(m_pSettingsWidget->m_pDevControlDetailsBtn, &QPushButton::clicked, this, [=](){ UkmediaDevControlWidget *m_pDevControlWidget = new UkmediaDevControlWidget(this); m_pDevControlWidget->setFixedSize(SETTINGSWIDGET_WIDTH, SETTINGSWIDGET_HEIGHT); m_pDevControlWidget->setAttribute(Qt::WA_DeleteOnClose); m_pDevControlWidget->setWindowModality(Qt::WindowModality::WindowModal); m_pDevControlWidget->show(); }); // 应用声音管控窗å�£ connect(m_pSettingsWidget->m_pAppSoundDetailsBtn, &QPushButton::clicked, this, [=](){ UkmediaAppCtrlWidget *appCtrlWidget = new UkmediaAppCtrlWidget(this); appCtrlWidget->setFixedSize(SETTINGSWIDGET_WIDTH, SETTINGSWIDGET_HEIGHT); appCtrlWidget->setAttribute(Qt::WA_DeleteOnClose); appCtrlWidget->setWindowModality(Qt::WindowModality::WindowModal); appCtrlWidget->show(); }); } /* * åˆ�始化滑动æ�¡çš„值 */ void UkmediaMainWidget::initVoulmeSlider() { int sinkVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); int sourceVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSourceVolume()); float balanceVolume = m_pVolumeControl->getBalanceVolume(); m_pOutputWidget->m_pOpVolumePercentLabel->setText(QString::number(sinkVolume) + "%"); m_pInputWidget->m_pIpVolumePercentLabel->setText(QString::number(sourceVolume) + "%"); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(true); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(true); m_pInputWidget->m_pIpVolumeSlider->blockSignals(true); handleBalanceSlider(balanceVolume); m_pOutputWidget->m_pOpVolumeSlider->setValue(sinkVolume); m_pInputWidget->m_pIpVolumeSlider->setValue(sourceVolume); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(false); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(false); m_pInputWidget->m_pIpVolumeSlider->blockSignals(false); initOutputComboboxItem(); initInputComboboxItem(); themeChangeIcons(); this->update(); } void UkmediaMainWidget::handleBalanceSlider(float balanceVolume) { bool status; if (m_pSoundSettings->keys().contains("monoAudio")) { status = m_pSoundSettings->get(MONO_AUDIO).toBool(); m_pOutputWidget->m_pMonoAudioButton->blockSignals(true); m_pOutputWidget->m_pMonoAudioButton->setChecked(status); m_pOutputWidget->m_pMonoAudioButton->blockSignals(false); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (m_pVolumeControl->outputPortMap.count() == 0) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { if (status) { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(0); //setAllSinkMono(); #bug232332 m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(balanceVolume*100); } } #elif 0 if (status) { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(0); //setAllSinkMono(); #bug232332 m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(balanceVolume*100); } #endif } } void UkmediaMainWidget::themeChangeIcons() { int nOutputValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); int nInputValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSourceVolume()); bool outputStatus = m_pVolumeControl->getSinkMute(); bool inputStatus = m_pVolumeControl->getSourceMute(); inputVolumeDarkThemeImage(nInputValue,inputStatus); outputVolumeDarkThemeImage(nOutputValue,outputStatus); } /* * åˆ�始化combobox的值 */ #if 0 void UkmediaMainWidget::comboboxCurrentTextInit() { QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); QString filenameStr = settings->get(FILENAME_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); int index = 0; for (int i=0;icount();i++) { QString str = m_pSoundList->at(i); if (str.contains(filenameStr,Qt::CaseSensitive)) { index = i; break; } } if (nameStr == "alert-sound") { QString displayName = m_pSoundNameList->at(index); m_pSoundWidget->m_pAlertSoundCombobox->setCurrentText(displayName); continue; } if (nameStr == "window-close") { QString displayName = m_pSoundNameList->at(index); continue; } else if (nameStr == "volume-changed") { QString displayName = m_pSoundNameList->at(index); m_pSoundWidget->m_pVolumeChangeCombobox->setCurrentText(displayName); continue; } else if (nameStr == "system-setting") { QString displayName = m_pSoundNameList->at(index); continue; } } else { continue; } } } #endif /* * 是å�¦æ’­æ”¾å¼€æœºéŸ³ä¹� */ void UkmediaMainWidget::startupButtonSwitchChangedSlot(bool status) { // if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ // if (m_pSoundSettings->keys().contains("startupMusic")) { // m_pSoundSettings->set(STARTUP_MUSIC,status); // } // } bool bBootStatus = true; if (m_pBootSetting->keys().contains("startupMusic")) { bBootStatus = m_pBootSetting->get(UKUI_STARTUP_MUSIC_KEY).toBool(); if (bBootStatus != status) { m_pBootSetting->set(UKUI_STARTUP_MUSIC_KEY,status); } } m_pSoundWidget->m_pStartupButton->setObjectName("m_pSoundWidget->m_pStartupButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pStartupButton->objectName(), QString("settings"),status?"true":"false"); if (status) { playAlretSoundFromPath(this, SOUND_FILE_STARTUP_PATH); } } /* * 是å�¦æ’­æ”¾å…³æœºéŸ³ä¹� */ void UkmediaMainWidget::poweroffButtonSwitchChangedSlot(bool status) { bool bBootStatus = true; if (m_pBootSetting->keys().contains("poweroffMusic")) { bBootStatus = m_pBootSetting->get(UKUI_POWEROFF_MUSIC_KEY).toBool(); if (bBootStatus != status) { m_pBootSetting->set(UKUI_POWEROFF_MUSIC_KEY,status); } } m_pSoundWidget->m_pPoweroffButton->setObjectName("m_pSoundWidget->m_pPoweroffButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pPoweroffButton->objectName(), QString("settings"),status?"true":"false"); if (status) { playAlretSoundFromPath(this, SOUND_FILE_SHUTDOWN_PATH); } } /* * 是å�¦æ’­æ”¾æ³¨é”€éŸ³ä¹� */ void UkmediaMainWidget::logoutMusicButtonSwitchChangedSlot(bool status) { bool bBootStatus = true; if (m_pBootSetting->keys().contains("logoutMusic")) { bBootStatus = m_pBootSetting->get(UKUI_LOGOUT_MUSIC_KEY).toBool(); if (bBootStatus != status) { m_pBootSetting->set(UKUI_LOGOUT_MUSIC_KEY,status); } } m_pSoundWidget->m_pLogoutButton->setObjectName("m_pSoundWidget->m_pLogoutButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pLogoutButton->objectName(), QString("settings"),status?"true":"false"); if (status) { playAlretSoundFromPath(this, SOUND_FILE_LOGOUT_PATH); } } /* * 是å�¦æ’­æ”¾å”¤é†’音ä¹� */ void UkmediaMainWidget::wakeButtonSwitchChangedSlot(bool status) { bool bBootStatus = true; if (m_pBootSetting->keys().contains("weakupMusic")) { bBootStatus = m_pBootSetting->get(UKUI_WAKEUP_MUSIC_KEY).toBool(); if (bBootStatus != status) { m_pBootSetting->set(UKUI_WAKEUP_MUSIC_KEY,status); } } m_pSoundWidget->m_pWakeupMusicButton->setObjectName("m_pSoundWidget->m_pWakeupMusicButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pWakeupMusicButton->objectName(), QString("settings"),status?"true":"false"); if (status) { playAlretSoundFromPath(this, SOUND_FILE_WEAKUP_PATH); } } /* * æ��示音的开关 */ void UkmediaMainWidget::alertSoundButtonSwitchChangedSlot(bool status) { if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ if (m_pSoundSettings->keys().contains("eventSounds")) { m_pSoundSettings->set(EVENT_SOUNDS_KEY,status); } } m_pSoundWidget->alertSoundWidgetShow(status); m_pSoundWidget->m_pAlertSoundSwitchButton->setObjectName("m_pSoundWidget->m_pAlertSoundSwitchButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pAlertSoundSwitchButton->objectName(), QString("settings"),status?"true":"false"); } /* * å¼€å�¯å�•声é�“,é��历sinkMap,将所有å�Œå£°é�“sink设置为å�•声é�“输出 */ void UkmediaMainWidget::setAllSinkMono() { QMap::iterator it; for(it=m_pVolumeControl->sinkMap.begin(); it!=m_pVolumeControl->sinkMap.end();) { int sinkVolume; if (it.value().volume.channels >= 2) sinkVolume = MAX(it.value().volume.values[0], it.value().volume.values[1]); else sinkVolume = it.value().volume.values[0]; balanceSliderChangedMono(0, sinkVolume, it.key()); ++it; } } void UkmediaMainWidget::monoAudioBtuuonSwitchChangedSlot(bool status) { if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ if (m_pSoundSettings->keys().contains("monoAudio")) { m_pSoundSettings->set(MONO_AUDIO,status); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 if (m_pVolumeControl->outputPortMap.count() == 0) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { if(status){ m_pOutputWidget->m_pOpBalanceSlider->setValue(0); setAllSinkMono(); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else{ float balanceVolume = m_pVolumeControl->getBalanceVolume(); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(balanceVolume*100); } } #elif 0 if (status) { m_pOutputWidget->m_pOpBalanceSlider->setValue(0); setAllSinkMono(); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); } else { float balanceVolume = m_pVolumeControl->getBalanceVolume(); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); m_pOutputWidget->m_pOpBalanceSlider->setValue(balanceVolume*100); } #endif } } m_pOutputWidget->m_pMonoAudioButton->setObjectName("m_pOutputWidget->m_pMonoAudioButton"); ukcc::UkccCommon::buriedSettings("Audio",m_pOutputWidget->m_pMonoAudioButton->objectName(), QString("settings"),status?"true":"false"); } void UkmediaMainWidget::noiseReductionButtonSwitchChangedSlot(bool status) { if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ if (m_pSoundSettings->keys().contains("dnsNoiseReduction")) { m_pSoundSettings->set(DNS_NOISE_REDUCTION,status); } } m_pInputWidget->m_pNoiseReducteButton->setObjectName("m_pInputWidget->m_pNoiseReducteButton"); ukcc::UkccCommon::buriedSettings("Audio",m_pInputWidget->m_pNoiseReducteButton->objectName(), QString("settings"),status?"true":"false"); } void UkmediaMainWidget::loopbackButtonSwitchChangedSlot(bool status) { if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ if (m_pSoundSettings->keys().contains("loopback")) { m_pSoundSettings->set(LOOP_BACK,status); } } m_pInputWidget->m_pLoopBackButton->setObjectName("m_pInputWidget->m_pLoopBackButton"); ukcc::UkccCommon::buriedSettings("Audio",m_pInputWidget->m_pLoopBackButton->objectName(), QString("settings"),status?"true":"false"); } void UkmediaMainWidget::volumeIncreaseBtuuonSwitchChangedSlot(bool status) { // 1. Refresh UI (Tips: UKCC Audio only refresh UI, Volume adjustment is done by ukui-media) m_pOutputWidget->setVolumeSliderRange(status); // 2. Update gsetting value if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA) && m_pSoundSettings->keys().contains("volumeIncrease")) m_pSoundSettings->set(VOLUME_INCREASE, status); // 3. Data burial point m_pOutputWidget->m_pVolumeIncreaseButton->setObjectName("m_pOutputWidget->m_pVolumeIncreaseButton"); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pVolumeIncreaseButton->objectName(), QString("settings"), status ? "true" : "false"); } void UkmediaMainWidget::bootMusicSettingsChanged(const QString &key) { bool bBootStatus = true; if (QGSettings::isSchemaInstalled(UKUI_SWITCH_SETTING)){ if (key == "startupMusic"){ if (m_pBootSetting->keys().contains("startupMusic")) m_pSoundWidget->m_pStartupButton->setChecked(m_pBootSetting->get(UKUI_STARTUP_MUSIC_KEY).toBool()); } else if (key == "poweroffMusic"){ if (m_pBootSetting->keys().contains("poweroffMusic")) m_pSoundWidget->m_pPoweroffButton->setChecked(m_pBootSetting->get(UKUI_POWEROFF_MUSIC_KEY).toBool()); } else if (key == "logoutMusic"){ if (m_pBootSetting->keys().contains("logoutMusic")) m_pSoundWidget->m_pLogoutButton->setChecked(m_pBootSetting->get(UKUI_LOGOUT_MUSIC_KEY).toBool()); } else if (key == "weakupMusic"){ if (m_pBootSetting->keys().contains("weakupMusic")) m_pSoundWidget->m_pWakeupMusicButton->setChecked(m_pBootSetting->get(UKUI_WAKEUP_MUSIC_KEY).toBool()); } } } /* * 系统主题更改 */ void UkmediaMainWidget::ukuiThemeChangedSlot(const QString &themeStr) { if (m_pThemeSetting->keys().contains("styleName")) { mThemeName = m_pThemeSetting->get(UKUI_THEME_NAME).toString(); } int nInputValue = getInputVolume(); int nOutputValue = getOutputVolume(); bool inputStatus = m_pVolumeControl->getSourceMute(); bool outputStatus = m_pVolumeControl->getSinkMute(); inputVolumeDarkThemeImage(nInputValue,inputStatus); outputVolumeDarkThemeImage(nOutputValue,outputStatus); Q_EMIT qApp->paletteChanged(qApp->palette()); this->repaint(); } /* * 获å�–输入音é‡�值 */ int UkmediaMainWidget::getInputVolume() { return m_pInputWidget->m_pIpVolumeSlider->value(); } /* * 获å�–输出音é‡�值 */ int UkmediaMainWidget::getOutputVolume() { return m_pOutputWidget->m_pOpVolumeSlider->value(); } /* * 深色主题时输出音é‡�图标 */ void UkmediaMainWidget::outputVolumeDarkThemeImage(int value,bool status) { QImage image; QColor color = QColor(0,0,0,216); if (mThemeName == UKUI_THEME_LIGHT || mThemeName == UKUI_THEME_DEFAULT) { color = QColor(0,0,0,216); } else if (mThemeName == UKUI_THEME_DARK) { color = QColor(255,255,255,216); } if (status) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value <= 0) { image = QIcon::fromTheme("audio-volume-muted-symbolic").pixmap(24,24).toImage(); } else if (value > 0 && value <= 33) { image = QIcon::fromTheme("audio-volume-low-symbolic").pixmap(24,24).toImage(); } else if (value >33 && value <= 66) { image = QIcon::fromTheme("audio-volume-medium-symbolic").pixmap(24,24).toImage(); } else { image = QIcon::fromTheme("audio-volume-high-symbolic").pixmap(24,24).toImage(); } m_pOutputWidget->m_pOutputIconBtn->refreshIcon(image, color); } /* * 输入音é‡�图标 */ void UkmediaMainWidget::inputVolumeDarkThemeImage(int value,bool status) { QImage image; QColor color = QColor(0,0,0,190); if (mThemeName == UKUI_THEME_LIGHT || mThemeName == UKUI_THEME_DEFAULT) { color = QColor(0,0,0,190); } else if (mThemeName == UKUI_THEME_DARK) { color = QColor(255,255,255,190); } if (status) { image = QIcon::fromTheme("microphone-sensitivity-muted-symbolic").pixmap(24,24).toImage(); } else if (value <= 0) { image = QIcon::fromTheme("microphone-sensitivity-muted-symbolic").pixmap(24,24).toImage(); } else if (value > 0 && value <= 33) { image = QIcon::fromTheme("microphone-sensitivity-low-symbolic").pixmap(24,24).toImage(); } else if (value >33 && value <= 66) { image = QIcon::fromTheme("microphone-sensitivity-medium-symbolic").pixmap(24,24).toImage(); } else { image = QIcon::fromTheme("microphone-sensitivity-high-symbolic").pixmap(24,24).toImage(); } m_pInputWidget->m_pInputIconBtn->refreshIcon(image, color); } //void UkmediaMainWidget::onKeyChanged (GSettings *settings,gchar *key,UkmediaMainWidget *m_pWidget) void UkmediaMainWidget::onKeyChanged (const QString &key) { // Q_UNUSED(settings); qDebug() << "onKeyChanged" <get(GLOBAL_THEME_NAME).toString(); if (globalTheme != "custom") { int index = m_pSoundWidget->m_pSoundThemeCombobox->findData(globalTheme); m_pSoundWidget->m_pSoundThemeCombobox->setCurrentIndex(index); } } } /* * 更新主题 */ void UkmediaMainWidget::updateTheme (UkmediaMainWidget *m_pWidget) { g_debug("update theme"); // char *pThemeName; QString pThemeName; gboolean feedBackEnabled; gboolean eventsEnabled; if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ if (m_pWidget->m_pSoundSettings->keys().contains("eventSounds")) { eventsEnabled = m_pWidget->m_pSoundSettings->get(EVENT_SOUNDS_KEY).toBool(); } if (eventsEnabled) { if (m_pWidget->m_pSoundSettings->keys().contains("themeName")) { pThemeName = m_pWidget->m_pSoundSettings->get(SOUND_THEME_KEY).toString(); } } else { pThemeName = g_strdup (NO_SOUNDS_THEME_NAME); } } qDebug() << "updateTheme" << pThemeName; //设置combox的主题 setComboxForThemeName (m_pWidget, pThemeName.toLatin1().data()); updateAlertsFromThemeName (m_pWidget, pThemeName.toLatin1().data()); } /* * 设置主题å��到combox */ void UkmediaMainWidget::setupThemeSelector (UkmediaMainWidget *m_pWidget) { g_debug("setup theme selector"); GHashTable *hash; const char * const *dataDirs; const char *m_pDataDir; char *dir; guint i; /* Add the theme names and their display name to a hash table, * makes it easy to avoid duplicate themes */ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); dataDirs = g_get_system_data_dirs (); for (i = 0; dataDirs[i] != nullptr; i++) { dir = g_build_filename (dataDirs[i], "sounds", nullptr); soundThemeInDir (m_pWidget,hash, dir); } m_pDataDir = g_get_user_data_dir (); dir = g_build_filename (m_pDataDir, "sounds", nullptr); soundThemeInDir (m_pWidget,hash, dir); /* If there isn't at least one theme, make everything * insensitive, LAME! */ if (g_hash_table_size (hash) == 0) { g_warning ("Bad setup, install the freedesktop sound theme"); g_hash_table_destroy (hash); return; } /* Add the themes to a combobox */ g_hash_table_destroy (hash); } /* * 主题å��所在目录 */ void UkmediaMainWidget::soundThemeInDir (UkmediaMainWidget *m_pWidget,GHashTable *hash,const char *dir) { Q_UNUSED(hash); qDebug() << "sound theme in dir" << dir; GDir *d; const char *m_pName; d = g_dir_open (dir, 0, nullptr); if (d == nullptr) { return; } while ((m_pName = g_dir_read_name (d)) != nullptr) { char *m_pDirName, *m_pIndex, *m_pIndexName; /* Look for directories */ m_pDirName = g_build_filename (dir, m_pName, nullptr); if (g_file_test (m_pDirName, G_FILE_TEST_IS_DIR) == FALSE) { continue; } /* Look for index files */ m_pIndex = g_build_filename (m_pDirName, "index.theme", nullptr); /* Check the name of the theme in the index.theme file */ m_pIndexName = loadIndexThemeName (m_pIndex, nullptr); if (m_pIndexName == nullptr) { continue; } if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ QString themeName; if (m_pWidget->m_pSoundSettings->keys().contains("themeName")) { themeName = m_pWidget->m_pSoundSettings->get(SOUND_THEME_KEY).toString(); } qDebug() << "sound theme in dir" << "displayname:" << m_pIndexName << "theme name:" << m_pName << "theme:"<< themeName; if (m_pName && !strstr(m_pName,"ubuntu") && !strstr(m_pName,"freedesktop") && !strstr(m_pName,"custom")) { m_pWidget->m_pThemeNameList.append(m_pName); m_pWidget->m_pSoundWidget->m_pSoundThemeCombobox->addItem(m_pIndexName,m_pName); } } } g_dir_close (d); m_pWidget->m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pSoundThemeCombobox->addItem(tr("Custom"), "custom"); m_pWidget->m_pSoundWidget->m_pSoundThemeCombobox->blockSignals(false); } /* * 加载下标的主题å�� */ char *UkmediaMainWidget::loadIndexThemeName (const char *index,char **parent) { g_debug("load index theme name"); GKeyFile *file; char *indexname = nullptr; gboolean hidden; file = g_key_file_new (); if (g_key_file_load_from_file (file, index, G_KEY_FILE_KEEP_TRANSLATIONS, nullptr) == FALSE) { g_key_file_free (file); return nullptr; } /* Don't add hidden themes to the list */ hidden = g_key_file_get_boolean (file, "Sound Theme", "Hidden", nullptr); if (!hidden) { indexname = g_key_file_get_locale_string (file,"Sound Theme","Name",nullptr,nullptr); /* Save the parent theme, if there's one */ if (parent != nullptr) { *parent = g_key_file_get_string (file,"Sound Theme","Inherits",nullptr); } } g_key_file_free (file); return indexname; } /* * 设置combox的主题å�� */ void UkmediaMainWidget::setComboxForThemeName (UkmediaMainWidget *m_pWidget,const char *name) { g_debug("set combox for theme name"); gboolean found; int count = 0; /* If the name is empty, use "freedesktop" */ if (name == nullptr || *name == '\0') { name = "freedesktop"; } QString value; int index = -1; while(!found) { value = m_pWidget->m_pThemeNameList.at(count); found = (value != "" && value == name); count++; if( count >= m_pWidget->m_pThemeNameList.size() || found) { count = 0; break; } } if (m_pWidget->m_pThemeNameList.contains(name)) { index = m_pWidget->m_pThemeNameList.indexOf(name); value = m_pWidget->m_pThemeNameList.at(index); m_pWidget->m_pSoundWidget->m_pSoundThemeCombobox->setCurrentIndex(index); } /* When we can't find the theme we need to set, try to set the default * one "freedesktop" */ if (found) { } else if (strcmp (name, "freedesktop") != 0) {//设置为默认的主题 qDebug() << "设置为默认的主题" << "freedesktop"; g_debug ("not found, falling back to fdo"); setComboxForThemeName (m_pWidget, "freedesktop"); } } /* * 更新报警音 */ void UkmediaMainWidget::updateAlertsFromThemeName (UkmediaMainWidget *m_pWidget,const gchar *m_pName) { g_debug("update alerts from theme name"); if (strcmp (m_pName, CUSTOM_THEME_NAME) != 0) { /* reset alert to default */ updateAlert (m_pWidget, DEFAULT_ALERT_ID); } else { int sound_type; char *linkname; linkname = nullptr; sound_type = getFileType ("bell-terminal", &linkname); g_debug ("Found link: %s", linkname); if (sound_type == SOUND_TYPE_CUSTOM) { updateAlert (m_pWidget, linkname); } } } /* 更新报警声音 */ void UkmediaMainWidget::updateAlert (UkmediaMainWidget *pWidget,const char *alertId) { Q_UNUSED(alertId) g_debug("update alert"); QString themeStr; char *theme; char *parent; gboolean is_custom; gboolean is_default; gboolean add_custom = false; gboolean remove_custom = false; QString nameStr; int index = -1; /* Get the current theme's name, and set the parent */ index = pWidget->m_pSoundWidget->m_pSoundThemeCombobox->currentIndex(); if (index != -1 && pWidget->m_pThemeNameList.count() > 0) { themeStr = pWidget->m_pThemeNameList.at(index); nameStr = pWidget->m_pThemeNameList.at(index); } else { themeStr = "freedesktop"; nameStr = "freedesktop"; } QByteArray ba = themeStr.toLatin1(); theme = ba.data(); QByteArray baParent = nameStr.toLatin1(); parent = baParent.data(); is_custom = strcmp (theme, CUSTOM_THEME_NAME) == 0; is_default = strcmp (alertId, DEFAULT_ALERT_ID) == 0; if (! is_custom && is_default) { /* remove custom just in case */ remove_custom = TRUE; } else if (! is_custom && ! is_default) { createCustomTheme (parent); saveAlertSounds(pWidget->m_pSoundWidget->m_pSoundThemeCombobox, alertId); add_custom = TRUE; } else if (is_custom && is_default) { saveAlertSounds(pWidget->m_pSoundWidget->m_pSoundThemeCombobox, alertId); /* after removing files check if it is empty */ if (customThemeDirIsEmpty ()) { remove_custom = TRUE; } } else if (is_custom && ! is_default) { saveAlertSounds(pWidget->m_pSoundWidget->m_pSoundThemeCombobox, alertId); } if (add_custom) { setComboxForThemeName (pWidget, CUSTOM_THEME_NAME); } else if (remove_custom) { setComboxForThemeName (pWidget, parent); } } /* 获å�–声音文件类型 */ int UkmediaMainWidget::getFileType (const char *sound_name,char **linked_name) { g_debug("get file type"); char *name, *filename; *linked_name = nullptr; name = g_strdup_printf ("%s.disabled", sound_name); filename = customThemeDirPath (name); if (g_file_test (filename, G_FILE_TEST_IS_REGULAR) != FALSE) { return SOUND_TYPE_OFF; } /* We only check for .ogg files because those are the * only ones we create */ name = g_strdup_printf ("%s.ogg", sound_name); filename = customThemeDirPath (name); g_free (name); if (g_file_test (filename, G_FILE_TEST_IS_SYMLINK) != FALSE) { *linked_name = g_file_read_link (filename, nullptr); g_free (filename); return SOUND_TYPE_CUSTOM; } g_free (filename); return SOUND_TYPE_BUILTIN; } /* 自定义主题路径 */ char *UkmediaMainWidget::customThemeDirPath (const char *child) { g_debug("custom theme dir path"); static char *dir = nullptr; const char *data_dir; if (dir == nullptr) { data_dir = g_get_user_data_dir (); dir = g_build_filename (data_dir, "sounds", CUSTOM_THEME_NAME, nullptr); } if (child == nullptr) return g_strdup (dir); return g_build_filename (dir, child, nullptr); } /* 获å�–报警声音文件的路径 */ #if 0 void UkmediaMainWidget::populateModelFromDir (UkmediaMainWidget *m_pWidget,const char *dirname)//从目录查找报警声音文件 { g_debug("populate model from dir"); GDir *d; const char *name; char *path; d = g_dir_open (dirname, 0, nullptr); if (d == nullptr) { return; } while ((name = g_dir_read_name (d)) != nullptr) { if (! g_str_has_suffix (name, ".xml")) { continue; } QString themeName = name; QStringList temp = themeName.split("-"); themeName = temp.at(0); if (!m_pWidget->m_soundThemeList.contains(themeName)) { m_pWidget->m_soundThemeList.append(themeName); m_pWidget->m_soundThemeDirList.append(dirname); m_pWidget->m_soundThemeXmlNameList.append(name); } path = g_build_filename (dirname, name, nullptr); } if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ QString pThemeName; if (m_pWidget->m_pSoundSettings->keys().contains("themeName")) { pThemeName = m_pWidget->m_pSoundSettings->get(SOUND_THEME_KEY).toString(); } int themeIndex; if(m_pWidget->m_soundThemeList.contains(pThemeName)) { themeIndex = m_pWidget->m_soundThemeList.indexOf(pThemeName); if (themeIndex < 0 ) return; } else { themeIndex = 1; } themeIndex=0; QString dirName = m_pWidget->m_soundThemeDirList.at(themeIndex); QString xmlName = m_pWidget->m_soundThemeXmlNameList.at(themeIndex); path = g_build_filename (dirName.toLatin1().data(), xmlName.toLatin1().data(), nullptr); m_pWidget->m_pSoundWidget->m_pAlertSoundCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pAlertSoundCombobox->clear(); m_pWidget->m_pSoundWidget->m_pAlertSoundCombobox->blockSignals(false); } populateModelFromFile (m_pWidget, path); //åˆ�始化声音主题 g_free (path); g_dir_close (d); } /* 获å�–报警声音文件 */ void UkmediaMainWidget::populateModelFromFile (UkmediaMainWidget *m_pWidget,const char *filename) { g_debug("populate model from file"); xmlDocPtr doc; xmlNodePtr root; xmlNodePtr child; gboolean exists; qDebug() << "populateModelFromFile" <children; child; child = child->next) { if (xmlNodeIsText (child)) { continue; } if (xmlStrcmp (child->name, GVC_SOUND_SOUND) != 0) { continue; } populateModelFromNode (m_pWidget, child); } xmlFreeDoc (doc); } /* 从节点查找声音文件并加载到组å�ˆæ¡†ä¸­ */ void UkmediaMainWidget::populateModelFromNode (UkmediaMainWidget *m_pWidget,xmlNodePtr node) { g_debug("populate model from node"); xmlNodePtr child; xmlChar *filename; xmlChar *name; filename = nullptr; name = xmlGetAndTrimNames (node); for (child = node->children; child; child = child->next) { if (xmlNodeIsText (child)) { continue; } if (xmlStrcmp (child->name, GVC_SOUND_FILENAME) == 0) { filename = xmlNodeGetContent (child); } else if (xmlStrcmp (child->name, GVC_SOUND_NAME) == 0) { /* EH? should have been trimmed */ } } //将找到的声音文件å��设置到combox中 if (filename != nullptr && name != nullptr) { m_pWidget->m_pSoundList->append((const char *)filename); m_pWidget->m_pSoundNameList->append((const char *)name); m_pWidget->m_pSoundWidget->m_pAlertSoundCombobox->addItem((char *)name); m_pWidget->m_pSoundWidget->m_pLagoutCombobox->addItem((char *)name); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->addItem((char *)name); } xmlFree (filename); xmlFree (name); } #endif /***************************************************************** * 函数å��称: populateModelFromDir * 功能æ��述: 从目录中查找系统音效文件 * å�‚数说明: dirname: 目录路径 ******************************************************************/ void UkmediaMainWidget::populateModelFromDir (UkmediaMainWidget *m_pWidget,const char *dirname) { GDir *dir = nullptr; const char *name; char *path; dir = g_dir_open(dirname, 0, nullptr); if (nullptr == dir) { qDebug() << "populateModelFromDir dir is null !"; return; } while ((name = g_dir_read_name(dir)) != nullptr) { if (!g_str_has_suffix (name, ".xml")) continue; QString themeName = name; QStringList temp = themeName.split("."); themeName = temp.at(0); if (!m_pWidget->m_soundThemeList.contains(themeName)) { m_pWidget->m_soundThemeList.append(themeName); m_pWidget->m_soundThemeDirList.append(dirname); m_pWidget->m_soundThemeXmlNameList.append(name); } path = g_build_filename (dirname, name, nullptr); } //åˆ�始化声音主题 populateModelFromFile (m_pWidget, path); g_free (path); g_dir_close (dir); } /***************************************************************** * 函数å��称: populateModelFromFile * 功能æ��述: æ ¹æ�®å¯¹åº”主题的xml文件获å�–音效文件 * å�‚数说明: filename: 音效主题目录下对应主题xml文件路径 ******************************************************************/ void UkmediaMainWidget::populateModelFromFile (UkmediaMainWidget *m_pWidget,const char *filename) { xmlDocPtr doc; xmlNodePtr root; xmlNodePtr child; if (! g_file_test(filename, G_FILE_TEST_EXISTS)) { qDebug() << "populateModelFromFile filename is not exist !"; return; } doc = xmlParseFile(filename); //载入xml文件 if (nullptr == doc) { qDebug() << "populateModelFromFile xmlParseFile xml failed !"; return; } root = xmlDocGetRootElement(doc); //获得根节点 for (child = root->children; child; child = child->next) { if (xmlNodeIsText(child)) { continue; } if (xmlStrcmp (child->name, GVC_SOUND_SOUND) != 0) { continue; } populateModelFromNode (m_pWidget, child); } xmlFreeDoc (doc); } /***************************************************************** * 函数å��称: populateModelFromNode * 功能æ��述: 从节点查找声音文件并加载到组å�ˆæ¡†ä¸­ * å�‚数说明: node ******************************************************************/ void UkmediaMainWidget::populateModelFromNode (UkmediaMainWidget *m_pWidget,xmlNodePtr node) { xmlNodePtr child; xmlChar *name = nullptr; xmlChar *filename = nullptr; name = xmlGetAndTrimNames (node); for (child = node->children; child; child = child->next) { if (xmlNodeIsText (child)) { continue; } if (xmlStrcmp (child->name, GVC_SOUND_FILENAME) == 0) { filename = xmlNodeGetContent (child); } else if (xmlStrcmp (child->name, GVC_SOUND_NAME) == 0) { /* EH? should have been trimmed */ } } // 先添加无自定义音效选项 if (m_pWidget->m_pSoundNameList.isEmpty() && m_pWidget->m_pSoundList.isEmpty()) { m_pWidget->m_pSoundList.append(""); m_pWidget->m_pSoundNameList.append(tr("None")); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->addItem(tr("None"), ""); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(false); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->addItem(tr("None"), ""); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->blockSignals(false); } // 将找到的声音文件å��设置到combox中 if (filename != nullptr && name != nullptr) { m_pWidget->m_pSoundNameList.append((const char *)name); m_pWidget->m_pSoundList.append((const char *)filename); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->addItem(QString::fromUtf8(name), QString::fromUtf8(filename)); m_pWidget->m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(false); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->blockSignals(true); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->addItem(QString::fromUtf8(name), QString::fromUtf8(filename)); m_pWidget->m_pSoundWidget->m_pNotificationCombobox->blockSignals(false); } xmlFree (filename); xmlFree (name); } /* Adapted from yelp-toc-pager.c */ xmlChar *UkmediaMainWidget::xmlGetAndTrimNames (xmlNodePtr node) { g_debug("xml get and trim names"); xmlNodePtr cur; xmlChar *keep_lang = nullptr; xmlChar *value; int j, keep_pri = INT_MAX; const gchar * const * langs = g_get_language_names (); value = nullptr; for (cur = node->children; cur; cur = cur->next) { if (! xmlStrcmp (cur->name, GVC_SOUND_NAME)) { xmlChar *cur_lang = nullptr; int cur_pri = INT_MAX; cur_lang = xmlNodeGetLang (cur); if (cur_lang) { for (j = 0; langs[j]; j++) { if (g_str_equal (cur_lang, langs[j])) { cur_pri = j; break; } } } else { cur_pri = INT_MAX - 1; } if (cur_pri <= keep_pri) { if (keep_lang) xmlFree (keep_lang); if (value) xmlFree (value); value = xmlNodeGetContent (cur); keep_lang = cur_lang; keep_pri = cur_pri; } else { if (cur_lang) xmlFree (cur_lang); } } } /* Delete all GVC_SOUND_NAME nodes */ cur = node->children; while (cur) { xmlNodePtr p_this = cur; cur = cur->next; if (! xmlStrcmp (p_this->name, GVC_SOUND_NAME)) { xmlUnlinkNode (p_this); xmlFreeNode (p_this); } } return value; } /* 点击combox播放声音 */ #if 0 void UkmediaMainWidget::comboxIndexChangedSlot(int index) { g_debug("combox index changed slot"); QString sound_name = m_pSoundList->at(index); updateAlert(this,sound_name.toLatin1().data()); playAlretSoundFromPath(this,sound_name); QString fileName = m_pSoundList->at(index); QStringList list = fileName.split("/"); QString soundName = list.at(list.count()-1); QStringList eventIdList = soundName.split("."); QString eventId = eventIdList.at(0); QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); // QString filenameStr = settings->get(FILENAME_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); if (nameStr == "alert-sound") { settings->set(FILENAME_KEY,eventId); return; } } else { continue; } } } /* 设置窗å�£å…³é—­çš„æ��示音 */ void UkmediaMainWidget::windowClosedComboboxChangedSlot(int index) { QString fileName = m_pSoundList->at(index); QStringList list = fileName.split("/"); QString soundName = list.at(list.count()-1); QStringList eventIdList = soundName.split("."); QString eventId = eventIdList.at(0); QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); // QString filenameStr = settings->get(FILENAME_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); if (nameStr == "window-close") { settings->set(FILENAME_KEY,eventId); return; } } else { continue; } } } /* 设置音é‡�改å�˜çš„æ��示声音 */ void UkmediaMainWidget::volumeChangedComboboxChangeSlot(int index) { QString sound_name = m_pSoundList->at(index); // updateAlert(this,sound_name.toLatin1().data()); playAlretSoundFromPath(this,sound_name); QString fileName = m_pSoundList->at(index); QStringList list = fileName.split("/"); QString soundName = list.at(list.count()-1); QStringList eventIdList = soundName.split("."); QString eventId = eventIdList.at(0); QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); // QString filenameStr = settings->get(FILENAME_KEY).toString(); QString nameStr = settings->get(NAME_KEY).toString(); if (nameStr == "volume-changed") { settings->set(FILENAME_KEY,eventId); return; } } else { continue; } } } void UkmediaMainWidget::settingMenuComboboxChangedSlot(int index) { QString fileName = m_pSoundList->at(index); QStringList list = fileName.split("/"); QString soundName = list.at(list.count()-1); QStringList eventIdList = soundName.split("."); QString eventId = eventIdList.at(0); QList existsPath = listExistsPath(); for (char * path : existsPath) { char * prepath = QString(KEYBINDINGS_CUSTOM_DIR).toLatin1().data(); char * allpath = strcat(prepath, path); const QByteArray ba(KEYBINDINGS_CUSTOM_SCHEMA); const QByteArray bba(allpath); if(QGSettings::isSchemaInstalled(ba)) { QGSettings * settings = new QGSettings(ba, bba); QString nameStr = settings->get(NAME_KEY).toString(); if (nameStr == "system-setting") { settings->set(FILENAME_KEY,eventId); return; } } else { continue; } } } #endif /* 点击输入音é‡�按钮é�™éŸ³ */ void UkmediaMainWidget::inputMuteButtonSlot() { m_pVolumeControl->setSourceMute(!m_pVolumeControl->sourceMuted); inputVolumeDarkThemeImage(UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->sourceVolume), !m_pVolumeControl->sourceMuted); ukcc::UkccCommon::buriedSettings("Audio", m_pInputWidget->m_pInputIconBtn->objectName(), QString("settings"), !m_pVolumeControl->sourceMuted? "true" : "false"); } /* 点击输出音é‡�按钮é�™éŸ³ */ void UkmediaMainWidget::outputMuteButtonSlot() { m_pVolumeControl->setSinkMute(!m_pVolumeControl->sinkMuted); outputVolumeDarkThemeImage(UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->sinkVolume), !m_pVolumeControl->sinkMuted); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pOutputIconBtn->objectName(), QString("settings"), !m_pVolumeControl->sinkMuted ? "true" : "false"); } /* 点击声音主题实现主题切æ�¢ */ void UkmediaMainWidget::themeComboxIndexChangedSlot(int index) { if (-1 == index || nullptr == m_pGlobalThemeSetting) return; QString theme = m_pSoundWidget->m_pSoundThemeCombobox->currentData().toString(); QString globalTheme = m_pGlobalThemeSetting->get(GLOBAL_THEME_NAME).toString(); // 切æ�¢ä¸»é¢˜æ—¶ï¼Œå°†os全局主题切æ�¢æˆ�自定义 if (theme != globalTheme) m_pGlobalThemeSetting->set(GLOBAL_THEME_NAME, "custom"); // 切æ�¢è‡³è‡ªå®šä¹‰éŸ³æ•ˆæ—¶ï¼Œcustom-themeå¼€å�¯ if (theme == "custom") { m_pSoundSettings->blockSignals(true); m_pSoundSettings->set(SOUND_CUSTOM_THEME_KEY, true); m_pSoundSettings->blockSignals(true); return; } // 设置系统主题,并é‡�置自定义音效为默认音效 m_pSoundSettings->blockSignals(true); m_pSoundSettings->set(SOUND_THEME_KEY, theme); m_pSoundSettings->set(SOUND_CUSTOM_THEME_KEY, false); m_pSoundSettings->blockSignals(false); if (!resetCustomSoundEffects(theme, AUDIO_VOLUME_CHANGE)) { m_pSoundSettings->set(AUDIO_VOLUME_CHANGE, ""); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(true); m_pSoundWidget->m_pVolumeChangeCombobox->setCurrentIndex(0); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(false); qWarning("%s resetCustomSoundEffects failed !", AUDIO_VOLUME_CHANGE); } if (!resetCustomSoundEffects(theme, NOTIFICATION_GENGERAL)) { m_pSoundSettings->set(NOTIFICATION_GENGERAL, ""); m_pSoundWidget->m_pNotificationCombobox->blockSignals(true); m_pSoundWidget->m_pNotificationCombobox->setCurrentIndex(0); m_pSoundWidget->m_pNotificationCombobox->blockSignals(false); qWarning("%s resetCustomSoundEffects failed !", NOTIFICATION_GENGERAL); } m_pOutputWidget->m_pDeviceSelectBox->setObjectName("m_pSoundWidget->m_pSoundThemeCombobox"); ukcc::UkccCommon::buriedSettings("Audio", m_pSoundWidget->m_pSoundThemeCombobox->objectName(),"select",m_pThemeNameList.at(index)); } /* 滚动输出音é‡�滑动æ�¡ */ void UkmediaMainWidget::outputWidgetSliderChangedSlot(int value) { QString percent; percent = QString::number(value); outputVolumeDarkThemeImage(value, false); m_pOutputWidget->m_pOpVolumePercentLabel->setText(percent + "%"); //è“�牙a2dp模å¼�下滑动æ�¡è·³åŠ¨é—®é¢˜ï¼Œä»¥é—´éš”ä¸º10设置音é‡� if (m_pVolumeControl->defaultSinkName.contains("a2dp_sink")) return; int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->getDefaultSinkIndex(); m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex, paVolume); qDebug() << __func__ << value << paVolume; m_pOutputWidget->m_pOpVolumeSlider->setObjectName("m_pOutputWidget->m_pOpVolumeSlider"); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pOpVolumeSlider->objectName(),"slider",QString::number(value)); } void UkmediaMainWidget::outputWidgetSliderChangedSlotInBlue(int value) { if (!m_pVolumeControl->defaultSinkName.contains("a2dp_sink")) { m_pOutputWidget->m_pOpVolumeSlider->isMouseWheel = false; return; } qDebug() << "Special Handling Adjust volume in Bluetooth a2dp mode" << value; int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->getDefaultSinkIndex(); m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex, paVolume); QString percent; percent = QString::number(value); outputVolumeDarkThemeImage(value, false); m_pOutputWidget->m_pOpVolumePercentLabel->setText(percent + "%"); m_pOutputWidget->m_pOpVolumeSlider->setObjectName("m_pOutputWidget->m_pOpVolumeSlider"); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pOpVolumeSlider->objectName(),"slider",QString::number(value)); } void UkmediaMainWidget::timeSliderSlot() { if(mouseReleaseState){ int value = m_pOutputWidget->m_pOpVolumeSlider->value(); QString percent; bool status = false; percent = QString::number(value); int volume = value*65536/100; if (value <= 0) { status = true; percent = QString::number(0); } else { if (firstEnterSystem) { } else { } } firstEnterSystem = false; outputVolumeDarkThemeImage(value,status); percent.append("%"); m_pOutputWidget->m_pOpVolumePercentLabel->setText(percent); mouseReleaseState = false; mousePress = false; timeSlider->stop(); } else{ timeSlider->start(50); } } /* 滚动输入滑动æ�¡ */ void UkmediaMainWidget::inputWidgetSliderChangedSlot(int value) { int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->getDefaultSinkIndex(); m_pVolumeControl->setSourceVolume(m_pVolumeControl->sourceIndex, paVolume); //输入图标修改æˆ�深色主题 inputVolumeDarkThemeImage(value, m_pVolumeControl->sourceMuted); m_pInputWidget->m_pInputIconBtn->repaint(); QString percent = QString::number(value); percent.append("%"); m_pInputWidget->m_pIpVolumePercentLabel->setText(percent); qDebug() << __func__ << value << paVolume; ukcc::UkccCommon::buriedSettings("Audio", m_pInputWidget->m_pIpVolumeSlider->objectName(), "slider", QString::number(value)); } /* * å¼€å�¯å�•声é�“ */ void UkmediaMainWidget::balanceSliderChangedMono(int balanceSliderValue, int sinkVolume, int sinkIndex) { gdouble balanceVolume = balanceSliderValue/100.0; m_pVolumeControl->setBalanceVolume(sinkIndex, sinkVolume, balanceVolume); m_pOutputWidget->m_pOpBalanceSlider->setObjectName("m_pOutputWidget->m_pOpBalanceSlider"); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pOpBalanceSlider->objectName(),"slider",QString::number(balanceVolume)); } /* * 平衡值改å�˜ */ void UkmediaMainWidget::balanceSliderChangedSlot(int balanceSliderValue) { gdouble balanceVolume = balanceSliderValue/100.0; int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(m_pOutputWidget->m_pOpVolumeSlider->value()); m_pVolumeControl->setBalanceVolume(m_pVolumeControl->sinkIndex, paVolume, balanceVolume); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pOpBalanceSlider->objectName(), "slider", QString::number(balanceVolume)); } /* * 输入等级 */ void UkmediaMainWidget::peakVolumeChangedSlot(double v) { if (v >= 0) { m_pInputWidget->m_pInputLevelProgressBar->setEnabled(true); //因为有些电脑MIC增益太大会引起å��馈æ�¡æ¶ˆå¤±å…ˆæš‚时固定最大值为101 //int value = qRound(v * m_pInputWidget->m_pInputLevelProgressBar->maximum()); int value = qRound(v * 100); m_pInputWidget->m_pInputLevelProgressBar->setValue(value); } else { m_pInputWidget->m_pInputLevelProgressBar->setEnabled(false); m_pInputWidget->m_pInputLevelProgressBar->setValue(0); } } gboolean UkmediaMainWidget::saveAlertSounds (QComboBox *combox,const char *id) { const char *sounds[3] = { "bell-terminal", "bell-window-system", NULL }; char *path; if (strcmp (id, DEFAULT_ALERT_ID) == 0) { deleteOldFiles (sounds); deleteDisabledFiles (sounds); } else { deleteOldFiles (sounds); deleteDisabledFiles (sounds); addCustomFile (sounds, id); } /* And poke the directory so the theme gets updated */ path = customThemeDirPath(NULL); if (utime (path, NULL) != 0) { g_warning ("Failed to update mtime for directory '%s': %s", path, g_strerror (errno)); } g_free (path); return FALSE; } void UkmediaMainWidget::deleteOldFiles (const char **sounds) { guint i; for (i = 0; sounds[i] != NULL; i++) { deleteOneFile (sounds[i], "%s.ogg"); } } void UkmediaMainWidget::deleteOneFile (const char *sound_name, const char *pattern) { GFile *file; char *name, *filename; name = g_strdup_printf (pattern, sound_name); filename = customThemeDirPath(name); g_free (name); file = g_file_new_for_path (filename); g_free (filename); cappletFileDeleteRecursive (file, NULL); g_object_unref (file); } void UkmediaMainWidget::deleteDisabledFiles (const char **sounds) { guint i; for (i = 0; sounds[i] != NULL; i++) { deleteOneFile (sounds[i], "%s.disabled"); } } void UkmediaMainWidget::addCustomFile (const char **sounds, const char *filename) { guint i; for (i = 0; sounds[i] != NULL; i++) { GFile *file; char *name, *path; /* We use *.ogg because it's the first type of file that * libcanberra looks at */ name = g_strdup_printf ("%s.ogg", sounds[i]); path = customThemeDirPath(name); g_free (name); /* In case there's already a link there, delete it */ g_unlink (path); file = g_file_new_for_path (path); g_free (path); /* Create the link */ g_file_make_symbolic_link (file, filename, NULL, NULL); g_object_unref (file); } } /** * A utility routine to delete files and/or directories, * including non-empty directories. **/ gboolean UkmediaMainWidget::cappletFileDeleteRecursive (GFile *file, GError **error) { GFileInfo *info; GFileType type; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, error); if (info == NULL) { return FALSE; } type = g_file_info_get_file_type (info); g_object_unref (info); if (type == G_FILE_TYPE_DIRECTORY) { return directoryDeleteRecursive (file, error); } else { return g_file_delete (file, NULL, error); } } gboolean UkmediaMainWidget::directoryDeleteRecursive (GFile *directory, GError **error) { GFileEnumerator *enumerator; GFileInfo *info; gboolean success = TRUE; enumerator = g_file_enumerate_children (directory, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, error); if (enumerator == NULL) return FALSE; while (success && (info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { GFile *child; child = g_file_get_child (directory, g_file_info_get_name (info)); if (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY) { success = directoryDeleteRecursive (child, error); } g_object_unref (info); if (success) success = g_file_delete (child, NULL, error); } g_file_enumerator_close (enumerator, NULL, NULL); if (success) success = g_file_delete (directory, NULL, error); return success; } void UkmediaMainWidget::createCustomTheme (const char *parent) { GKeyFile *keyfile; char *data; char *path; /* Create the custom directory */ path = customThemeDirPath(NULL); g_mkdir_with_parents (path, 0755); g_free (path); /* Set the data for index.theme */ keyfile = g_key_file_new (); g_key_file_set_string (keyfile, "Sound Theme", "Name", _("Custom")); g_key_file_set_string (keyfile, "Sound Theme", "Inherits", parent); g_key_file_set_string (keyfile, "Sound Theme", "Directories", "."); data = g_key_file_to_data (keyfile, NULL, NULL); g_key_file_free (keyfile); /* Save the index.theme */ path = customThemeDirPath ("index.theme"); g_file_set_contents (path, data, -1, NULL); g_free (path); g_free (data); customThemeUpdateTime (); } /* This function needs to be called after each individual * changeset to the theme */ void UkmediaMainWidget::customThemeUpdateTime (void) { char *path; path = customThemeDirPath (NULL); utime (path, NULL); g_free (path); } gboolean UkmediaMainWidget::customThemeDirIsEmpty (void) { char *dir; GFile *file; gboolean is_empty; GFileEnumerator *enumerator; GFileInfo *info; GError *error = NULL; dir = customThemeDirPath(NULL); file = g_file_new_for_path (dir); g_free (dir); is_empty = TRUE; enumerator = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NONE, NULL, &error); if (enumerator == NULL) { g_warning ("Unable to enumerate files: %s", error->message); g_error_free (error); goto out; } while (is_empty && (info = g_file_enumerator_next_file (enumerator, NULL, NULL))) { if (strcmp ("index.theme", g_file_info_get_name (info)) != 0) { is_empty = FALSE; } g_object_unref (info); } g_file_enumerator_close (enumerator, NULL, NULL); out: g_object_unref (file); return is_empty; } int UkmediaMainWidget::caPlayForWidget(UkmediaMainWidget *w, uint32_t id, ...) { va_list ap; int ret; ca_proplist *p; if ((ret = ca_proplist_create(&p)) < 0) { qDebug() << "ca_proplist_create ret:" << ret; return ret; } if ((ret = caProplistSetForWidget(p, w)) < 0) { qDebug() << "caProplistSetForWidget ret:" << ret; return -1; } va_start(ap, id); ret = caProplistMergeAp(p, ap); va_end(ap); if (ret < 0) { qDebug() << "caProplistMergeAp ret:" << ret; return -1; } if (nullptr != m_caContext) { ca_context_cancel(m_caContext, 0); ca_context_destroy(m_caContext); } ca_context_create(&m_caContext); ret = ca_context_play_full(m_caContext, id, p, NULL, NULL); qDebug() << "ca_context_play_full ret:" << ret; return ret; } int UkmediaMainWidget::caProplistMergeAp(ca_proplist *p, va_list ap) { int ret; for (;;) { const char *key, *value; if (!(key = va_arg(ap, const char*))) break; if (!(value = va_arg(ap, const char*))) return CA_ERROR_INVALID; if ((ret = ca_proplist_sets(p, key, value)) < 0) return ret; } return CA_SUCCESS; } int UkmediaMainWidget::caProplistSetForWidget(ca_proplist *p, UkmediaMainWidget *widget) { int ret; const char *t; QScreen *screen; gint x = -1; gint y = -1; gint width = -1; gint height = -1; gint screen_width = -1; gint screen_height = -1; if ((t = widget->windowTitle().toLatin1().data())) if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_NAME, t)) < 0) return ret; if (t) if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_ID, t)) < 0) return ret; if ((t = widget->windowIconText().toLatin1().data())) if ((ret = ca_proplist_sets(p, CA_PROP_WINDOW_ICON_NAME, t)) < 0) return ret; if (screen = qApp->primaryScreen()) { if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_X11_SCREEN, "%i", 0)) < 0) return ret; } width = widget->size().width(); height = widget->size().height(); if (width > 0) if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_WIDTH, "%i", width)) < 0) return ret; if (height > 0) if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_HEIGHT, "%i", height)) < 0) return ret; if (x >= 0 && width > 0) { screen_width = qApp->primaryScreen()->size().width(); x += width/2; x = CA_CLAMP(x, 0, screen_width-1); /* We use these strange format strings here to avoid that libc * applies locale information on the formatting of floating * numbers. */ if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_HPOS, "%i.%03i", (int) (x/(screen_width-1)), (int) (1000.0*x/(screen_width-1)) % 1000)) < 0) return ret; } if (y >= 0 && height > 0) { screen_height = qApp->primaryScreen()->size().height(); y += height/2; y = CA_CLAMP(y, 0, screen_height-1); if ((ret = ca_proplist_setf(p, CA_PROP_WINDOW_VPOS, "%i.%03i", (int) (y/(screen_height-1)), (int) (1000.0*y/(screen_height-1)) % 1000)) < 0) return ret; } return CA_SUCCESS; } UkmediaMainWidget::~UkmediaMainWidget() { } //查找指定声å�¡å��的索引 int UkmediaMainWidget::findCardIndex(QString cardName, QMap cardMap) { QMap::iterator it; for(it=cardMap.begin();it!=cardMap.end();) { if (it.value() == cardName) { return it.key(); } ++it; } return -1; } /* * æ ¹æ�®å£°å�¡ç´¢å¼•查找声å�¡å�� */ QString UkmediaMainWidget::findCardName(int index,QMap cardMap) { QMap::iterator it; for(it=cardMap.begin();it!=cardMap.end();) { if (it.key() == index) { return it.value(); } ++it; } return ""; } /* 查找å��称为PortLbael çš„portName */ QString UkmediaMainWidget::findOutputPortName(int index,QString portLabel) { QMap>::iterator it; QMultiMapportMap; QMultiMap::iterator tempMap; QString portName = ""; for (it = m_pVolumeControl->outputPortMap.begin();it != m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.value() == portLabel) { portName = tempMap.key(); break; } ++tempMap; } } ++it; } return portName; } /* 查找å��称为PortName çš„portLabel */ QString UkmediaMainWidget::findOutputPortLabel(int index,QString portName) { QMap>::iterator it; QMultiMapportMap; QMultiMap::iterator tempMap; QString portLabel = ""; for (it = m_pVolumeControl->outputPortMap.begin();it != m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { qDebug() <<"findOutputPortLabel" <>::iterator it; QMultiMapportMap; QMultiMap::iterator tempMap; QString portName = ""; for (it = m_pVolumeControl->inputPortMap.begin();it != m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.value() == portLabel) { portName = tempMap.key(); break; } ++tempMap; } } ++it; } return portName; } /* 查找å��称为PortName çš„portLabel */ QString UkmediaMainWidget::findInputPortLabel(int index,QString portName) { QMap>::iterator it; QMultiMapportMap; QMultiMap::iterator tempMap; QString portLabel = ""; for (it = m_pVolumeControl->inputPortMap.begin();it != m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.key() == portName) { portLabel = tempMap.value(); break; } ++tempMap; } } ++it; } return portLabel; } QString UkmediaMainWidget::findHighPriorityProfile(int index, QString profile) { int priority = 0; QString profileName = ""; QMap profileNameMap; QMap::iterator tempMap; QMap>::iterator it; QString profileStr = findCardActiveProfile(index); QStringList list = profileStr.split("+"); QString includeProfile = ""; if (list.count() > 1) { if (profile.contains("output")) includeProfile = list.at(1); else if (profile.contains("input")) includeProfile = list.at(0); } else includeProfile = list.at(0); for (it = m_pVolumeControl->cardProfilePriorityMap.begin(); it != m_pVolumeControl->cardProfilePriorityMap.end(); ++it) { if (index == it.key()) { profileNameMap = it.value(); for (tempMap = profileNameMap.begin(); tempMap != profileNameMap.end(); ++tempMap) { if (!includeProfile.isEmpty() && tempMap.key().contains(includeProfile) && tempMap.key().contains(profile) && !tempMap.key().contains(includeProfile + "-") && !tempMap.key().contains(profile + "-")) { priority = tempMap.value(); profileName = tempMap.key(); qDebug() << "Status1: Find profileName" << profileName << "priority" << priority; } else if (tempMap.key().contains(profile) && tempMap.value() > priority) { priority = tempMap.value(); profileName = tempMap.key(); qDebug() << "Status2: Find profileName" << profileName << "priority" << priority; } } } } qInfo() << __func__ << "Select profile is" << profileName << "index" << index << "includeProfile" << includeProfile; return profileName; } /* * 输入设备中是å�¦åŒ…å�«è“�牙设备 */ bool UkmediaMainWidget::inputComboboxDeviceContainBluetooth() { for (int row=0;rowm_pInputDeviceSelectBox->count();row++) { QString inputComboboxCardName = m_pInputWidget->m_pInputDeviceSelectBox->itemData(row).toString(); if (inputComboboxCardName.contains("bluez")) { return true; } } return false; } QString UkmediaMainWidget::blueCardNameInCombobox() { for (int row=0;rowm_pInputDeviceSelectBox->count();row++) { QString inputComboboxCardName = m_pInputWidget->m_pInputDeviceSelectBox->itemData(row).toString(); if (inputComboboxCardName.contains("bluez")) { return inputComboboxCardName; } } return ""; } /* * 设置声å�¡çš„é…�置文件 */ void UkmediaMainWidget::setCardProfile(QString name, QString profile) { int index = findCardIndex(name,m_pVolumeControl->cardMap); m_pVolumeControl->setCardProfile(index,profile.toLatin1().data()); qDebug() << "set profile" << name << profile << index ; } /* * 设置默认的输出设备端å�£ */ void UkmediaMainWidget::setDefaultOutputPortDevice(QString devName, QString portName) { int cardIndex = findCardIndex(devName,m_pVolumeControl->cardMap); QString portStr = findOutputPortName(cardIndex,portName); qDebug() << "setDefaultOutputPortDevice" << cardIndex << portStr; QTimer *timer = new QTimer; timer->start(300); connect(timer,&QTimer::timeout,[=](){ QString sinkStr = findPortSink(cardIndex,portStr); qDebug() << "setDefaultOutputPortDevice" << sinkStr; /*默认的stream 和设置的stream相å�Œ 需è¦�更新端å�£*/ if (strcmp(sinkStr.toLatin1().data(),m_pVolumeControl->defaultSinkName) == 0) { m_pVolumeControl->setSinkPort(sinkStr.toLatin1().data(),portStr.toLatin1().data()); } else { m_pVolumeControl->setDefaultSink(sinkStr.toLatin1().data()); m_pVolumeControl->setSinkPort(sinkStr.toLatin1().data(),portStr.toLatin1().data()); } delete timer; }); } /* * 设置默认的输入设备端å�£ */ void UkmediaMainWidget::setDefaultInputPortDevice(QString devName, QString portName) { int cardIndex = findCardIndex(devName,m_pVolumeControl->cardMap); QString portStr = findInputPortName(cardIndex,portName); QTimer *timer = new QTimer; timer->start(100); connect(timer,&QTimer::timeout,[=](){ QString sourceStr = findPortSource(cardIndex,portStr); /*默认的stream 和设置的stream相å�Œ 需è¦�更新端å�£*/ if (strcmp(sourceStr.toLatin1().data(),m_pVolumeControl->defaultSourceName) == 0) { m_pVolumeControl->setSourcePort(sourceStr.toLatin1().data(),portStr.toLatin1().data()); } else { m_pVolumeControl->setDefaultSource(sourceStr.toLatin1().data()); m_pVolumeControl->setSourcePort(sourceStr.toLatin1().data(),portStr.toLatin1().data()); } qDebug() << "set default input" << portName << cardIndex << portStr << devName <::iterator it; for (it=m_pVolumeControl->cardActiveProfileMap.begin();it!=m_pVolumeControl->cardActiveProfileMap.end();) { if (it.key() == index) { activeProfileName = it.value(); break; } ++it; } return activeProfileName; } /* * Find the corresponding sink according to the port name */ QString UkmediaMainWidget::findPortSink(int cardIndex,QString portName) { QMultiMap>::iterator it; QMultiMap portNameMap; QMultiMap::iterator tempMap; QString sinkStr = ""; for (it=m_pVolumeControl->sinkPortMap.begin();it!=m_pVolumeControl->sinkPortMap.end();) { if (it.key() == cardIndex) { portNameMap = it.value(); for (tempMap=portNameMap.begin();tempMap!=portNameMap.end();) { if (tempMap.value() == portName) { sinkStr = tempMap.key(); qDebug() <<"find port sink" << it.value() << portName<< it.key() <>::iterator it; QMultiMap portNameMap; QMultiMap::iterator tempMap; QString sourceStr = ""; for (it=m_pVolumeControl->sourcePortMap.begin();it!=m_pVolumeControl->sourcePortMap.end();) { if (it.key() == cardIndex) { portNameMap = it.value(); for (tempMap=portNameMap.begin();tempMap!=portNameMap.end();) { if (tempMap.value() == portName) { sourceStr = tempMap.key(); qDebug() << "find port source" <defaultOutputCard == -1 && !m_pOutputWidget->m_pDeviceSelectBox->count()) { addNoneItem(SoundType::SINK); } QString outputCardName = findCardName(m_pVolumeControl->defaultOutputCard, m_pVolumeControl->cardMap); QString outputPortLabel = findOutputPortLabel(m_pVolumeControl->defaultOutputCard, m_pVolumeControl->sinkPortName); findOutputComboboxItem(outputCardName, outputPortLabel); int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); float balanceVolume = m_pVolumeControl->getBalanceVolume(); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(true); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(true); m_pOutputWidget->m_pOpVolumeSlider->setValue(mediaVolume); m_pOutputWidget->m_pOpVolumePercentLabel->setText(QString::number(mediaVolume) + "%"); handleBalanceSlider(balanceVolume); m_pOutputWidget->m_pOpBalanceSlider->blockSignals(false); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(false); qDebug() << "initComboboxItem(Output)" << m_pVolumeControl->defaultOutputCard << outputCardName << m_pVolumeControl->sinkPortName << outputPortLabel; } void UkmediaMainWidget::initInputComboboxItem() { if (m_pVolumeControl->defaultInputCard == -1 && !m_pInputWidget->m_pInputDeviceSelectBox->count()) { addNoneItem(SoundType::SOURCE); } QString inputCardName = findCardName(m_pVolumeControl->defaultInputCard, m_pVolumeControl->cardMap); QString inputPortLabel = findInputPortLabel(m_pVolumeControl->defaultInputCard, m_pVolumeControl->sourcePortName); findInputComboboxItem(inputCardName, inputPortLabel); //当所有å�¯ç”¨çš„输入设备全部移除,å�°å¼�机æ‰�会出现该情况 if (strstr(m_pVolumeControl->defaultSourceName,"monitor")) { m_pInputWidget->m_pIpVolumeSlider->setEnabled(false); m_pInputWidget->m_pIpVolumeSlider->setValue(0); m_pInputWidget->m_pInputLevelProgressBar->setValue(0); }else{ if(!m_pInputWidget->m_pIpVolumeSlider->isEnabled()) m_pInputWidget->m_pIpVolumeSlider->setEnabled(true); } qDebug() <<"initComboboxItem(Input)" << m_pVolumeControl->defaultInputCard << inputCardName << m_pVolumeControl->sourcePortName << inputPortLabel; } void UkmediaMainWidget::findOutputComboboxItem(QString cardName,QString portLabel) { for (int row=0;rowm_pDeviceSelectBox->count();row++) { QString comboboxcardname = m_pOutputWidget->m_pDeviceSelectBox->itemData(row).toString(); QString comboboxportname = m_pOutputWidget->m_pDeviceSelectBox->itemText(row); if (comboboxcardname == cardName && comboboxportname == portLabel) { m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->setCurrentIndex(row); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); break; } } m_boxoutputRow = m_pOutputWidget->m_pDeviceSelectBox->currentIndex(); } void UkmediaMainWidget::addNoneItem(int soundType) { int index = -1; switch (soundType) { case SoundType::SINK: //需求31268å¾…2501å†�å�ˆå…¥ #if 1 m_pOutputWidget->m_pOpVolumeSlider->setEnabled(false); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(true); #endif index = m_pOutputWidget->m_pDeviceSelectBox->findText(tr("None")); if (index != -1) return; m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->addItem(tr("None")); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); m_pOutputWidget->m_pOpVolumeSlider->blockSignals(true); m_pOutputWidget->m_pOpVolumeSlider->setValue(0); m_pOutputWidget->m_pOpVolumePercentLabel->setText("0%"); m_pVolumeControl->sinkVolume = 0; m_pOutputWidget->m_pOpVolumeSlider->blockSignals(false); break; case SoundType::SOURCE: //需求31268å¾…2501å†�å�ˆå…¥ #if 1 m_pInputWidget->m_pIpVolumeSlider->setEnabled(false); #endif index = m_pInputWidget->m_pInputDeviceSelectBox->findText(tr("None")); if (index != -1) return; m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->addItem(tr("None")); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); m_pInputWidget->m_pIpVolumeSlider->blockSignals(true); if(!strstr(m_pVolumeControl->defaultSourceName, "bluez") && !strstr(m_pVolumeControl->defaultSourceName, "bt_sco")){ m_pInputWidget->m_pIpVolumeSlider->setEnabled(false); m_pInputWidget->m_pIpVolumeSlider->setValue(0); m_pInputWidget->m_pIpVolumePercentLabel->setText("0%"); m_pVolumeControl->sourceVolume = 0; } m_pInputWidget->m_pIpVolumeSlider->blockSignals(false); break; default: return; } } void UkmediaMainWidget::removeNoneItem(int soundType) { int index = -1; switch (soundType) { case SoundType::SINK: //需求31268å¾…2501å†�å�ˆå…¥ #if 1 m_pOutputWidget->m_pOpVolumeSlider->setEnabled(true); m_pOutputWidget->m_pOpBalanceSlider->setDisabled(false); #endif index = m_pOutputWidget->m_pDeviceSelectBox->findText(tr("None")); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->removeItem(index); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); break; case SoundType::SOURCE: //需求31268å¾…2501å†�å�ˆå…¥ #if 1 m_pInputWidget->m_pIpVolumeSlider->setEnabled(true); #endif index = m_pInputWidget->m_pInputDeviceSelectBox->findText(tr("None")); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->removeItem(index); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); break; default: return; } } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该添加到Combobox output list widget上 */ bool UkmediaMainWidget::comboboxOutputPortIsNeedAdd(int index, QString name) { QMultiMap::iterator it; for(it=currentCboxOutputPortLabelMap.begin();it!=currentCboxOutputPortLabelMap.end();) { if (index == it.key() && name == it.value()) { return false; } ++it; } return true; } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该在output list widget上删除 */ bool UkmediaMainWidget::comboboxOutputPortIsNeedDelete(int index, QString name) { QMap>::iterator it; QMultiMap::iterator at; QMultiMap portMap; for(it = m_pVolumeControl->outputPortMap.begin();it!=m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (at=portMap.begin();at!=portMap.end();) { if (name == at.value()) { return false; } ++at; } } ++it; } if(name == tr("None")){ return false; } return true; } /* * 添加å�¯ç”¨çš„输出端å�£åˆ°ComBoBox output list widget */ void UkmediaMainWidget::addComboboxAvailableOutputPort() { QMap>::iterator at; QMultiMap::iterator it; QMultiMap tempMap; for (at = m_pVolumeControl->outputPortMap.begin(); at != m_pVolumeControl->outputPortMap.end();) { tempMap = at.value(); for (it = tempMap.begin(); it != tempMap.end();) { if (comboboxOutputPortIsNeedAdd(at.key(), it.value())) { qDebug() << "add output combox widget" << at.key()<< it.value() << it.key(); addComboboxOutputListWidgetItem(it.value(), findCardName(at.key(),m_pVolumeControl->cardMap)); currentCboxOutputPortLabelMap.insert(at.key(), it.value()); } ++it; } ++at; } } /* * 添加output port到Combobox output list widget */ void UkmediaMainWidget::addComboboxOutputListWidgetItem(QString portLabel, QString cardName) { int i = m_pOutputWidget->m_pDeviceSelectBox->count(); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->insertItem(i,portLabel,cardName); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); qDebug() << "添加输出设备端å�£" << portLabel << cardName; } //ä¼ è¿›æ�¥ä¸€ä¸ªportName用æ�¥å®šä½�ä»–çš„ä½�ç½® int UkmediaMainWidget::indexOfOutputPortInOutputCombobox(QString portName) { for (int row=0;rowm_pDeviceSelectBox->count();row++) { QString text = m_pOutputWidget->m_pDeviceSelectBox->itemText(row); if (text == portName) return row; } return -1; } /* * 移除combobox output list widget上ä¸�å�¯ç”¨çš„输出端å�£ */ void UkmediaMainWidget::deleteNotAvailableComboboxOutputPort() { //删除ä¸�å�¯ç”¨çš„输出端å�£ QMultiMap::iterator it; for(it=currentCboxOutputPortLabelMap.begin();it!=currentCboxOutputPortLabelMap.end();) { //没找到,需è¦�删除 if (comboboxOutputPortIsNeedDelete(it.key(),it.value())) { int index = indexOfOutputPortInOutputCombobox(it.value()); if (index == -1) return; m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->removeItem(index); m_pOutputWidget->m_pDeviceSelectBox->hidePopup(); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); qDebug()<< "deleteNotAvailableComboboxOutputPort" <m_pInputDeviceSelectBox->count();row++) { QString comboboxcardname = m_pInputWidget->m_pInputDeviceSelectBox->itemData(row).toString(); QString comboboxportname = m_pInputWidget->m_pInputDeviceSelectBox->itemText(row); if (comboboxcardname == cardName && comboboxportname == portLabel) { m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->setCurrentIndex(row); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); if(!strstr(m_pVolumeControl->sourcePortName.toUtf8().constData(), "internal") \ && !strstr(m_pVolumeControl->sourcePortName.toUtf8().constData(), "[In] Mic1")) { Q_EMIT m_pVolumeControl->updateLoopBack(true); qDebug() << "findInputComboboxItem -> Q_EMIT updateLoopBack true" << m_pVolumeControl->sourcePortName; }else{ Q_EMIT m_pVolumeControl->updateLoopBack(false); qDebug() << "findInputComboboxItem -> Q_EMIT updateLoopBack false" << m_pVolumeControl->sourcePortName; } if (comboboxcardname.contains("bluez_card")) { isCheckBluetoothInput = true; } break; } else if (comboboxportname == tr("None")) { m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->setCurrentIndex(row); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); Q_EMIT m_pVolumeControl->updateLoopBack(false); qDebug() << "findInputComboboxItem else -> Q_EMIT updateLoopBack false" << m_pVolumeControl->sourcePortName; } } } /* * 在input combobox list widget删除ä¸�å�¯ç”¨çš„端å�£ */ void UkmediaMainWidget::deleteNotAvailableComboboxInputPort() { //删除ä¸�å�¯ç”¨çš„输入端å�£ QMultiMap::iterator it; for(it=currentCboxInputPortLabelMap.begin();it!=currentCboxInputPortLabelMap.end();) { //没找到,需è¦�删除 if (comboboxInputPortIsNeedDelete(it.key(),it.value())) { int index = indexOfInputPortInInputCombobox(it.value()); if (index == -1) return; m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->removeItem(index); m_pInputWidget->m_pInputDeviceSelectBox->hidePopup(); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); it = currentCboxInputPortLabelMap.erase(it); continue; } ++it; } } //ä¼ è¿›æ�¥input portName用æ�¥å®šä½�ä»–çš„ä½�ç½® int UkmediaMainWidget::indexOfInputPortInInputCombobox(QString portName) { for (int index=0;indexm_pInputDeviceSelectBox->count();index++) { QString textport = m_pInputWidget->m_pInputDeviceSelectBox->itemText(index); // QString textcard = m_pInputWidget->m_pInputDeviceSelectBox->itemData(index).toString(); if (textport == portName ) { return index; } } return -1; } /* * 添加å�¯ç”¨çš„输入端å�£åˆ°input list widget */ void UkmediaMainWidget::addComboboxAvailableInputPort() { QMap>::iterator at; QMultiMap::iterator it; QMultiMap tempMap; qDebug() << "addComboboxAvailableInputPort"<< m_pVolumeControl->inputPortMap.count() << m_pInputWidget->m_pInputDeviceSelectBox->currentText(); //增加端å�£ for(at=m_pVolumeControl->inputPortMap.begin();at!=m_pVolumeControl->inputPortMap.end();) { tempMap = at.value(); for (it=tempMap.begin();it!=tempMap.end();){ if (comboboxInputPortIsNeedAdd(at.key(),it.value())){ addComboboxInputListWidgetItem(it.value(), findCardName(at.key(),m_pVolumeControl->cardMap)); currentCboxInputPortLabelMap.insert(at.key(), it.value()); } ++it; } ++at; } } /* * 添加输入端å�£åˆ°input combobox widget */ void UkmediaMainWidget::addComboboxInputListWidgetItem(QString portLabel, QString cardName) { int i = m_pInputWidget->m_pInputDeviceSelectBox->count(); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pInputWidget->m_pInputDeviceSelectBox->insertItem(i,portLabel,cardName); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); qDebug() << "添加输入设备端å�£" << portLabel << cardName; } /* * 当å‰�的输入端å�£æ˜¯å�¦åº”该添加到Combobox input list widget上 */ bool UkmediaMainWidget::comboboxInputPortIsNeedAdd(int index, QString name) { QMultiMap::iterator it; for(it=currentCboxInputPortLabelMap.begin();it!=currentCboxInputPortLabelMap.end();) { if (index == it.key() && name == it.value()) return false; ++it; } return true; } /* * 当å‰�的输入端å�£æ˜¯å�¦åº”该在Combobox list上删除 */ bool UkmediaMainWidget::comboboxInputPortIsNeedDelete(int index, QString name) { QMap>::iterator it; QMultiMap::iterator at; QMultiMap portMap; for(it = m_pVolumeControl->inputPortMap.begin();it!=m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (at=portMap.begin();at!=portMap.end();) { if (name == at.value()) return false; ++at; } } ++it; } if(name == tr("None")){ return false; } return true; } /* * 更新设备端å�£ */ void UkmediaMainWidget::updateCboxDevicePort() { QMap>::iterator it; QMultiMap::iterator at; QMultiMap temp; currentCboxInputPortLabelMap.clear(); currentCboxOutputPortLabelMap.clear(); qDebug() << __func__ << "output" << m_pVolumeControl->outputPortMap.count() << "input" << m_pVolumeControl->inputPortMap.count(); // 1. update sink int count = m_pVolumeControl->outputPortMap.count(); if (count == 0) { addNoneItem(SoundType::SINK); } else { removeNoneItem(SoundType::SINK); } // 2.update input count = m_pVolumeControl->inputPortMap.count(); // 2.1 æ— å�¯ç”¨è¾“入设备,需添加None端å�£ if (count == 0) { addNoneItem(SoundType::SOURCE); } // 2.2 存在两个å�Šä»¥ä¸Šå�¯ç”¨è¾“入设备,需移除None端å�£ else if (count > 1) { removeNoneItem(SoundType::SOURCE); } // 2.3 存在一个å�¯ç”¨è¾“入设备时,判断是å�¦ä¸ºè“�牙(è“�牙默认a2dp,需ä¿�ç•™None端å�£) else if (count == 1) { int cardIndex = m_pVolumeControl->inputPortMap.firstKey(); QString cardName = findCardName(cardIndex, m_pVolumeControl->cardMap); if (cardName.contains("bluez") ) addNoneItem(SoundType::SOURCE); else removeNoneItem(SoundType::SOURCE); } // 3.åˆ�始化设备端å�£ if (cboxfirstEntry) { for(it = m_pVolumeControl->outputPortMap.begin(); it != m_pVolumeControl->outputPortMap.end(); ++it) { temp = it.value(); for (at = temp.begin(); at != temp.end(); ++at) { QString cardName = findCardName(it.key(), m_pVolumeControl->cardMap); addComboboxOutputListWidgetItem(at.value(), cardName); } } for(it = m_pVolumeControl->inputPortMap.begin(); it != m_pVolumeControl->inputPortMap.end(); ++it) { temp = it.value(); for (at = temp.begin(); at != temp.end(); ++at) { QString cardName = findCardName(it.key(), m_pVolumeControl->cardMap); addComboboxInputListWidgetItem(at.value(), cardName); } } cboxfirstEntry = false; } else {// 4.更新设备端å�£ for (int i = 0; i < m_pOutputWidget->m_pDeviceSelectBox->count(); i++) { int index = -1; QMap::iterator at; QString portname = m_pOutputWidget->m_pDeviceSelectBox->itemText(i); QString cardname = m_pOutputWidget->m_pDeviceSelectBox->itemData(i).toString(); for (at = m_pVolumeControl->cardMap.begin(); at != m_pVolumeControl->cardMap.end(); ++at) { if (cardname == at.value()) { index = at.key(); break; } } currentCboxOutputPortLabelMap.insert(index, portname); } for(int i = 0; i < m_pInputWidget->m_pInputDeviceSelectBox->count(); i++) { int index = -1; QMap::iterator at; QString portname = m_pInputWidget->m_pInputDeviceSelectBox->itemText(i); QString cardname = m_pInputWidget->m_pInputDeviceSelectBox->itemData(i).toString(); for (at = m_pVolumeControl->cardMap.begin(); at != m_pVolumeControl->cardMap.end(); ++at) { if (cardname == at.value()) { index = at.key(); break; } } currentCboxInputPortLabelMap.insert(index,portname); } m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(true); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(true); deleteNotAvailableComboboxOutputPort(); addComboboxAvailableOutputPort(); initOutputComboboxItem(); deleteNotAvailableComboboxInputPort(); addComboboxAvailableInputPort(); m_pOutputWidget->m_pDeviceSelectBox->blockSignals(false); m_pInputWidget->m_pInputDeviceSelectBox->blockSignals(false); } } /* * Combobox选项改å�˜ï¼Œè®¾ç½®å¯¹åº”的输出设备 */ void UkmediaMainWidget::cboxoutputListWidgetCurrentRowChangedSlot() { //当所有å�¯ç”¨çš„输出设备全部移除,å�°å¼�机æ‰�会出现该情况 if (m_boxoutputRow == -1) return; QString outputComboboxPortName = m_pOutputWidget->m_pDeviceSelectBox->itemText(m_boxoutputRow); QString outputComboboxCardName = m_pOutputWidget->m_pDeviceSelectBox->itemData(m_boxoutputRow).toString(); QString inputComboboxPortName = m_pInputWidget->m_pInputDeviceSelectBox->currentText(); QString inputComboboxCardName = m_pInputWidget->m_pInputDeviceSelectBox->currentData().toString(); bool isContainBlue = inputComboboxDeviceContainBluetooth(); //当输出设备从è“�牙切æ�¢åˆ°å…¶ä»–设备时,需将è“�牙声å�¡çš„é…�置文件切æ�¢ä¸ºa2dp-sink if (isContainBlue && (strstr(m_pVolumeControl->defaultSourceName,\ "headset_head_unit") || strstr(m_pVolumeControl->defaultSourceName,"bt_sco_source"))){ QString cardName = blueCardNameInCombobox(); setCardProfile(cardName,"a2dp_sink"); } QMap>::iterator outputProfileMap; QMap>::iterator inputProfileMap; QMultiMap tempMap; QMultiMap::iterator at; QString endOutputProfile = ""; QString endInputProfile = ""; int count,i; int currentCardIndex = findCardIndex(outputComboboxCardName,m_pVolumeControl->cardMap); QStringList outputComboboxPortNameList = outputComboboxPortName.split("(");//新增设计combobox需è¦�显示 端å�£å��+(description); QStringList inputComboboxPortNameList = inputComboboxPortName.split("("); for (outputProfileMap=m_pVolumeControl->profileNameMap.begin();outputProfileMap!= m_pVolumeControl->profileNameMap.end();) { if(currentCardIndex == outputProfileMap.key()){ tempMap = outputProfileMap.value(); for(at=tempMap.begin(),i=0;at!= tempMap.end();++i){ if (at.key() == outputComboboxPortNameList.at(0)) { count = i; endOutputProfile = at.value(); } ++at; } } ++outputProfileMap; } if (m_pInputWidget->m_pInputDeviceSelectBox->currentText().size()!=0) { QMultiMap ::iterator it; QMultiMap temp; int index = findCardIndex(inputComboboxCardName,m_pVolumeControl->cardMap); for (inputProfileMap=m_pVolumeControl->inputPortProfileNameMap.begin(),count=0;inputProfileMap!= m_pVolumeControl->inputPortProfileNameMap.end();count++) { if (inputProfileMap.key() == index) { temp = inputProfileMap.value(); for(it = temp.begin(); it != temp.end();){ if(it.key() == inputComboboxPortNameList.at(0)){ endInputProfile = it.value(); } ++it; } } ++inputProfileMap; } } qDebug() << "outputListWidgetCurrentRowChangedSlot" << m_boxoutputRow << outputComboboxPortName << endOutputProfile <m_pInputDeviceSelectBox->currentText().size()!=0 && outputComboboxCardName == inputComboboxCardName ) || \ outputComboboxCardName == "alsa_card.platform-sound_DA_combine_v5" && inputComboboxCardName == "3a.algo") { QString setProfile = endOutputProfile; if (!endOutputProfile.contains("input:analog-stereo") || !endOutputProfile.contains("HiFi")) { setProfile += "+"; setProfile +=endInputProfile; } if (endOutputProfile.contains("a2dp-sink") && endInputProfile.contains("headset-head-unit")) setProfile = endOutputProfile; setCardProfile(outputComboboxCardName,setProfile); setDefaultOutputPortDevice(outputComboboxCardName,outputComboboxPortName); } //如果选择的输入输出设备ä¸�是å�Œä¸€å�—声å�¡ï¼Œéœ€è¦�设置一个优先级高的é…�置文件 else { int index = findCardIndex(outputComboboxCardName,m_pVolumeControl->cardMap); QMap >::iterator it; QString profileName; for(it=m_pVolumeControl->cardProfileMap.begin();it!=m_pVolumeControl->cardProfileMap.end();) { if (it.key() == index) { if (strstr(endOutputProfile.toLatin1().data(),"headset_head_unit")) endOutputProfile = "a2dp_sink"; profileName = findHighPriorityProfile(index,endOutputProfile); } ++it; } QString setProfile = profileName; setCardProfile(outputComboboxCardName,setProfile); setDefaultOutputPortDevice(outputComboboxCardName,outputComboboxPortName); } m_pOutputWidget->m_pDeviceSelectBox->setObjectName("m_pOutputWidget->m_pDeviceSelectBox"); ukcc::UkccCommon::buriedSettings("Audio", m_pOutputWidget->m_pDeviceSelectBox->objectName(),"select",m_pOutputWidget->m_pDeviceSelectBox->itemText(m_boxoutputRow)); qDebug() << "active combobox output port:" << outputComboboxPortName << outputComboboxCardName; } void UkmediaMainWidget::cboxinputListWidgetCurrentRowChangedSlot() { if (m_boxinputRow == -1) { return; } QString inputComboboxPortName = m_pInputWidget->m_pInputDeviceSelectBox->itemText(m_boxinputRow); QString inputComboboxCardName = m_pInputWidget->m_pInputDeviceSelectBox->itemData(m_boxinputRow).toString(); QString outputComboboxPortName = m_pOutputWidget->m_pDeviceSelectBox->currentText(); QString outputComboboxCardName = m_pOutputWidget->m_pDeviceSelectBox->currentData().toString(); bool isContainBlue = inputComboboxDeviceContainBluetooth(); //当输出设备从è“�牙切æ�¢åˆ°å…¶ä»–设备时,需将è“�牙声å�¡çš„é…�置文件切æ�¢ä¸ºa2dp-sink if (isContainBlue && (strstr(m_pVolumeControl->defaultSinkName,"headset_head_unit") || strstr(m_pVolumeControl->defaultSourceName,"bt_sco_source"))) { QString cardName = blueCardNameInCombobox(); setCardProfile(cardName,"a2dp_sink"); } if(inputComboboxCardName.contains("bluez_card")) { isCheckBluetoothInput = true; } else { isCheckBluetoothInput = false; if(inputComboboxPortName == tr("None")){ qDebug() << "come Back Bluetooth A2dp Model"; return ; } } QMap>::iterator inputProfileMap; QMap>::iterator outputProfileMap; QMultiMap temp; QMultiMap::iterator at; QString endOutputProfile = ""; QString endInputProfile = ""; int index = findCardIndex(inputComboboxCardName,m_pVolumeControl->cardMap); QStringList outputComboboxPortNameList = outputComboboxPortName.split("(");//新增设计combobox需è¦�显示 端å�£å��+(description); QStringList inputComboboxPortNameList = inputComboboxPortName.split("("); for (inputProfileMap=m_pVolumeControl->inputPortProfileNameMap.begin();inputProfileMap!= m_pVolumeControl->inputPortProfileNameMap.end();) { if (inputProfileMap.key() == index) { temp = inputProfileMap.value(); for(at=temp.begin();at!=temp.end();){ if(at.key() == inputComboboxPortNameList.at(0)){ endInputProfile = at.value(); } ++at; } } ++inputProfileMap; } if (m_pOutputWidget->m_pDeviceSelectBox->currentText().size()!=0) { QMultiMap ::iterator it; QMultiMap temp; int index = findCardIndex(outputComboboxCardName,m_pVolumeControl->cardMap); for (outputProfileMap=m_pVolumeControl->profileNameMap.begin();outputProfileMap!= m_pVolumeControl->profileNameMap.end();) { if (outputProfileMap.key() == index) { temp = outputProfileMap.value(); for(it=temp.begin();it!=temp.end();){ if(it.key() == outputComboboxPortNameList.at(0)){ endOutputProfile = it.value(); } ++it; } } ++outputProfileMap; } } //如果选择的输入输出设备为å�Œä¸€ä¸ªå£°å�¡ï¼Œåˆ™è¿½åŠ æŒ‡å®šè¾“å…¥è¾“å‡ºç«¯å�£å±žäºŽçš„é…�置文件 if (m_pOutputWidget->m_pDeviceSelectBox->currentText().size()!=0 && inputComboboxCardName == outputComboboxCardName) { QString setProfile; //有些声å�¡çš„é…�置文件默认å�ªæœ‰è¾“å…¥/输出设备或者é…�置文件包å�«äº†è¾“出输入设备,因此å�ªéœ€è¦�å�–其中一个é…�置文件å�³å�¯ if (endOutputProfile == "a2dp-sink" || endInputProfile == "headset_head_unit" || endOutputProfile == "HiFi" ) { setProfile += endInputProfile; } else { setProfile += endOutputProfile; setProfile += "+"; setProfile +=endInputProfile; } setCardProfile(inputComboboxCardName,setProfile); setDefaultInputPortDevice(inputComboboxCardName,inputComboboxPortName); } //如果选择的输入输出设备ä¸�是å�Œä¸€å�—声å�¡ï¼Œéœ€è¦�设置一个优先级高的é…�置文件 else { int index = findCardIndex(inputComboboxCardName,m_pVolumeControl->cardMap); QMap >::iterator it; QString profileName; for(it=m_pVolumeControl->cardProfileMap.begin();it!=m_pVolumeControl->cardProfileMap.end();) { if (it.key() == index) { QStringList list= it.value(); profileName = findHighPriorityProfile(index,endInputProfile); if (list.contains(endOutputProfile)) { } } ++it; } QString setProfile = profileName; setCardProfile(inputComboboxCardName,setProfile); setDefaultInputPortDevice(inputComboboxCardName,inputComboboxPortName); } m_pInputWidget->m_pInputDeviceSelectBox->setObjectName("m_pInputWidget->m_pInputDeviceSelectBox"); ukcc::UkccCommon::buriedSettings("Audio",m_pInputWidget->m_pInputDeviceSelectBox->objectName(),"select",m_pInputWidget->m_pInputDeviceSelectBox->itemText(m_boxinputRow)); qDebug() << "active combobox input port:" << inputComboboxPortName << inputComboboxCardName<< isCheckBluetoothInput; } void UkmediaMainWidget::updateComboboxListWidgetItemSlot() { qDebug() << "updateComboboxListWidgetItemSlot"; initOutputComboboxItem(); initInputComboboxItem(); themeChangeIcons(); } /***************************************************************** * 函数å��称: initAlertSound * 功能æ��述: åˆ�始化音效æ��示音 * å�‚数说明: 系统音效主题路径 /usr/share/sounds ******************************************************************/ void UkmediaMainWidget::initAlertSound(const char* path) { QDir dir(path); if (!dir.exists()) return; // 获å�–音效主题文件夹 dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); QStringList nameList = dir.entryList(); QFileInfoList pathList = dir.entryInfoList(); // 忽略freeDesktop if (nameList.contains("freedesktop")) { nameList.removeOne("freedesktop"); pathList.removeOne(QFileInfo("/usr/share/sounds/freedesktop")); } for (int i = 0; i < pathList.size(); i++) { QFileInfo fileInfo = pathList.at(i); if (fileInfo.isDir()) addSoundFileInCombobox(fileInfo.filePath(), fileInfo.fileName()); } } /***************************************************************** * 函数å��称: addSoundFileInCombobox * 功能æ��述: 添加音效文件到自定义音效下拉框 * å�‚数说明: path: 音效主题路径 dirName: 音效主题å�� ******************************************************************/ void UkmediaMainWidget::addSoundFileInCombobox(QString path, QString dirName) { QDir dir(path); if (!dir.exists()) return; dir.setSorting(QDir::DirsFirst); dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); dir.setSorting(QDir::DirsLast); QStringList nameList = dir.entryList(); QFileInfoList pathList = dir.entryInfoList(); QString xmlName = dirName.append(".xml"); // 添加kylin规范音效主题 if (nameList.contains(xmlName) && nameList.contains("stereo")) { for(int i = 0; i < pathList.size(); i++) { QFileInfo fileInfo = pathList.at(i); if (fileInfo.fileName().contains(xmlName)) populateModelFromFile(this, fileInfo.filePath().toLatin1().data()); } } // 兼容社区音效主题 else if (! nameList.contains(xmlName) && nameList.contains("stereo")) { for(int i = 0; i < pathList.size(); i++) { QFileInfo fileInfo = pathList.at(i); if (fileInfo.fileName() == "stereo" && fileInfo.isDir()) { QDir d(fileInfo.filePath()); d.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); QFileInfoList dList = d.entryInfoList(); for(int i = 0; i < dList.size(); i++) { QFileInfo fileInfo = dList.at(i); QString name = fileInfo.fileName().append("("); name.append(dir.dirName()); name.append(")"); m_pSoundList.append(fileInfo.filePath()); m_pSoundNameList.append(name); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(true); m_pSoundWidget->m_pVolumeChangeCombobox->addItem(name, fileInfo.filePath()); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(false); m_pSoundWidget->m_pNotificationCombobox->blockSignals(true); m_pSoundWidget->m_pNotificationCombobox->addItem(name, fileInfo.filePath()); m_pSoundWidget->m_pNotificationCombobox->blockSignals(false); } } } } } /***************************************************************** * 函数å��称: customSoundEffectsSlot * 功能æ��述: 设置自定义音效并å�Œæ—¶æ’­æ”¾å¯¹åº”音效 * å�‚数说明: 对应音效的index ******************************************************************/ void UkmediaMainWidget::customSoundEffectsSlot(int index) { //音效文件完整路径 QString soundPath = m_pSoundList.at(index); playAlretSoundFromPath(this, soundPath); QString soundType; QComboBox *p = qobject_cast(sender()); if (p == nullptr) return; if (p->objectName().contains("m_pVolumeChangeCombobox")) { soundType = "audioVolumeChange"; ukcc::UkccCommon::buriedSettings("Audio", p->objectName(),"select",p->currentText()); } else if (p->objectName().contains("m_pNotificationCombobox")) { soundType = "notificationGeneral"; ukcc::UkccCommon::buriedSettings("Audio", p->objectName(),"select",p->currentText()); } if (m_pSoundSettings->keys().contains(soundType)) m_pSoundSettings->set(soundType, soundPath); if (m_pSoundSettings->keys().contains("customTheme")) m_pSoundSettings->set(SOUND_CUSTOM_THEME_KEY, true); } /***************************************************************** * 函数å��称: resetCustomSoundEffects * 功能æ��述: 切æ�¢éŸ³æ•ˆä¸»é¢˜æ—¶ï¼Œå·²è®¾ç½®çš„自定义音效é‡�置为主题默认音效 * å�‚数说明: theme: 主题å�� soundFile: 自定义音效类型 * 返回值: é‡�ç½®æˆ�功返回true,失败返回false ******************************************************************/ bool UkmediaMainWidget::resetCustomSoundEffects(QString theme, QString soundFile) { int index; QString path = SOUND_FILE_PATH; path.replace("xxxTheme", theme); path.replace("xxxFile", soundFile); if (m_pSoundList.contains(path)) index = m_pSoundList.indexOf(path); else if (m_pSoundList.contains(path.replace("ogg", "oga"))) //社区音效主题资æº�文件为ogaæ ¼å¼� index = m_pSoundList.indexOf(path); else index = -1; if (-1 == index) return false; //æ�¢å¤�主题默认音效并å�Œæ­¥å®šåˆ¶éŸ³æ•ˆçš„gsetting值 if (soundFile == AUDIO_VOLUME_CHANGE) { m_pSoundSettings->set(AUDIO_VOLUME_CHANGE, path); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(true); m_pSoundWidget->m_pVolumeChangeCombobox->setCurrentIndex(index); m_pSoundWidget->m_pVolumeChangeCombobox->blockSignals(false); } else if (soundFile == NOTIFICATION_GENGERAL) { m_pSoundSettings->set(NOTIFICATION_GENGERAL, path); m_pSoundWidget->m_pNotificationCombobox->blockSignals(true); m_pSoundWidget->m_pNotificationCombobox->setCurrentIndex(index); m_pSoundWidget->m_pNotificationCombobox->blockSignals(false); } return true; } /***************************************************************** * 函数å��称: playAlretSoundFromPath * 功能æ��述: 切æ�¢è‡ªå®šä¹‰éŸ³æ•ˆæ—¶æ’­æ”¾å¯¹åº”音效æ��示音 * å�‚数说明: path: 音效资æº�文件路径 ******************************************************************/ void UkmediaMainWidget::playAlretSoundFromPath (UkmediaMainWidget *w,QString path) { caPlayForWidget(w, 0, CA_PROP_APPLICATION_NAME, _("Sound Preferences"), CA_PROP_MEDIA_FILENAME, path.toLatin1().data(), CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"), CA_PROP_CANBERRA_CACHE_CONTROL, "never", CA_PROP_APPLICATION_ID, "org.mate.VolumeControl", #ifdef CA_PROP_CANBERRA_ENABLE CA_PROP_CANBERRA_ENABLE, "1", #endif NULL); } ukui-media/audio/ukmedia_slider_tip_label_helper.h0000664000175000017500000000346615170052044021346 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "ukui_custom_style.h" class MediaSliderTipLabel:public QLabel { public: MediaSliderTipLabel(); ~MediaSliderTipLabel(); protected: void paintEvent(QPaintEvent*); }; class SliderTipLabelHelper : public QObject { Q_OBJECT friend class AppEventFilter; public: SliderTipLabelHelper(QObject *parent = nullptr); ~SliderTipLabelHelper() {} void registerWidget(QWidget *w); void unregisterWidget(QWidget *w); bool eventFilter(QObject *obj, QEvent *e); void mouseMoveEvent(QObject *obj, QMouseEvent *e); void mouseReleaseEvent(QObject *obj, QMouseEvent *e); void mousePressedEvent(QObject *obj,QMouseEvent *e); private: MediaSliderTipLabel *m_pTiplabel; }; class AppEventFilter : public QObject { friend class SliderTipLabelHelper; Q_OBJECT private: explicit AppEventFilter(SliderTipLabelHelper *parent); ~AppEventFilter() {} bool eventFilter(QObject *obj, QEvent *e); SliderTipLabelHelper *m_wm = nullptr; }; #endif // SLIDERTIPLABELHELPER_H ukui-media/audio/audio-device-control/0000775000175000017500000000000015170054730016651 5ustar fengfengukui-media/audio/audio-device-control/audio-device-control.pri0000664000175000017500000000021415170054730023376 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/ukmedia_device_control_widget.h \ SOURCES += \ $$PWD/ukmedia_device_control_widget.cpp \ ukui-media/audio/audio-device-control/ukmedia_device_control_widget.cpp0000664000175000017500000006604515170054730025431 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_device_control_widget.h" QList devsInfo; QList devsInputInfo; /* * Class: UkmediaDevControlWidget * description: 输出设备的å­�ç±» */ //主窗å�£å¸ƒå±€ UkmediaDevControlWidget::UkmediaDevControlWidget(QWidget *parent): KWidget(parent) { this->setIcon(QIcon::fromTheme("ukui-control-center")); this->setWidgetName(tr("Sound Equipment Control")); this->setWindowFlags(Qt::Dialog); this->setContentsMargins(0,0,0,0); initDevControlWidget(); } void UkmediaDevControlWidget::initDevControlWidget() { QVBoxLayout* vLayout = new QVBoxLayout(this); m_pOutputAndInputBar = new KNavigationBar(this); QStandardItem * outputItem = new QStandardItem(QIcon::fromTheme("audio-volume-overamplified-symbolic"),tr("Output Devices")); QStandardItem * inputItem = new QStandardItem(QIcon::fromTheme("ukui-microphone-on-symbolic"),tr("Input Devices")); // 设置项的样å¼� QString itemStyle = "QStandardItem { min-width: 17px; max-width: 17px; min-height: 36px; max-height: 36px; }"; outputItem->setData(itemStyle, Qt::UserRole); #define ITEM_FLAG 2 outputItem->setData(OutputItem, Qt::UserRole+ITEM_FLAG); inputItem->setData(InputItem, Qt::UserRole+ITEM_FLAG); QList list2; list2<addItem(outputItem); m_pOutputAndInputBar->addItem(inputItem); m_pOutputAndInputBar->setContentsMargins(0,0,0,0); m_pOutputAndInputBar->setFixedSize(188, 520); vLayout->addWidget(m_pOutputAndInputBar); sideBar()->setLayout(vLayout); //管ç�†æ˜¾ç¤ºç•Œé�¢ //声明一个输出设备显示窗å�£ outputDevWidget = new OutputDevWidget; inputDevWidget = new InputDevWidget; // 创建QStackedWidget用于管ç�†ä¸�å�Œçš„界é�¢ QStackedWidget* stackedWidget = new QStackedWidget(); stackedWidget->setContentsMargins(0,0,0,0); stackedWidget->setFixedSize(560, 518); stackedWidget->addWidget(outputDevWidget); stackedWidget->addWidget(inputDevWidget); QStandardItemModel *m_mode = m_pOutputAndInputBar->model(); m_pOutputAndInputBar->listview()->setCurrentIndex(m_mode->item(0,0)->index()); //添加å�³ä¾§è®¾å¤‡çª—å�£å¸ƒå±€ QVBoxLayout* vLayout2 = new QVBoxLayout; vLayout2->addWidget(stackedWidget); baseBar()->setLayout(vLayout2); //获å�–被点击的item的数æ�®ï¼Œè·³è½¬åˆ°å¯¹åº”的页é�¢ connect(m_pOutputAndInputBar->listview(),&QListView::clicked,this,[=](const QModelIndex &index){ int flag = index.data(Qt::UserRole+ITEM_FLAG).toInt(); if (flag == OutputItem) { stackedWidget->setCurrentWidget(outputDevWidget); } else if(flag == InputItem){ stackedWidget->setCurrentWidget(inputDevWidget); } }); this->setLayoutType(HorizontalType); //设备åˆ�始化æ“�作 outputDevWidget->updateOutputDev(); inputDevWidget->updateInputDev(); } UkmediaDevControlWidget::~UkmediaDevControlWidget() { } /* * Class: OutputDevWidget * description: 输出设备界é�¢çš„æ˜¾ç¤ºã€�设备罗列ã€�设备ç¦�用与开å�¯åŠŸèƒ½ç­‰åŠŸèƒ½å®žçŽ° */ //输出设备窗å�£ OutputDevWidget::OutputDevWidget(QWidget *parent) { initOutputDevUi(); } void OutputDevWidget::initOutputDevUi() { m_pOutputDevWidget = new QFrame(this); m_pOutputDevWidget->setFrameShape(QFrame::Shape::Box); m_pOutputDevWidget->setContentsMargins(0, 0, 0, 0); //设置大å°� m_pOutputDevWidget->setFixedSize(560,490); //标签:输出设备 m_pOutputDevLabel = new TitleLabel(m_pOutputDevWidget); m_pOutputDevLabel->setText(tr("Output Devices")); m_pOutputDevLabel->setFixedSize(480,24); m_pOutputDevLabel->setStyleSheet("QLabel{color: palette(windowText);}"); // 创建水平布局并添加标签和å� ä½�符å°�部件 QHBoxLayout* labelLayout = new QHBoxLayout(); labelLayout->addWidget(m_pOutputDevLabel); labelLayout->addStretch(); // 添加å� ä½�符å°�部件 // 设置水平布局的外边è·� QMargins labelMargins(16, 0, 0, 0); // 设置左边外边è·�为 16px labelLayout->setContentsMargins(labelMargins); //设备窗å�£å¸ƒå±€ //所有输出设备widget outputDevArea = new QScrollArea(this); outputDevArea->setFixedSize(512,410); outputDevArea->setFrameShape(QFrame::NoFrame);//bjc去掉outputDevArea的边框 outputDevArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); outputDevArea->verticalScrollBar()->setProperty("drawScrollBarGroove",false);//滚动æ�¡èƒŒæ™¯é€�明 displayOutputDevWidget = new QFrame(outputDevArea); displayOutputDevWidget->setFixedWidth(512); // displayOutputDevWidget->setAttribute(Qt::WA_TranslucentBackground); outputDevArea->setWidget(displayOutputDevWidget); m_pSubDevVlayout = new QVBoxLayout(displayOutputDevWidget); displayOutputDevWidget->setLayout(m_pSubDevVlayout); //设备窗å�£æ·»åŠ å·¦å�³ä¸¤è¾¹çš„é—´éš™ QHBoxLayout *hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0,0,0,0); hlayout->addItem(new QSpacerItem(10,410,QSizePolicy::Fixed)); hlayout->addWidget(outputDevArea); hlayout->addItem(new QSpacerItem(23,410,QSizePolicy::Fixed)); hlayout->setSpacing(0); // 创建确定按钮 m_pOutputConfirmBtn = new QPushButton(tr("Confirm"), this); m_pOutputConfirmBtn->setFixedSize(96, 36); m_pOutputConfirmBtn->setProperty("isImportant", true); // 创建水平布局并添加确定按钮和å� ä½�符å°�部件 QHBoxLayout* m_pHLayout = new QHBoxLayout(); m_pHLayout->addStretch(); // 添加å� ä½�符å°�部件 m_pHLayout->addWidget(m_pOutputConfirmBtn); m_pHLayout->addSpacing(24); // 添加å�³è¾¹æ¡†é—´è·� //进行整体布局 QBoxLayout *m_pVlayout = new QVBoxLayout(m_pOutputDevWidget); m_pVlayout->setContentsMargins(0,0,0,0); m_pVlayout->addLayout(labelLayout); // m_pVlayout->addWidget(m_pOutputDevLabel); m_pVlayout->addItem(new QSpacerItem(16,8,QSizePolicy::Fixed)); m_pVlayout->addLayout(hlayout); // 将确定按钮添加到布局中 m_pVlayout->addLayout(m_pHLayout); m_pVlayout->addSpacing(30); // 添加下边框间è·� m_pOutputDevWidget->setLayout(m_pVlayout); m_pOutputDevWidget->layout()->setContentsMargins(0,0,0,0); //确定按钮,关闭窗å�£ connect(m_pOutputConfirmBtn, &QPushButton::clicked, this, &OutputDevWidget::closeWindow); //监å�¬dbus 移除输出设备信å�· QDBusConnection::sessionBus().connect(QString(), "/org/ukui/media", "org.ukui.media","updateDevSignal",this,SLOT(updateOutputDev())); \ } void OutputDevWidget::closeWindow() { QWidget* currentWindow = window(); // 获å�–当å‰�窗å�£ if (currentWindow) currentWindow->close(); // 关闭窗å�£ } //移除å­�设备窗å�£ void OutputDevWidget::updateOutputDev() { //将设备窗å�£ä¸­çš„å­�窗å�£åˆ é™¤ qDeleteAll(subDevWidgets); subDevWidgets.clear(); // 清空列表 devsInfo.clear(); //将设备窗å�£ä¸­çš„å­�窗é‡�新刷新一é�� initOutputDevWidget(); } //åˆ�始化å­�设备窗å�£ void OutputDevWidget::initOutputDevWidget() { //获å�–设备函数 getPaDevInfo(); int outputCount = 0; int inputCount = 0; for (const pa_device_port_info &info : devsInfo) { if(info.direction == 1) outputCount++; else if(info.direction == 2) inputCount++; } for (const pa_device_port_info &info : devsInfo) { if(info.direction == 1) { qDebug() << "card:" << info.card << "name:" << info.name << "inOrOut" << info.direction << "dsc:" << info.description << "ava:" << info.available << "plugged_stauts" << info.plugged_stauts << "device_description:" << info.device_description << "device_product_name:" << info.device_product_name; QString devLabel = info.description + " (" + info.device_description + ")"; //添加å­�设备到输出设备窗å�£ addSubOutputDevWidget(info.card, info.name, devLabel, info.available, outputCount); } } } //添加å­�设备窗å�£ void OutputDevWidget::addSubOutputDevWidget(int card, QString portName, QString DeviceName, int Available, int itemNum) { //声明一个dev item类,写入声å�¡IDã€�设备å��ã€�label subDevWidget = new SubDevWidget(); //widget显示应用音é‡� QWidget *subDevItemwidget = new QWidget(displayOutputDevWidget); subDevItemwidget->setFixedSize(512,60); subDevItemwidget->setObjectName("subDevItemwidget"); subDevWidget->m_pDeviceNameLabel = new FixLabel(DeviceName, subDevItemwidget); subDevWidget->m_pDevDisableButton = new KSwitchButton(); subDevWidget->m_pDevDisableButton->setObjectName("DevDisableButton"); // 设置字符串属性 subDevWidget->setProperty("card", card); subDevWidget->setProperty("DeviceName", DeviceName); subDevWidget->m_pDevDisableButton->setProperty("card", card); subDevWidget->m_pDevDisableButton->setProperty("portName", portName); subDevWidget->m_pDevDisableButton->setProperty("DeviceName", DeviceName); //判断设备的å�¯ç”¨çжæ€�æ�¥åˆ�始化 button 的选中状æ€� if(Available == 3){ subDevWidget->m_pDevDisableButton->setChecked(false); }else{ subDevWidget->m_pDevDisableButton->setChecked(true); } QHBoxLayout *outputDevControlLayout = new QHBoxLayout(subDevItemwidget); outputDevControlLayout->addItem(new QSpacerItem(16, 20, QSizePolicy::Fixed)); outputDevControlLayout->addWidget(subDevWidget->m_pDeviceNameLabel); outputDevControlLayout->addItem(new QSpacerItem(16, 20, QSizePolicy::Expanding)); outputDevControlLayout->addWidget(subDevWidget->m_pDevDisableButton); outputDevControlLayout->addItem(new QSpacerItem(16, 60, QSizePolicy::Fixed)); outputDevControlLayout->setSpacing(0); subDevItemwidget->setLayout(outputDevControlLayout); subDevItemwidget->layout()->setContentsMargins(0,0,0,0); //设置设备å­�窗å�£æ ·å¼� QString themeName = UKUI_THEME_DEFAULT; if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *nThemeSetting = new QGSettings("org.ukui.style"); if (nThemeSetting->keys().contains("styleName")) { themeName = nThemeSetting->get("style-name").toString(); } } // 设置自定义属性 subDevWidget->m_pDevDisableButton->setProperty("customBackground", true); if (themeName == UKUI_THEME_DEFAULT || themeName == UKUI_THEME_LIGHT) subDevItemwidget->setStyleSheet("#subDevItemwidget{border-radius: 6px; background-color: #F5F5F5;}"); else if (themeName == UKUI_THEME_DARK) subDevItemwidget->setStyleSheet("#subDevItemwidget{border-radius: 6px; background-color: #333333;}"); m_pSubDevVlayout->addWidget(subDevItemwidget); displayOutputDevWidget->resize(512, itemNum*60); m_pSubDevVlayout->setSpacing(2); m_pSubDevVlayout->setContentsMargins(0,0,0,0); displayOutputDevWidget->setLayout(m_pSubDevVlayout); m_pSubDevVlayout->update(); subDevItemwidget->setProperty("label",DeviceName); subDevWidgets.append(subDevItemwidget); // 连接按钮的信å�·ä¸Žæ§½ connectSubDevButton(subDevWidget->m_pDevDisableButton); } //å°†æ¯�个å­�设备窗å�£çš„button进行设备关è�” void OutputDevWidget::connectSubDevButton(KSwitchButton *button) { connect(button, &KSwitchButton::stateChanged, [=](bool state) { int card = button->property("card").toInt(); QString portName = button->property("portName").toString(); qDebug() << "connectSubDevButton button" << state << card << portName; #ifdef PA_PORT_AVAILABLE_DISABLE int outputdevstate = state? PA_PORT_AVAILABLE_YES : PA_PORT_AVAILABLE_DISABLE; #else int outputdevstate = PA_PORT_AVAILABLE_YES; #endif setDevDisable(card, portName, outputdevstate); }); } //通过DBUS传输具体设备给pulseaudioæ�¥ç¦�用或开å�¯è®¾å¤‡ void OutputDevWidget::setDevDisable(int cardId, QString portName, int devOutputState) { // 创建DBus连接 QDBusConnection connection = QDBusConnection::sessionBus(); // 创建DBus接å�£ QDBusInterface interface("org.PulseAudio.DeviceControl", "/org/pulseaudio/device_control","org.PulseAudio.DeviceControl", connection); qDebug() << " setDevDisable() " << cardId << portName << devOutputState; // 调用DBus方法 QDBusReply response = interface.call("SetDeviceStatus", cardId, portName, devOutputState); qDebug() << response; } //通过DBUS从pulseaudio中获å�–设备信æ�¯ void OutputDevWidget::getPaDevInfo() { // 注册自定义结构体类型 qRegisterMetaType("pa_device_port_info"); qDBusRegisterMetaType(); QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.isConnected()) { qDebug() << "Cannot connect to D-Bus."; return ; } QDBusMessage message = QDBusMessage::createMethodCall("org.PulseAudio.DeviceControl", "/org/pulseaudio/device_control", "org.PulseAudio.DeviceControl", "GetAllDeviceInfo"); QDBusMessage reply = bus.call(message); const QDBusArgument &dbusArgs = reply.arguments().at(0).value().variant().value(); dbusArgs.beginArray(); while (!dbusArgs.atEnd()) { pa_device_port_info info; dbusArgs.beginStructure(); dbusArgs >> info.card; dbusArgs >> info.direction; dbusArgs >> info.available; dbusArgs >> info.plugged_stauts; dbusArgs >> info.name; dbusArgs >> info.description; dbusArgs >> info.device_description; // dbusArgs >> info.device_product_name; //过滤掉ä¸�å�¯ç”¨ç«¯å�£ if(info.available == PA_PORT_AVAILABLE_NO || info.plugged_stauts == PORT_STAUTS_UNPLUGGED) { dbusArgs.endStructure(); continue; } qDebug() << " getPaDevInfo()" << info.available; // dbusArgs >> info; devsInfo.push_back(info); dbusArgs.endStructure(); } dbusArgs.endArray(); } QFrame* OutputDevWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } OutputDevWidget::~OutputDevWidget() { } /* * Class: InputDevWidget * description: 输入设备界é�¢çš„æ˜¾ç¤ºã€�设备罗列ã€�设备ç¦�用与开å�¯åŠŸèƒ½ç­‰åŠŸèƒ½å®žçŽ° */ //输出设备窗å�£ InputDevWidget::InputDevWidget(QWidget *parent) { initInputDevUi(); } void InputDevWidget::initInputDevUi() { m_pInputDevWidget = new QFrame(this); m_pInputDevWidget->setFrameShape(QFrame::Shape::Box); m_pInputDevWidget->setContentsMargins(0, 0, 0, 0); //设置大å°� m_pInputDevWidget->setFixedSize(560, 490); //标签:输出设备 m_pInputDevLabel = new TitleLabel(m_pInputDevWidget); m_pInputDevLabel->setText(tr("Input Devices")); m_pInputDevLabel->setFixedSize(480, 24); m_pInputDevLabel->setStyleSheet("QLabel{color: palette(windowText);}"); // 创建水平布局并添加标签和å� ä½�符å°�部件 QHBoxLayout* labelLayout = new QHBoxLayout(); labelLayout->addWidget(m_pInputDevLabel); labelLayout->addStretch(); // 添加å� ä½�符å°�部件 // 设置水平布局的外边è·� QMargins labelMargins(16, 0, 0, 0); // 设置左边外边è·�为 16px labelLayout->setContentsMargins(labelMargins); //设备窗å�£å¸ƒå±€ //所有输出设备widget inputDevArea = new QScrollArea(this); inputDevArea->setFixedSize(512, 410); inputDevArea->setFrameShape(QFrame::NoFrame);//bjc去掉inputDevArea的边框 inputDevArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); inputDevArea->verticalScrollBar()->setProperty("drawScrollBarGroove",false);//滚动æ�¡èƒŒæ™¯é€�明 displayInputDevWidget = new QFrame(inputDevArea); displayInputDevWidget->setFixedWidth(512); // displayInputDevWidget->setAttribute(Qt::WA_TranslucentBackground); inputDevArea->setWidget(displayInputDevWidget); m_pSubDevVlayout = new QVBoxLayout(displayInputDevWidget); displayInputDevWidget->setLayout(m_pSubDevVlayout); //设备窗å�£æ·»åŠ å·¦å�³ä¸¤è¾¹çš„é—´éš™ QHBoxLayout *hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0,0,0,0); hlayout->addItem(new QSpacerItem(10, 410, QSizePolicy::Fixed)); hlayout->addWidget(inputDevArea); hlayout->addItem(new QSpacerItem(23, 410, QSizePolicy::Fixed)); hlayout->setSpacing(0); // 创建确定按钮 m_pInputConfirmBtn = new QPushButton(tr("Confirm"), this); m_pInputConfirmBtn->setFixedSize(96, 36); m_pInputConfirmBtn->setProperty("isImportant", true); // 创建水平布局并添加确定按钮和å� ä½�符å°�部件 QHBoxLayout* m_pHLayout = new QHBoxLayout(); m_pHLayout->addStretch(); // 添加å� ä½�符å°�部件 m_pHLayout->addWidget(m_pInputConfirmBtn); m_pHLayout->addSpacing(24); // 添加å�³è¾¹æ¡†é—´è·� //进行整体布局 QBoxLayout *m_pVlayout = new QVBoxLayout(m_pInputDevWidget); m_pVlayout->setContentsMargins(0,0,0,0); m_pVlayout->addLayout(labelLayout); // m_pVlayout->addWidget(m_pInputDevLabel); m_pVlayout->addItem(new QSpacerItem(16, 8, QSizePolicy::Fixed)); m_pVlayout->addLayout(hlayout); // 将确定按钮添加到布局中 m_pVlayout->addLayout(m_pHLayout); m_pVlayout->addSpacing(30); // 添加下边框间è·� m_pInputDevWidget->setLayout(m_pVlayout); m_pInputDevWidget->layout()->setContentsMargins(0,0,0,0); //确定按钮,关闭窗å�£ connect(m_pInputConfirmBtn, &QPushButton::clicked, this, &InputDevWidget::closeWindow); //监å�¬dbus 移除输出设备信å�· QDBusConnection::sessionBus().connect(QString(), "/org/ukui/media", "org.ukui.media", "updateDevSignal", this, SLOT(updateInputDev())); } void InputDevWidget::closeWindow() { QWidget* currentWindow = window(); // 获å�–当å‰�窗å�£ if (currentWindow) currentWindow->close(); // 关闭窗å�£ } //移除å­�设备窗å�£ void InputDevWidget::updateInputDev() { //将设备窗å�£ä¸­çš„å­�窗å�£åˆ é™¤ qDeleteAll(subDevWidgets); subDevWidgets.clear(); // 清空列表 devsInputInfo.clear(); //将设备窗å�£ä¸­çš„å­�窗é‡�新刷新一é�� initInputDevWidget(); } //åˆ�始化å­�设备窗å�£ void InputDevWidget::initInputDevWidget() { //获å�–设备函数 getPaDevInfo(); int inputCount = 0; for (const pa_device_port_info &info : devsInputInfo) { if(info.direction == 2) inputCount++; } for (const pa_device_port_info &info : devsInputInfo) { if(info.direction == 2) { qDebug() << "card:" << info.card << "name:" << info.name << "inOrOut" << info.direction << "dsc:" << info.description << "ava:" << info.available << "plugged_stauts" << info.plugged_stauts << "device_description:" << info.device_description << "device_product_name:" << info.device_product_name; QString devLabel = info.description + " (" + info.device_description + ")"; //添加å­�设备到输出设备窗å�£ addSubInputDevWidget(info.card,info.name,devLabel,info.available,inputCount); } } } //添加å­�设备窗å�£ void InputDevWidget::addSubInputDevWidget(int card, QString portName, QString DeviceName, int Available, int itemNum) { //声明一个dev item类,写入声å�¡IDã€�设备å��ã€�label subDevWidget = new SubDevWidget(); //widget显示应用音é‡� QWidget *subDevItemwidget = new QWidget(displayInputDevWidget); subDevItemwidget->setFixedSize(512, 60); subDevItemwidget->setObjectName("subDevItemwidget"); subDevWidget->m_pDeviceNameLabel = new FixLabel(DeviceName, subDevItemwidget); subDevWidget->m_pDevDisableButton = new KSwitchButton(); subDevWidget->m_pDevDisableButton->setObjectName("DevDisableButton"); // 设置字符串属性 subDevWidget->setProperty("card", card); subDevWidget->setProperty("DeviceName", DeviceName); subDevWidget->m_pDevDisableButton->setProperty("card", card); subDevWidget->m_pDevDisableButton->setProperty("portName", portName); subDevWidget->m_pDevDisableButton->setProperty("DeviceName", DeviceName); //判断设备的å�¯ç”¨çжæ€�æ�¥åˆ�始化 button 的选中状æ€� if(Available == 3){ subDevWidget->m_pDevDisableButton->setChecked(false); }else{ subDevWidget->m_pDevDisableButton->setChecked(true); } QHBoxLayout *inputDevControlLayout = new QHBoxLayout(subDevItemwidget); inputDevControlLayout->addItem(new QSpacerItem(16, 20, QSizePolicy::Fixed)); inputDevControlLayout->addWidget(subDevWidget->m_pDeviceNameLabel); inputDevControlLayout->addItem(new QSpacerItem(16, 20, QSizePolicy::Expanding)); inputDevControlLayout->addWidget(subDevWidget->m_pDevDisableButton); inputDevControlLayout->addItem(new QSpacerItem(16, 20, QSizePolicy::Fixed)); inputDevControlLayout->setSpacing(0); subDevItemwidget->setLayout(inputDevControlLayout); subDevItemwidget->layout()->setContentsMargins(0,0,0,0); //设置设备å­�窗体颜色 QString themeName = UKUI_THEME_DEFAULT; if (QGSettings::isSchemaInstalled("org.ukui.style")) { QGSettings *nThemeSetting = new QGSettings("org.ukui.style"); if (nThemeSetting->keys().contains("styleName")) { themeName = nThemeSetting->get("style-name").toString(); } } if (themeName == UKUI_THEME_DEFAULT || themeName == UKUI_THEME_LIGHT) subDevItemwidget->setStyleSheet("#subDevItemwidget{border-radius: 6px; background-color: #F5F5F5;}"); else if (themeName == UKUI_THEME_DARK) subDevItemwidget->setStyleSheet("#subDevItemwidget{border-radius: 6px; background-color: #333333;}"); //设置窗体圆角 subDevItemwidget->setStyleSheet("QWidget { border-radius: 60px; }"); m_pSubDevVlayout->addWidget(subDevItemwidget); displayInputDevWidget->resize(512, itemNum*60); m_pSubDevVlayout->setSpacing(2); m_pSubDevVlayout->setContentsMargins(0,0,0,0); displayInputDevWidget->setLayout(m_pSubDevVlayout); m_pSubDevVlayout->update(); subDevItemwidget->setProperty("label",DeviceName); subDevWidgets.append(subDevItemwidget); // 连接按钮的信å�·ä¸Žæ§½ connectSubDevButton(subDevWidget->m_pDevDisableButton); } //å°†æ¯�个å­�设备窗å�£çš„button进行设备关è�” void InputDevWidget::connectSubDevButton(KSwitchButton *button) { connect(button, &KSwitchButton::stateChanged, [=](bool state) { int card = button->property("card").toInt(); QString portName = button->property("portName").toString(); qDebug() << "connectSubDevButton button" << state << card << portName; #ifdef PA_PORT_AVAILABLE_DISABLE int inputDevState = state? PA_PORT_AVAILABLE_YES : PA_PORT_AVAILABLE_DISABLE; #else int inputDevState = PA_PORT_AVAILABLE_YES; #endif setDevDisable(card, portName, inputDevState); }); } //通过DBUS传输具体设备给pulseaudioæ�¥ç¦�用或开å�¯è®¾å¤‡ void InputDevWidget::setDevDisable(int cardId, QString portName, int inputDevState) { // 创建DBus连接 QDBusConnection connection = QDBusConnection::sessionBus(); // 创建DBus接å�£ QDBusInterface interface("org.PulseAudio.DeviceControl", "/org/pulseaudio/device_control", "org.PulseAudio.DeviceControl", connection); qDebug() << " setDevDisable " << cardId << portName << inputDevState; // 调用DBus方法 QDBusReply response = interface.call("SetDeviceStatus", cardId, portName, inputDevState); qDebug() << response; } //通过DBUS从pulseaudio中获å�–设备信æ�¯ void InputDevWidget::getPaDevInfo() { // 注册自定义结构体类型 qRegisterMetaType("pa_device_port_info"); qDBusRegisterMetaType(); QDBusConnection bus = QDBusConnection::sessionBus(); if (!bus.isConnected()) { qDebug() << "Cannot connect to D-Bus."; return ; } QDBusMessage message = QDBusMessage::createMethodCall("org.PulseAudio.DeviceControl", "/org/pulseaudio/device_control", "org.PulseAudio.DeviceControl", "GetAllDeviceInfo"); QDBusMessage reply = bus.call(message); const QDBusArgument &dbusArgs = reply.arguments().at(0).value().variant().value(); // QList devsInputInfo; dbusArgs.beginArray(); while (!dbusArgs.atEnd()) { pa_device_port_info info; dbusArgs.beginStructure(); dbusArgs >> info.card; dbusArgs >> info.direction; dbusArgs >> info.available; dbusArgs >> info.plugged_stauts; dbusArgs >> info.name; dbusArgs >> info.description; dbusArgs >> info.device_description; dbusArgs >> info.device_product_name; //过滤掉ä¸�å�¯ç”¨ç«¯å�£ if(info.available == PA_PORT_AVAILABLE_NO || info.plugged_stauts == PORT_STAUTS_UNPLUGGED) { dbusArgs.endStructure(); continue; } // dbusArgs >> info; devsInputInfo.push_back(info); dbusArgs.endStructure(); } dbusArgs.endArray(); } QFrame* InputDevWidget::myLine() { QFrame *line = new QFrame(this); line->setMinimumSize(QSize(0, 1)); line->setMaximumSize(QSize(16777215, 1)); line->setLineWidth(0); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); return line; } InputDevWidget::~InputDevWidget() { } /* * Class: SubDevWidget * description: å�•个设备的å­�类,其中会记录声å�¡IDã€�端å�£å��ã€�labelå�� */ SubDevWidget::SubDevWidget(QWidget *parent) { } void SubDevWidget::setLabelText(QString deviceLabel) { this->m_pDeviceNameLabel->setText(deviceLabel); } SubDevWidget::~SubDevWidget() { } ukui-media/audio/audio-device-control/ukmedia_device_control_widget.h0000664000175000017500000001252515170054730025070 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIA_DEVCONTROL_WIDGET_H #define UKMEDIA_DEVCONTROL_WIDGET_H #include "kwidget.h" #include #include #include #include "knavigationbar.h" #include #include #include #include #include #include "kswitchbutton.h" #include #include #include #include #include #include #include #include "../ukui_custom_style.h" #include "../../common/ukmedia_common.h" using namespace kdk; //记录å�•个设备类 class SubDevWidget : public QWidget { Q_OBJECT public: SubDevWidget(QWidget *parent = nullptr); ~SubDevWidget(); friend class OutputDevWidget; friend class InputDevWidget; void setLabelText(QString deviceLabel); private: int cardId; QString devPortName; QString devLabelName; KSwitchButton *m_pDevDisableButton; FixLabel *m_pDeviceNameLabel; public Q_SLOTS: }; //输出设备类 class OutputDevWidget : public QWidget { Q_OBJECT public: OutputDevWidget(QWidget *parent = nullptr); ~OutputDevWidget(); friend class UkmediaDevControlWidget; QFrame *displayOutputDevWidget; //显示å­�设备窗å�£ private: QListWidget *m_pOutputListWidget; //用于存放itemWidget SubDevWidget* subDevWidget; QFrame *m_pOutputDevWidget; //输出设备主窗å�£ QFrame *m_pOutputDevControlWidget; //设备ç¦�用窗å�£ TitleLabel *m_pOutputDevLabel; //标签:输出设备 QScrollArea *outputDevArea; //å�¯åЍæ€�添加的窗å�£åŒºåŸŸ QVBoxLayout *m_pSubDevVlayout; //设备窗å�£çš„动æ€�垂直布局 KSwitchButton *m_pDevDisableButton; //输出设备ç¦�用按钮 QPushButton *m_pOutputConfirmBtn; //“确定â€�按钮 QHBoxLayout *mConfirmBtnHLaout; //按钮布局 QFrame* myLine(); void initOutputDevUi(); void initOutputDevWidget(); //åˆ�始化输出设备页é�¢ void addSubOutputDevWidget(int card, QString portName, QString DeviceName, int Available, int itemNum); void connectSubDevButton(KSwitchButton *button); QList subDevWidgets; // ä¿�å­˜å­�设备窗å�£çš„容器 public Q_SLOTS: void closeWindow(); void updateOutputDev(); //移除å­�设备窗å�£ void setDevDisable(int cardId,QString portName,int devState); //通过DBUSå�‘é€�ä¿¡å�·ç»™pulseaudio,进行设备ç¦�用 void getPaDevInfo(); //通过DBUS从pulseaudio中获å�–设备信æ�¯ }; //输入设备类 class InputDevWidget : public QWidget { Q_OBJECT public: InputDevWidget(QWidget *parent = nullptr); ~InputDevWidget(); friend class UkmediaDevControlWidget; QFrame *displayInputDevWidget; //显示å­�设备窗å�£ private: QListWidget *m_pInputListWidget; //用于存放itemWidget SubDevWidget* subDevWidget; QFrame *m_pInputDevWidget; //输出设备主窗å�£ QFrame *m_pInputDevControlWidget; //设备ç¦�用窗å�£ TitleLabel *m_pInputDevLabel; //标签:输出设备 QScrollArea *inputDevArea; //å�¯åЍæ€�添加的窗å�£åŒºåŸŸ QVBoxLayout *m_pSubDevVlayout; //设备窗å�£çš„动æ€�垂直布局 KSwitchButton *m_pDevDisableButton; //输入设备ç¦�用按钮 QPushButton *m_pInputConfirmBtn; //“确定â€�按钮 QHBoxLayout *mConfirmBtnHLaout; //按钮布局 QFrame* myLine(); void initInputDevUi(); void initInputDevWidget(); //åˆ�始化输出设备页é�¢ void addSubInputDevWidget(int card, QString portName, QString DeviceName, int Available, int itemNum); void connectSubDevButton(KSwitchButton *button); QList subDevWidgets; // ä¿�å­˜å­�设备窗å�£çš„容器 public Q_SLOTS: void closeWindow(); void updateInputDev(); //移除å­�设备窗å�£ void setDevDisable(int cardId,QString portName,int devState); //通过DBUSå�‘é€�ä¿¡å�·ç»™pulseaudio,进行设备ç¦�用 void getPaDevInfo(); //通过DBUS从pulseaudio中获å�–设备信æ�¯ }; //设备管ç�†ä¸»ç±» class UkmediaDevControlWidget : public KWidget { Q_OBJECT enum KNavigationBarPosition { OutputItem = 1, InputItem }; public: explicit UkmediaDevControlWidget(QWidget *parent = nullptr); ~UkmediaDevControlWidget(); private: QFrame *m_pDevControlWidget; KNavigationBar* m_pOutputAndInputBar; OutputDevWidget *outputDevWidget; InputDevWidget *inputDevWidget; void initDevControlWidget(); }; #endif // UKMEDIA_DEVCONTROL_WIDGET_H ukui-media/ukui-volume-control-applet-qt/0000775000175000017500000000000015170054730017401 5ustar fengfengukui-media/ukui-volume-control-applet-qt/ukmedia_osd_display_widget.h0000664000175000017500000000555315170054730025136 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include // Don't include X11 globally to avoid None macro conflict // #include #include #include #include #include #include #include "windowmanager/windowmanager.h" #include "ukuistylehelper/ukuistylehelper.h" #define OSDWIDGET_SIZE 92,92 #define ICON_SIZE 48,48 #define TRANSPARENCY "org.ukui.control-center.personalise" #define THEME "org.ukui.style" //任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ #define PANEL_SETTINGS "org.ukui.panel.settings" #define PANEL_SIZE_KEY "panelsize" #define PANEL_POSITION_KEY "panelposition" class UkmediaOsdDisplayWidget : public QWidget { Q_OBJECT enum PanelPosition{ Bottom = 0, //!< The bottom side of the screen. Top, //!< The top side of the screen. Left, //!< The left side of the screen. Right //!< The right side of the screen. }; public: UkmediaOsdDisplayWidget(QWidget *parent = nullptr); ~UkmediaOsdDisplayWidget(); friend class DeviceSwitchWidget; void initAttribute(); void initGsettings(); void initPanelGSettings(); QRect caculatePosition(); //任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ void geometryChangedHandle(); void setIcon(QString iconStr); void dialogShow(); QTimer *mTimer; QLabel *iconLabel; QString mIconName; QGSettings *m_pThemeSetting; QPixmap drawLightColoredPixmap(const QPixmap &source, const QString &style); public Q_SLOTS: void repaintWidget(); void timeoutHandle(); void ukuiThemeChangedSlot(const QString &themeStr); double getGlobalOpacity(); private: QFrame *m_frame; QGSettings *m_panelGSettings = nullptr; int m_panelPosition; int m_panelSize; protected: void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent* event); }; #endif // UKMEDIAOSDDISPLAYWIDGET_H ukui-media/ukui-volume-control-applet-qt/config.h0000664000175000017500000000220415170054730021015 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include "xatom/xatom-helper.h" #include #include #include UkmediaOsdDisplayWidget::UkmediaOsdDisplayWidget(QWidget *parent) : QWidget (parent) { setFixedSize(OSDWIDGET_SIZE); m_frame = new QFrame(this); m_frame->setFixedSize(QSize(72,72)); m_frame->move(10,10); iconLabel = new QLabel(m_frame); iconLabel->setFixedSize(QSize(ICON_SIZE)); iconLabel->move((m_frame->width() - iconLabel->width())/2,( m_frame->height() - iconLabel->height())/2); initGsettings(); initAttribute(); initPanelGSettings(); } /** * @brief UkmediaOsdDisplayWidget::initAttribute * åˆ�始化界é�¢å±žæ€§ */ void UkmediaOsdDisplayWidget::initAttribute() { mTimer = new QTimer(); connect(mTimer,SIGNAL(timeout()),this,SLOT(timeoutHandle())); connect(QApplication::primaryScreen(), &QScreen::geometryChanged, this, &UkmediaOsdDisplayWidget::geometryChangedHandle); connect(static_cast(QCoreApplication::instance()), &QApplication::primaryScreenChanged, this, &UkmediaOsdDisplayWidget::geometryChangedHandle); setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::Popup); setAttribute(Qt::WA_TranslucentBackground,true); setAutoFillBackground(true); } /** * @brief UkmediaOsdDisplayWidget::initGsettings * åˆ�始化é…�置文件 */ void UkmediaOsdDisplayWidget::initGsettings() { if (QGSettings::isSchemaInstalled(THEME)) { m_pThemeSetting = new QGSettings(THEME); connect(m_pThemeSetting, &QGSettings::changed, this, &UkmediaOsdDisplayWidget::ukuiThemeChangedSlot); } } void UkmediaOsdDisplayWidget::initPanelGSettings() { const QByteArray id(PANEL_SETTINGS); if (QGSettings::isSchemaInstalled(id)) { if (m_panelGSettings == nullptr) { m_panelGSettings = new QGSettings(id); } if (m_panelGSettings->keys().contains(PANEL_POSITION_KEY)) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (m_panelGSettings->keys().contains(PANEL_SIZE_KEY)) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } connect(m_panelGSettings, &QGSettings::changed, this, [&] (const QString &key) { if (key == PANEL_POSITION_KEY) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (key == PANEL_SIZE_KEY) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } if (this->isVisible()) { geometryChangedHandle(); } }); } } QRect UkmediaOsdDisplayWidget::caculatePosition() { QRect availableGeo = QGuiApplication::screenAt(QCursor::pos())->geometry(); int x, y; int margin = 8; switch (m_panelPosition) { case PanelPosition::Top: { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + m_panelSize + margin; } break; case PanelPosition::Bottom: { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + availableGeo.height() - m_panelSize - this->height() - margin; } break; case PanelPosition::Left: { x = availableGeo.x() + m_panelSize + margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; case PanelPosition::Right: { x = availableGeo.x() + availableGeo.width() - m_panelSize - this->width() - margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; } return QRect(x, y, this->width(), this->height()); } /** * @brief UkmediaOsdDisplayWidget::dialogShow * 弹出窗å�£ */ void UkmediaOsdDisplayWidget::dialogShow() { geometryChangedHandle(); repaintWidget(); show(); mTimer->start(2000); } /** * @brief UkmediaOsdDisplayWidget::timeoutHandle * è¶…æ—¶éš�è—�窗å�£ */ void UkmediaOsdDisplayWidget::timeoutHandle() { hide(); mTimer->stop(); } /** * @brief UkmediaOsdDisplayWidget::setIcon * 设置弹窗图标 */ void UkmediaOsdDisplayWidget::setIcon(QString iconStr) { mIconName.clear(); mIconName = iconStr; } /** * @brief UkmediaOsdDisplayWidget::repaintWidget * é‡�绘窗å�£ */ void UkmediaOsdDisplayWidget::repaintWidget() { if(m_pThemeSetting->get("style-name").toString() == "ukui-light"){ setPalette(QPalette(QColor("#F5F5F5")));//设置窗å�£èƒŒæ™¯ } else{ setPalette(QPalette(QColor("#232426")));//设置窗å�£èƒŒæ™¯è‰² } QPixmap m_pixmap = QIcon::fromTheme(mIconName).pixmap(QSize(48,48)); iconLabel->setPixmap(drawLightColoredPixmap(m_pixmap,m_pThemeSetting->get("style-name").toString())); } /** * @brief UkmediaOsdDisplayWidget::ukuiThemeChangedSlot * æ›´æ�¢ç³»ç»Ÿä¸»é¢˜è‡ªåŠ¨åˆ·æ–°ç•Œé�¢ */ void UkmediaOsdDisplayWidget::ukuiThemeChangedSlot(const QString &themeStr) { if (!this->isHidden()) { hide(); repaintWidget(); geometryChangedHandle(); show(); } } /** * @brief UkmediaOsdDisplayWidget::getGlobalOpacity * 获å�–系统é€�明度 */ double UkmediaOsdDisplayWidget::getGlobalOpacity() { double transparency=0.0; if(QGSettings::isSchemaInstalled(TRANSPARENCY)) { QGSettings gsetting(TRANSPARENCY); if(gsetting.keys().contains(QString("transparency"))) transparency=gsetting.get("transparency").toDouble(); } return transparency; } QT_BEGIN_NAMESPACE extern void qt_blurImage(QImage &blurImage, qreal radius, bool quality, int transposed); QT_END_NAMESPACE QPixmap UkmediaOsdDisplayWidget::drawLightColoredPixmap(const QPixmap &source, const QString &style) { int value = 255; if(style == "ukui-light"){ value = 0; } QColor gray(255,255,255); QColor standard (0,0,0); QImage img = source.toImage(); for (int x = 0; x < img.width(); x++) { for (int y = 0; y < img.height(); y++) { auto color = img.pixelColor(x, y); if (color.alpha() > 0) { if (qAbs(color.red()-gray.red())<20 && qAbs(color.green()-gray.green())<20 && qAbs(color.blue()-gray.blue())<20) { color.setRed(value); color.setGreen(value); color.setBlue(value); img.setPixelColor(x, y, color); } else { color.setRed(value); color.setGreen(value); color.setBlue(value); img.setPixelColor(x, y, color); } } } } return QPixmap::fromImage(img); } void UkmediaOsdDisplayWidget::geometryChangedHandle() { QRect rect = caculatePosition(); QString platform = QGuiApplication::platformName(); if (!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ this->setGeometry(QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); } else { kdk::WindowManager::setGeometry(this->windowHandle(), QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); } } void UkmediaOsdDisplayWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); QPainterPath rectPath; rectPath.addRoundedRect(this->rect().adjusted(10, 10, -10, -10), 12, 12); //画一个黑底 QPixmap pixmap(this->rect().size()); pixmap.fill(Qt::transparent); QPainter pixmapPainter(&pixmap); pixmapPainter.setRenderHint(QPainter::Antialiasing); pixmapPainter.setPen(Qt::transparent); pixmapPainter.setBrush(Qt::black); pixmapPainter.setOpacity(0.20); pixmapPainter.drawPath(rectPath); pixmapPainter.end(); //模糊这个黑底 QImage img = pixmap.toImage(); qt_blurImage(img, 8, false, false); //挖掉中心 pixmap = QPixmap::fromImage(img); QPainter pixmapPainter2(&pixmap); pixmapPainter2.setRenderHint(QPainter::Antialiasing); pixmapPainter2.setCompositionMode(QPainter::CompositionMode_Clear); pixmapPainter2.setPen(Qt::transparent); pixmapPainter2.setBrush(Qt::transparent); pixmapPainter2.drawPath(rectPath); //绘制阴影 painter.drawPixmap(this->rect(), pixmap, pixmap.rect()); //绘制æ��è¾¹ QPainterPath linePath; linePath.addRoundedRect(QRect(9, 9, m_frame->width()+1, m_frame->height()+1), 12, 12); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::white); painter.setBrush(Qt::transparent); painter.setOpacity(0.20); painter.drawPath(linePath); //毛玻璃 qreal opacity = getGlobalOpacity(); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::transparent); painter.setBrush(this->palette().base()); painter.setOpacity(opacity); painter.drawPath(linePath); // KWindowEffects API changed in KF6, use QWindow* instead of WId // KWindowEffects::enableBlurBehind(this->winId(), true, // QRegion(linePath.toFillPolygon().toPolygon())); QWidget::paintEvent(event); } void UkmediaOsdDisplayWidget::resizeEvent(QResizeEvent* event) { // iconLabel->move((width() - iconLabel->width())/2,(height() - iconLabel->height())/2); QWidget::resizeEvent(event); } UkmediaOsdDisplayWidget::~UkmediaOsdDisplayWidget() { delete mTimer; mTimer = nullptr; } ukui-media/ukui-volume-control-applet-qt/ukmedia_volume_slider.cpp0000664000175000017500000003033315170052044024453 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include //DisplayerMode displayMode = MINI_MODE; //SwitchButtonState buttonState = SWITCH_BUTTON_NORMAL; //extern double transparency; //UkuiApplicationWidget::UkuiApplicationWidget(QWidget *parent) //{ //// this->setAttribute(Qt::WA_TranslucentBackground); //// this->setStyleSheet("QWiget{background:rgba(0,0,0,0);}"); // Q_UNUSED(parent); //} //UkuiMediaSliderTipLabel::UkuiMediaSliderTipLabel(){ // setAttribute(Qt::WA_TranslucentBackground); //} //UkuiMediaSliderTipLabel::~UkuiMediaSliderTipLabel(){ //} //void UkuiApplicationWidget::paintEvent(QPaintEvent *e) //{ // QStyleOption opt; // opt.init(this); // QPainter p(this); //// double transparence = transparency * 255; //// QColor color = palette().color(QPalette::Base); //// color.setAlpha(transparence); // QBrush brush = QBrush(QColor(0,0,0,0)); // p.setBrush(brush); //// p.setBrush(this->palette().base()); //// p.setBrush(QBrush(QColor(19, 19, 20, 0))); // p.setPen(Qt::NoPen); // QPainterPath path; // opt.rect.adjust(0,0,0,0); // path.addRoundedRect(opt.rect,0,0); // p.setRenderHint(QPainter::Antialiasing); // å��锯齿; // p.drawRoundedRect(opt.rect,0,0); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); //} //UkuiApplicationWidget::~UkuiApplicationWidget() //{ //} //void UkuiMediaSliderTipLabel::paintEvent(QPaintEvent *e) //{ // QStyleOptionFrame opt; // initStyleOption(&opt); // QStylePainter p(this); //// p.setBrush(QBrush(QColor(0x1A,0x1A,0x1A,0x4C))); // p.setBrush(QBrush(QColor(0xFF,0xFF,0xFF,0x00))); // p.setPen(Qt::NoPen); // p.drawRoundedRect(this->rect(), 1, 1); // QPainterPath path; // path.addRoundedRect(opt.rect,6,6); // p.setRenderHint(QPainter::Antialiasing); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // p.drawPrimitive(QStyle::PE_PanelTipLabel, opt); // this->setProperty("blurRegion", QRegion(QRect(0, 0, 1, 1))); // QLabel::paintEvent(e); //} //UkuiMediaButton::UkuiMediaButton(QWidget *parent) //{ // Q_UNUSED(parent); // this->setFixedSize(36,36); //} //UkuiMediaButton::~UkuiMediaButton() //{ //} ///*! // * \brief // * \details // * 绘制窗体的颜色å�Šåœ†è§’ // */ ////void UkuiMediaButton::paintEvent(QPaintEvent *event) ////{ //// QStyleOptionComplex opt; //// opt.init(this); //// QPainter p(this); ////// double transparence = transparency * 255; //// p.setBrush(this->palette().base()); //// p.setPen(Qt::NoPen); //// QPainterPath path; //// opt.rect.adjust(0,0,0,0); //// path.addRoundedRect(opt.rect,6,6); //// p.setRenderHint(QPainter::Antialiasing); // å��锯齿; //// p.drawRoundedRect(opt.rect,6,6); //// setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); ////// style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); //// style()->drawComplexControl(QStyle::CC_ToolButton,&opt,&p,this); ////} //void UkuiMediaButton::enterEvent(QEvent *event) //{ // buttonState = SWITCH_BUTTON_HOVER; //} //void UkuiMediaButton::leaveEvent(QEvent *event) //{ // buttonState = SWITCH_BUTTON_NORMAL; //} //void UkuiMediaButton::mouseMoveEvent(QMouseEvent *e) //{ // buttonState = SWITCH_BUTTON_HOVER; // QPushButton::mouseMoveEvent(e); //} //void UkuiMediaButton::mousePressEvent(QMouseEvent *e) //{ // buttonState = SWITCH_BUTTON_PRESS; // if (displayMode == MINI_MODE) { // Q_EMIT moveMiniSwitchBtnSignale(); // this->setFixedSize(34,34); // QSize iconSize(14,14); // this->setIconSize(iconSize); // this->setIcon(QIcon("/usr/share/ukui-media/img/complete-module.svg")); // } // else { // this->setFixedSize(34,34); // QSize iconSize(14,14); // this->setIconSize(iconSize); // this->setIcon(QIcon("/usr/share/ukui-media/img/mini-module.svg")); // Q_EMIT moveAdvanceSwitchBtnSignal(); // } // QPushButton::mousePressEvent(e); //} //void UkuiMediaButton::mouseReleaseEvent(QMouseEvent *e) //{ // buttonState = SWITCH_BUTTON_NORMAL; // if (displayMode == MINI_MODE) { // Q_EMIT miniToAdvanceSignal(); // this->setFixedSize(36,36); // QSize iconSize(16,16); // this->setIconSize(iconSize); // this->setIcon(QIcon("/usr/share/ukui-media/img/complete-module.svg")); // } // else { // Q_EMIT advanceToMiniSignal(); // this->setFixedSize(36,36); // QSize iconSize(16,16); // this->setIconSize(iconSize); // qDebug() << "设置图标2"; // this->setIcon(QIcon("/usr/share/ukui-media/img/mini-module.svg")); // } // QPushButton::mouseReleaseEvent(e); //} //UkmediaVolumeSlider::UkmediaVolumeSlider(QWidget *parent,bool needTip) //{ // Q_UNUSED(parent); // if (needTip) { // state = needTip; // m_pTiplabel = new UkuiMediaSliderTipLabel(); // m_pTiplabel->setWindowFlags(Qt::ToolTip); // // qApp->installEventFilter(new AppEventFilter(this)); // m_pTiplabel->setFixedSize(52,30); // m_pTiplabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // } //} //void UkmediaVolumeSlider::mousePressEvent(QMouseEvent *ev) //{ // mousePress = true; // Q_EMIT silderPressSignal(); // if (state) { // m_pTiplabel->show(); // } // //注æ„�应先调用父类的鼠标点击处ç�†äº‹ä»¶ï¼Œè¿™æ ·å�¯ä»¥ä¸�å½±å“�拖动的情况 // QSlider::mousePressEvent(ev); // //获å�–鼠标的ä½�置,这里并ä¸�能直接从ev中å�–值(因为如果是拖动的è¯�,鼠标开始点击的ä½�置没有æ„�义了) // double pos = ev->pos().x() / (double)width(); // setValue(pos *(maximum() - minimum()) + minimum()); // //å�‘父窗å�£å�‘é€�自定义事件event type,这样就å�¯ä»¥åœ¨çˆ¶çª—å�£ä¸­æ�•获这个事件进行处ç�† // QEvent evEvent(static_cast(QEvent::User + 1)); // QCoreApplication::sendEvent(parentWidget(), &evEvent); // QSlider::mousePressEvent(ev); //} //void UkmediaVolumeSlider::mouseReleaseEvent(QMouseEvent *e) //{ // if(mousePress){ // Q_EMIT silderReleaseSignal(); // } // mousePress = false; // QSlider::mouseReleaseEvent(e); //} //void UkmediaVolumeSlider::initStyleOption(QStyleOptionSlider *option) //{ // QSlider::initStyleOption(option); //} //void UkmediaVolumeSlider::leaveEvent(QEvent *e) //{ // if (state) { // m_pTiplabel->hide(); // } //} //void UkmediaVolumeSlider::enterEvent(QEvent *e) //{ // if (state) { // m_pTiplabel->show(); // } //} //void UkmediaVolumeSlider::paintEvent(QPaintEvent *e) //{ // QRect rect; // QStyleOptionSlider m_option; // QSlider::paintEvent(e); // if (state) { // this->initStyleOption(&m_option); // rect = this->style()->subControlRect(QStyle::CC_Slider, &m_option,QStyle::SC_SliderHandle,this); // QPoint gPos = this->mapToGlobal(rect.topLeft()); // QString percent; // percent = QString::number(this->value()); // percent.append("%"); // m_pTiplabel->setText(percent); // m_pTiplabel->move(gPos.x()-(m_pTiplabel->width()/2)+9,gPos.y()-m_pTiplabel->height()-1); // } //} //UkmediaVolumeSlider::~UkmediaVolumeSlider() //{ // delete m_pTiplabel; //} //void UkuiButtonDrawSvg::init(QImage img, QColor color) //{ // themeIcon.image = img; // themeIcon.color = color; //} //void UkuiButtonDrawSvg::paintEvent(QPaintEvent *event) //{ // QStyleOption opt; // opt.init(this); // QPainter p(this); // p.setBrush(QBrush(QColor(0x13,0x13,0x14,0x00))); // p.setPen(Qt::NoPen); // QPainterPath path; // opt.rect.adjust(0,0,0,0); // path.addRoundedRect(opt.rect,6,6); // p.setRenderHint(QPainter::Antialiasing); // å��锯齿; // p.drawRoundedRect(opt.rect,6,6); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); //} //QRect UkuiButtonDrawSvg::IconGeometry() //{ // QRect res = QRect(QPoint(0,0),QSize(24,24)); // res.moveCenter(QRect(0,0,width(),height()).center()); // return res; //} //void UkuiButtonDrawSvg::draw(QPaintEvent* e) //{ // Q_UNUSED(e); // QPainter painter(this); // QRect iconRect = IconGeometry(); // if (themeIcon.image.size() != iconRect.size()) // { // themeIcon.image = themeIcon.image.scaled(iconRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); // QRect r = themeIcon.image.rect(); // r.moveCenter(iconRect.center()); // iconRect = r; // } // this->setProperty("fillIconSymbolicColor", true); // filledSymbolicColoredPixmap(themeIcon.image,themeIcon.color); // painter.drawImage(iconRect, themeIcon.image); //} //bool UkuiButtonDrawSvg::event(QEvent *event) //{ // switch (event->type()) // { // case QEvent::Paint: // draw(static_cast(event)); // break; // case QEvent::Move: // case QEvent::Resize: // { // QRect rect = IconGeometry(); // } // break; // case QEvent::MouseButtonPress: // case QEvent::MouseButtonRelease: // case QEvent::MouseButtonDblClick: // event->accept(); // break; // default: // break; // } // return QPushButton::event(event); //} //UkuiButtonDrawSvg::UkuiButtonDrawSvg(QWidget *parent) //{ // Q_UNUSED(parent); //} //UkuiButtonDrawSvg::~UkuiButtonDrawSvg() //{ //} //QPixmap UkuiButtonDrawSvg::filledSymbolicColoredPixmap(QImage &img, QColor &baseColor) //{ // for (int x = 0; x < img.width(); x++) { // for (int y = 0; y < img.height(); y++) { // auto color = img.pixelColor(x, y); // if (color.alpha() > 0) { // int hue = color.hue(); // if (!qAbs(hue - symbolic_color.hue()) < 10) { // color.setRed(baseColor.red()); // color.setGreen(baseColor.green()); // color.setBlue(baseColor.blue()); // img.setPixelColor(x, y, color); // } // } // } // } // return QPixmap::fromImage(img); //} //UkuiScrollArea::UkuiScrollArea(QWidget *parent){ //} //UkuiScrollArea::~UkuiScrollArea(){ //} //void UkuiScrollArea::paintEvent(QPaintEvent *event) //{ // QStyleOption opt; // opt.init(this); // QPainter p(this); // p.setBrush(this->palette().base()); // p.setPen(Qt::NoPen); // QPainterPath path; // opt.rect.adjust(0,0,0,0); // path.addRoundedRect(opt.rect,6,6); // p.setRenderHint(QPainter::Antialiasing); // å��锯齿; // p.drawRoundedRect(opt.rect,6,6); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); //// QWidget::paintEvent(event); //} //UkuiQMenu::UkuiQMenu(){ //} //bool UkuiQMenu::event(QEvent *e) //{ // qDebug() << "事件类型" << e->type() << "show"; // if (e->type() == QEvent::ContextMenu) { // this->show(); // } // else if (e->type() == QEvent::WinIdChange) { // qDebug() << "winid changed"; // } // else if(e->type() == QEvent::MouseButtonRelease) { //// this->hide(); // qDebug() << "事件类型" << e->type(); // } // return QMenu::event(e); //} //void UkuiQMenu::hideEvent(QHideEvent *e) //{ // this->activateWindow(); // this->setAttribute(Qt::WA_NoMouseReplay); // qDebug() << "è�œå�•éš�è—�" << e->type(); //} //UkuiQMenu::~UkuiQMenu(){ //} ukui-media/ukui-volume-control-applet-qt/ukmedia_system_volume_widget.h0000664000175000017500000000334715170054730025536 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include "ukmedia_custom_class.h" #include "../common/ukmedia_common.h" class UkmediaSystemVolumeWidget : public QWidget { Q_OBJECT public: explicit UkmediaSystemVolumeWidget(QWidget *parent = nullptr); friend class UkmediaMainWidget; void setVolumeSliderRange(bool status); private: void setLabelAlignment(Qt::Alignment alignment); Q_SIGNALS: private: QListWidget *m_pInputListWidget; QListWidget *m_pOutputListWidget; QLabel *m_pOutputLabel; QWidget *m_pSysSliderWidget; QLabel *m_pSystemVolumeLabel; AudioSlider *m_pSystemVolumeSlider; QLabel *m_pSystemVolumeSliderLabel; QFrame *volumeSettingFrame; UkuiSettingButton *volumeSettingButton; QPushButton *m_pSystemVolumeBtn; public Q_SLOTS: void onPaletteChanged(); }; #endif // UKMEDIASYSTEMVOLUMEWIDGET_H ukui-media/ukui-volume-control-applet-qt/xatom/0000775000175000017500000000000015170054730020531 5ustar fengfengukui-media/ukui-volume-control-applet-qt/xatom/xatom-helper.cpp0000664000175000017500000001374015170054730023647 0ustar fengfeng/* * KWin Style UKUI * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the 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 . * * Authors: Yue Lan * */ #include "xatom-helper.h" #include #include #include #include static XAtomHelper *global_instance = nullptr; static Display *g_display = nullptr; XAtomHelper *XAtomHelper::getInstance() { if(!global_instance) global_instance = new XAtomHelper; return global_instance; } bool XAtomHelper::isFrameLessWindow(int winId) { auto hints = getInstance()->getWindowMotifHint(winId); if(hints.flags == MWM_HINTS_DECORATIONS && hints.functions == 1) { return true; } return false; } bool XAtomHelper::isWindowDecorateBorderOnly(int winId) { return isWindowMotifHintDecorateBorderOnly(getInstance()->getWindowMotifHint(winId)); } bool XAtomHelper::isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint) { bool isDeco = false; if(hint.flags & MWM_HINTS_DECORATIONS && hint.flags != MWM_HINTS_DECORATIONS) { if(hint.decorations == MWM_DECOR_BORDER) isDeco = true; } return isDeco; } bool XAtomHelper::isUKUICsdSupported() { // fixme: return false; } bool XAtomHelper::isUKUIDecorationWindow(int winId) { if(m_ukuiDecorationAtion == None) return false; Atom type; int format; ulong nitems; ulong bytes_after; uchar *data; bool isUKUIDecoration = false; XGetWindowProperty(g_display, winId, m_ukuiDecorationAtion, 0, LONG_MAX, false, m_ukuiDecorationAtion, &type, &format, &nitems, &bytes_after, &data); if(type == m_ukuiDecorationAtion) { if(nitems == 1) { isUKUIDecoration = data[0]; } } return isUKUIDecoration; } UnityCorners XAtomHelper::getWindowBorderRadius(int winId) { UnityCorners corners; Atom type; int format; ulong nitems; ulong bytes_after; uchar *data; if(m_unityBorderRadiusAtom != None) { XGetWindowProperty(g_display, winId, m_unityBorderRadiusAtom, 0, LONG_MAX, false, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &data); if(type == XA_CARDINAL) { if(nitems == 4) { corners.topLeft = static_cast(data[0]); corners.topRight = static_cast(data[1 * sizeof(ulong)]); corners.bottomLeft = static_cast(data[2 * sizeof(ulong)]); corners.bottomRight = static_cast(data[3 * sizeof(ulong)]); } XFree(data); } } return corners; } void XAtomHelper::setWindowBorderRadius(int winId, const UnityCorners &data) { if(m_unityBorderRadiusAtom == None) return; ulong corners[4] = {data.topLeft, data.topRight, data.bottomLeft, data.bottomRight}; XChangeProperty(g_display, winId, m_unityBorderRadiusAtom, XA_CARDINAL, 32, PropModeReplace, (const unsigned char *) &corners, sizeof(corners) / sizeof(corners[0])); } void XAtomHelper::setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight) { if(m_unityBorderRadiusAtom == None) return; ulong corners[4] = {(ulong)topLeft, (ulong)topRight, (ulong)bottomLeft, (ulong)bottomRight}; XChangeProperty(g_display, winId, m_unityBorderRadiusAtom, XA_CARDINAL, 32, PropModeReplace, (const unsigned char *) &corners, sizeof(corners) / sizeof(corners[0])); } void XAtomHelper::setUKUIDecoraiontHint(int winId, bool set) { if(m_ukuiDecorationAtion == None) return; XChangeProperty(g_display, winId, m_ukuiDecorationAtion, m_ukuiDecorationAtion, 32, PropModeReplace, (const unsigned char *) &set, 1); } void XAtomHelper::setWindowMotifHint(int winId, const MotifWmHints &hints) { if(m_unityBorderRadiusAtom == None) return; XChangeProperty(g_display, winId, m_motifWMHintsAtom, m_motifWMHintsAtom, 32, PropModeReplace, (const unsigned char *)&hints, sizeof(MotifWmHints) / sizeof(ulong)); } MotifWmHints XAtomHelper::getWindowMotifHint(int winId) { MotifWmHints hints; if(m_unityBorderRadiusAtom == None) return hints; uchar *data; Atom type; int format; ulong nitems; ulong bytes_after; XGetWindowProperty(g_display, winId, m_motifWMHintsAtom, 0, sizeof(MotifWmHints) / sizeof(long), false, AnyPropertyType, &type, &format, &nitems, &bytes_after, &data); if(type == None) { return hints; } else { hints = *(MotifWmHints *)data; XFree(data); } return hints; } XAtomHelper::XAtomHelper(QObject *parent) : QObject(parent) { // Open X11 display if not already open if(!g_display) { g_display = XOpenDisplay(nullptr); } if(!g_display) return; m_motifWMHintsAtom = XInternAtom(g_display, "_MOTIF_WM_HINTS", true); m_unityBorderRadiusAtom = XInternAtom(g_display, "_UNITY_GTK_BORDER_RADIUS", false); m_ukuiDecorationAtion = XInternAtom(g_display, "_KWIN_UKUI_DECORAION", false); } Atom XAtomHelper::registerUKUICsdNetWmSupportAtom() { // fixme: return None; } void XAtomHelper::unregisterUKUICsdNetWmSupportAtom() { // fixme: } ukui-media/ukui-volume-control-applet-qt/xatom/xatom-helper.h0000664000175000017500000000631315170054730023312 0ustar fengfeng/* * KWin Style UKUI * * Copyright (C) 2020, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the 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 . * * Authors: Yue Lan * */ #ifndef XATOMHELPER_H #define XATOMHELPER_H #include #include #include struct UnityCorners { ulong topLeft = 0; ulong topRight = 0; ulong bottomLeft = 0; ulong bottomRight = 0; }; typedef struct { ulong flags = 0; ulong functions = 0; ulong decorations = 0; long input_mode = 0; ulong status = 0; } MotifWmHints, MwmHints; #define MWM_HINTS_FUNCTIONS (1L << 0) #define MWM_HINTS_DECORATIONS (1L << 1) #define MWM_HINTS_INPUT_MODE (1L << 2) #define MWM_HINTS_STATUS (1L << 3) #define MWM_FUNC_ALL (1L << 0) #define MWM_FUNC_RESIZE (1L << 1) #define MWM_FUNC_MOVE (1L << 2) #define MWM_FUNC_MINIMIZE (1L << 3) #define MWM_FUNC_MAXIMIZE (1L << 4) #define MWM_FUNC_CLOSE (1L << 5) #define MWM_DECOR_ALL (1L << 0) #define MWM_DECOR_BORDER (1L << 1) #define MWM_DECOR_RESIZEH (1L << 2) #define MWM_DECOR_TITLE (1L << 3) #define MWM_DECOR_MENU (1L << 4) #define MWM_DECOR_MINIMIZE (1L << 5) #define MWM_DECOR_MAXIMIZE (1L << 6) #define MWM_INPUT_MODELESS 0 #define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 #define MWM_INPUT_SYSTEM_MODAL 2 #define MWM_INPUT_FULL_APPLICATION_MODAL 3 #define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL #define MWM_TEAROFF_WINDOW (1L<<0) namespace UKUI { class Decoration; } class XAtomHelper : public QObject { // friend class UKUI::Decoration; Q_OBJECT public: static XAtomHelper *getInstance(); static bool isFrameLessWindow(int winId); static bool isWindowDecorateBorderOnly(int winId); static bool isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint); bool isUKUICsdSupported(); bool isUKUIDecorationWindow(int winId); UnityCorners getWindowBorderRadius(int winId); void setWindowBorderRadius(int winId, const UnityCorners &data); void setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight); void setUKUIDecoraiontHint(int winId, bool set = true); void setWindowMotifHint(int winId, const MotifWmHints &hints); MotifWmHints getWindowMotifHint(int winId); private: explicit XAtomHelper(QObject *parent = nullptr); Atom registerUKUICsdNetWmSupportAtom(); void unregisterUKUICsdNetWmSupportAtom(); Atom m_motifWMHintsAtom = None; Atom m_unityBorderRadiusAtom = None; Atom m_ukuiDecorationAtion = None; }; #endif // XATOMHELPER_H ukui-media/ukui-volume-control-applet-qt/xatom/xatom.pri0000664000175000017500000000015115170052044022366 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/xatom-helper.h \ SOURCES += \ $$PWD/xatom-helper.cpp \ ukui-media/ukui-volume-control-applet-qt/translations/0000775000175000017500000000000015170054730022122 5ustar fengfengukui-media/ukui-volume-control-applet-qt/translations/ky.ts0000664000175000017500000005644315170054730023131 0ustar fengfeng ApplicationVolumeWidget Application Volume ۅتۉنۉچ جاسوو ،اتقارۇۇ Û…Ù„Ú†Û…Ù…Û‰ System Volume ساامالىق وبونۇ Sound Settings دووش تەڭشەكتەرى DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference(S) 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe() جەڭىلۉۉ بولدۇ pa_context_get_card_info_list() failed pa_context_get_card_info_list() جەڭىلۉۉ بولدۇ pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() جەڭىلۉۉ بولدۇ pa_context_get_source_info_list() failed pa_context_get_source_info_list() جەڭىلۉۉ بولدۇ Failed to initialize stream_restore extension: %s stream_restore ئۇزارتىشنى باشلىمىدى: %s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() جەڭىلۉۉ بولدۇ pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() جەڭىلۉۉ بولدۇ pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() جەڭىلۉۉ بولدۇ pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() جەڭىلۉۉ بولدۇ Card callback failure كارتوچكا قايتۇرۇۋىلىنىش جەڭىلۉۉ بولدۇ Sink callback failure چۆككىگە كەتىرىش جەڭىلۉۉ بولۇش Source callback failure قاينارىدان قايتۇرۇۋىلىنىش جەڭىلۉۉ بولدۇ Fatal Error: Unable to connect to PulseAudio ماڭىزدۇۇ قاتاالىق : PulseAudio عا ۇلانا البادى pa_context_get_server_info() failed pa_context_get_server_info() اتقارماق جاسوو ،اتقارۇۇ جەڭىلۉۉ بولدۇ Sink input callback failure چۆكمە قايتما كىرگىزۉۉ جەڭىلۉۉ بولدۇ Source output callback failure ÙƒÛ•Ù„Û‰Û‰ جەر جانى ۅندۉرۉش قايتما تەڭشۅۅ جەڭىلۉۉ بولدۇ Client callback failure تىرمىنال قايتما تەڭشەگى جەڭىلۉۉ بولدۇ Server info callback failure مۇلازىمەتىر ۇچۇردۇ قايتارىپ الۇۇ جەڭىلۉۉ بولدۇ Failed to initialize device restore extension: %s اسپاپتى العاچىنا گەلتىرىشتى گەڭەيتىش باشتالبادى: %s pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() جەڭىلۉۉ بولدۇ Failed to initialize device manager extension: %s شايمان باشقارعىچتى كەڭەيتۉۉنۉ قوزعوتۇۇ جەڭىلۉۉ بولدۇ : %s pa_ext_device_manager_read() failed pa_ext_device_manager_read() جەڭىلۉۉ بولدۇ pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() جەڭىلۉۉ بولدۇ pa_context_get_client_info() failed pa_context_get_client_info() جەڭىلۉۉ بولدۇ pa_context_client_info_list() failed pa_context_client_info_list() جەڭىلۉۉ بولدۇ pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() جەڭىلۉۉ بولدۇ pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() جەڭىلۉۉ بولدۇ moduleInfoCb callback failure moduleInfoCb چاقىرۇۇ جەڭىلۉۉ بولدۇ Ukui Media Volume Control Ukui Media دووش كونتىرول جاسوو ،اتقارۇۇ pa_context_load_module() failed pa_context_load_module() جەڭىلۉۉ بولدۇ ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control ۅندۉرۉش Û…Ù„Ú†Û…Ù…Û‰Ù† تىزگىندۅۅ جاسوو ،اتقارۇۇ Mute é�™éŸ³ Sound preference(S) دووش مايىللىقى(س) System Volume ساامالىق وبونۇ App Volume ئەپ وبونۇ Current volume: گەزەكتەكى دووش: UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume دووش Output ۅندۉرۉش Sound Settings دووش تەڭشەكتەرى UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index() جەڭىلۉۉ بولدۇ pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() جەڭىلۉۉ بولدۇ pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() جەڭىلۉۉ بولدۇ pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() جەڭىلۉۉ بولدۇ pa_context_move_sink_input_by_index() failed pa_context_move_sink_input_by_index() جەڭىلۉۉ بولدۇ pa_context_move_source_output_by_name() failed pa_context_move_source_output_by_name() جەڭىلۉۉ بولدۇ pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() جەڭىلۉۉ بولدۇ pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() جەڭىلۉۉ بولدۇ pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() جەڭىلۉۉ بولدۇ pa_context_set_default_sink() failed pa_context_set_default_sink() جەڭىلۉۉ بولدۇ pa_context_set_default_source() failed pa_context_set_default_source() جەڭىلۉۉ بولدۇ pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() جەڭىلۉۉ بولدۇ pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() جەڭىلۉۉ بولدۇ pa_context_kill_sink_input() failed pa_context_kill_sink_input() جەڭىلۉۉ بولدۇ (plugged in) ( قىستىرما) (unavailable) (ىشتەتكەلى بولبويت ) (unplugged) ( قىستىرما) Failed to read data from stream ئÛ�قىمدىن ساندۇۇ باياندامالاردى وقۇۇ جەڭىلۉۉ بولدۇ Peak detect جوعورۇ تۇۇ چوقۇ تەكشەرىش Failed to create monitoring stream كۉزۅتۉۉ اعىمى قۇرۇۇ جەڭىلۉۉ بولدۇ Failed to connect monitoring stream كۉزۅتۉۉ اعىمدى ۇلوو جەڭىلۉۉ بولدۇ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget وقۇيا دەپ بÛ�كىتىلگەنلىكى جانا وقۇيالىك ۋىكىپÛ�دىيە بىر جاعىنان بىر تاراپ قىلىنغانلىقى سەجانابىدىن چۆكمە كىرگىزۉۉچۉ نازاردان ساق اتقارىلدى Establishing connection to PulseAudio. Please wait... PulseAudio عا ۇلانۇۇ ورنوتقون. ساقلاپتۇرۇڭ... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_name() جەڭىلۉۉ بولدۇ pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_name() جەڭىلۉۉ بولدۇ UkuiMediaSetHeadsetWidget Sound Settings دووش تەڭشەكتەرى Cancel ارعادان قالتىرىش Select Sound Device دووش جابدۇۇسۇن تانداش Headphone ۇققۇچ Headset ۇققۇچ Microphone مىكروÙ�ون ukui-media/ukui-volume-control-applet-qt/translations/zh_CN.ts0000664000175000017500000005055115170054730023501 0ustar fengfeng ApplicationVolumeWidget Application Volume 应用 System Volume 系统音é‡� Sound Settings 声音设置 DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_card_info_by_index() failed Card callback failure Sink callback failure Source callback failure pa_context_get_server_info() failed Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize device restore extension: %s pa_ext_device_restore_read_sink_formats() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_client_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed moduleInfoCb callback failure Ukui Media Volume Control pa_context_load_module() failed ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 设置声音项 System Volume 系统音é‡� App Volume 应用音é‡� Current volume: 当å‰�音é‡�: Muted å·²é�™éŸ³ UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume 音é‡� Output 输出 Sound Settings 声音设置 UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_volume_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_move_sink_input_by_index() failed pa_context_move_source_output_by_name() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed pa_context_kill_sink_input() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Establishing connection to PulseAudio. Please wait... pa_context_get_sink_info_by_name() failed pa_context_get_source_info_by_name() failed UkuiMediaSetHeadsetWidget Sound Settings 声音设置 Cancel å�–消 Select Sound Device 选择输出设备 Headphone 耳机 Headset 耳麦 Microphone 麦克风 ukui-media/ukui-volume-control-applet-qt/translations/kk.ts0000664000175000017500000005625315170054730023112 0ustar fengfeng ApplicationVolumeWidget Application Volume جابلماس ەتۋ كولەمى System Volume سەستيما داۋىسى Sound Settings اۋا تەڭشەۋلەرى DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference(S) 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe() جەڭىلىپ قالدى pa_context_get_card_info_list() failed pa_context_get_card_info_list() جەڭىلىپ قالدى pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() جەڭىلىپ قالدى pa_context_get_source_info_list() failed pa_context_get_source_info_list() جەڭىلىپ قالدى Failed to initialize stream_restore extension: %s stream_restore ۇزاتۋدى باشلىمىدى: %s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() جەڭىلىپ قالدى pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() جەڭىلىپ قالدى pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() جەڭىلىپ قالدى Card callback failure قاريتا قايتۇرۇۋىلىنىش جەڭىلىپ قالدى Sink callback failure چۆككىگە قايتارۋ جەڭىلىپ بولۋ Source callback failure قايناردان قايتۇرۇۋىلىنىش جەڭىلىپ قالدى Fatal Error: Unable to connect to PulseAudio قىسپاقتاۋ قاتەلىك: PulseAudio عا جالعانبادٸ pa_context_get_server_info() failed pa_context_get_server_info() جەڭىلىپ قالدى Sink input callback failure چۆكمە كىرگىزۋ سوز قايتارما رولدارٸ جەڭىلىپ قالدى Source output callback failure قاينار جاريالاۋ ارقىلى قايتۇرۇۋىلىنىش جەڭىلىپ قالدى Client callback failure قاريدار شاقٸرۋ جەڭىلىپ قالدى Server info callback failure قىزىمەت وتەۋ اسبابى حاباردٸ قايتارىپ الۋ جەڭىلىس قالدى Failed to initialize device restore extension: %s اسبابٸن قالپىنا كىلتىرۋدى كەڭەيتۋ باستالمادى: %s pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() جەڭىلىپ قالدى Failed to initialize device manager extension: %s اسباب باسقارۋشنى كەڭەيتۋدى قالپىنا قايتارۋ جەڭىلىپ قالدى: %s pa_ext_device_manager_read() failed pa_ext_device_manager_read() اتقار ەتۋ جەڭىلىپ قالدى pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() جەڭىلىپ قالدى pa_context_get_client_info() failed pa_context_get_client_info() جەڭىلىپ قالدى pa_context_client_info_list() failed pa_context_client_info_list() جەڭىلىپ قالدى pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() جەڭىلىپ قالدى pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() جەڭىلىپ قالدى moduleInfoCb callback failure moduleInfoCb شاقٸرۋ جەڭىلىپ قالدى Ukui Media Volume Control Ukui Media اۋا كونتىرول ەتۋ pa_context_load_module() failed pa_context_load_module() جەڭىلىپ قالدى ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control جاريالاۋ مولشەرىن مەڭگەرۋ ەتۋ Mute é�™éŸ³ Sound preference(S) اۋا مايىللىقى(س) System Volume سەستيما داۋىسى App Volume جيۋ داۋىسى Current volume: كەزەكتەگى اۋا: UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume اۋا Output جاريالاۋ Sound Settings اۋا تەڭشەۋلەرى UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index() جەڭىلىپ قالدى pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() جەڭىلىپ قالدى pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() جەڭىلىپ قالدى pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() جەڭىلىپ قالدى pa_context_move_sink_input_by_index() failed pa_context_move_sink_input_by_index()جەڭىلىپ قالدى pa_context_move_source_output_by_name() failed pa_context_move_source_output_by_name()جەڭىلىپ قالدى pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() جەڭىلىپ قالدى pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() جەڭىلىپ قالدى pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() جەڭىلىپ قالدى pa_context_set_default_sink() failed pa_context_set_default_sink() جەڭىلىپ قالدى pa_context_set_default_source() failed pa_context_set_default_source() جەڭىلىپ قالدى pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() جەڭىلىپ قالدى pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() جەڭىلىپ قالدى pa_context_kill_sink_input() failed pa_context_kill_sink_input() جەڭىلىپ قالدى (plugged in) (قىستىرما) (unavailable) (ٸستەتكەلٸ بولمايدى) (unplugged) (قىستىرما) Failed to read data from stream اعىمنان ساندىق مالىمەتتەردى وقۋ جەڭىلىپ قالدى Peak detect جوعارعى ورە تەكسەرۋ Failed to create monitoring stream كۇزەتۋگە اعٸمٸ قۇرۋ جەڭىلىپ قالدى Failed to connect monitoring stream كۇزەتۋگە مەنى اۋلاۋ جەڭىلىپ قالدى Ignoring sink-input due to it being designated as an event and thus handled by the Event widget وقيعا دوپ بÛ�كىتىلگەنلىكى ۋا وقيعالىك ۋىكىپÛ�دىيە جاقتارٸن بٸر جاق قىلىنغانلىقى سەۋابىدىن چۆكمە كىرگىزۋ اسپابى نازاردان ساقتانۋ قىلىندى Establishing connection to PulseAudio. Please wait... PulseAudio عا جالعانۋ ورناتقان. ساقلاپتۇرۇڭ... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_name() جەڭىلىپ قالدى pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_name() جەڭىلىپ قالدى UkuiMediaSetHeadsetWidget Sound Settings اۋا تەڭشەۋلەرى Cancel كۇشىنەن قالدىرۋ Select Sound Device اۋا اسبابٸن تالداۋ Headphone تىڭداعىش Headset تىڭداعىش Microphone ميكروÙ�ون ukui-media/ukui-volume-control-applet-qt/translations/ms.ts0000664000175000017500000005075215170054730023122 0ustar fengfeng ApplicationVolumeWidget Application Volume System Volume Sound Settings DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_get_card_info_list() failed pa_context_get_sink_info_list() failed pa_context_get_source_info_list() failed Failed to initialize stream_restore extension: %s pa_ext_stream_restore_read() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_index() failed pa_context_get_card_info_by_index() failed Card callback failure Sink callback failure Source callback failure pa_context_get_server_info() failed Sink input callback failure Source output callback failure Client callback failure Server info callback failure Failed to initialize device restore extension: %s pa_ext_device_restore_read_sink_formats() failed Failed to initialize device manager extension: %s pa_ext_device_manager_read() failed pa_context_get_sink_input_info() failed pa_context_get_client_info() failed pa_context_client_info_list() failed pa_context_get_sink_input_info_list() failed pa_context_get_source_output_info_list() failed moduleInfoCb callback failure Ukui Media Volume Control pa_context_load_module() failed ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control Mute é�™éŸ³ Sound preference System Volume App Volume Current volume: Muted UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume Output Sound Settings UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_volume_by_index() failed pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_move_sink_input_by_index() failed pa_context_move_source_output_by_name() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_mute() failed pa_context_set_card_profile_by_index() failed pa_context_set_default_sink() failed pa_context_set_default_source() failed pa_context_set_sink_port_by_name() failed pa_context_set_source_port_by_name() failed pa_context_kill_sink_input() failed (plugged in) (unavailable) (unplugged) Failed to read data from stream Peak detect Failed to create monitoring stream Failed to connect monitoring stream Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Establishing connection to PulseAudio. Please wait... pa_context_get_sink_info_by_name() failed pa_context_get_source_info_by_name() failed UkuiMediaSetHeadsetWidget Sound Settings Cancel Select Sound Device Headphone Headset Microphone ukui-media/ukui-volume-control-applet-qt/translations/tr.ts0000664000175000017500000001066715170052044023125 0ustar fengfeng ApplicationVolumeWidget Application Volume Uygulama Sesi System Volume Sistem Sesi DeviceSwitchWidget Go Into Mini Mode Mini Moda Geç Output volume control Çıkış ses kontrolü Mute Sessiz Sound preference(S) Ses tercihi Device Volume Aygıt Sesi Application Volume Uygulama Sesi Speaker (Realtek Audio) Hoparlör (Realtek Audio) Headphone Kulaklık UkmediaDeviceWidget Input Device GiriÅŸ Sesi Microphone Mikrofon Output Device Çıkış Sesi Speaker Realtek Audio Hoparlör Realtek Audio Input device can not be detected GiriÅŸ cihazı algılanamıyor UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) Hoparlör (Realtek Audio) Go Into Full Mode Tam Moda Geçin ukui-media/ukui-volume-control-applet-qt/translations/ug.ts0000664000175000017500000005637215170054730023122 0ustar fengfeng ApplicationVolumeWidget Application Volume ئىلتىماس قىلىش مىقدارى System Volume سىستÛ�ما ئاۋازى Sound Settings ئاۋاز تەڭشەكلىرى DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference(S) 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe() مەغلۇپ بولدى pa_context_get_card_info_list() failed pa_context_get_card_info_list() مەغلۇپ بولدى pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() مەغلۇپ بولدى pa_context_get_source_info_list() failed pa_context_get_source_info_list() مەغلۇپ بولدى Failed to initialize stream_restore extension: %s stream_restore ئۇزارتىشنى باشلىمىدى: s% pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() مەغلۇپ بولدى pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() مەغلۇپ بولدى pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() مەغلۇپ بولدى pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() مەغلۇپ بولدى Card callback failure كارتا قايتۇرۇۋىلىنىش مەغلۇپ بولدى Sink callback failure قىبلىگە قايتۇرۇش مەغلۇپ بولۇش Source callback failure مەنبەدىن قايتۇرۇۋىلىنىش مەغلۇپ بولدى Fatal Error: Unable to connect to PulseAudio ئەجەللىك خاتالىق: PulseAudio غا ئۇلىنالمىدى pa_context_get_server_info() failed pa_context_get_server_info() مەغلۇپ بولدى Sink input callback failure چۆكمە كىرگۈزۈش سۆز قايتۇرما ئىقتىدارى مەغلۇپ بولدى Source output callback failure مەنبە چىقىرىش ئارقىلىق قايتۇرۇۋىلىنىش مەغلۇپ بولدى Client callback failure Ø®Û�رىدار چاقىرىش مەغلۇپ بولدى Server info callback failure مۇلازىمىتÛ�ر ئۇچۇرىنى قايتۇرۇۋىلاش مەغلۇپ بولدى Failed to initialize device restore extension: %s ئۈسكۈنىنى ئەسلىگە كەلتۈرۈش ئۇزارتىشنى باشلىمىدى: s% pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() مەغلۇپ بولدى Failed to initialize device manager extension: %s ئۈسكۈنە باشقۇرغۇچنى ئۇزارتىشنى قوزغىتىش مەغلۇپ بولدى: s% pa_ext_device_manager_read() failed pa_ext_device_manager_read() مەغلۇپ بولدى pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() مەغلۇپ بولدى pa_context_get_client_info() failed pa_context_get_client_info() مەغلۇپ بولدى pa_context_client_info_list() failed pa_context_client_info_list() مەغلۇپ بولدى pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() مەغلۇپ بولدى pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() مەغلۇپ بولدى moduleInfoCb callback failure moduleInfoCb چاقىرىش مەغلۇپ بولدى Ukui Media Volume Control Ukui Media ئاۋاز كونتىرول قىلىش pa_context_load_module() failed pa_context_load_module() مەغلۇپ بولدى ukui-volume-control-applet-qt is already running! ukui-volume-control-applet-qt ئاللىقاچان ئىجرا بولىۋاتىدۇ! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control چىقىرىش مىقدارىنى كونترول قىلىش Mute é�™éŸ³ Sound preference(S) ئاۋاز مايىللىقى(س) System Volume سىستÛ�ما ئاۋازى App Volume ئەپ ئاۋازى Current volume: نۆۋەتتىكى ھەجىم: UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume ئاۋاز چوڭلۇقى Output چىقىرىش Sound Settings ئاۋاز تەڭشەكلىرى UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_mute_by_index() مەغلۇپ بولدى pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() مەغلۇپ بولدى pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() مەغلۇپ بولدى pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() مەغلۇپ بولدى pa_context_move_sink_input_by_index() failed pa_context_move_sink_input_by_index() مەغلۇپ بولدى pa_context_move_source_output_by_name() failed pa_context_move_source_output_by_name() مەغلۇپ بولدى pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() مەغلۇپ بولدى pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() مەغلۇپ بولدى pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() مەغلۇپ بولدى pa_context_set_default_sink() failed pa_context_set_default_sink() مەغلۇپ بولدى pa_context_set_default_source() failed pa_context_set_default_source() مەغلۇپ بولدى pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() مەغلۇپ بولدى pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() مەغلۇپ بولدى pa_context_kill_sink_input() failed pa_context_kill_sink_input() مەغلۇپ بولدى (plugged in) (قىستۇرما) (unavailable) (ئىشلەتكىلى بولمايدۇ) (unplugged) (قىستۇرما) Failed to read data from stream ئÛ�قىمدىن سانلىق مەلۇماتلارنى ئوقۇش مەغلۇپ بولدى Peak detect يۇقىرى پەللە تەكشۈرۈش Failed to create monitoring stream كۆزىتىش ئÛ�قىمىنى قۇرۇش مەغلۇپ بولدى Failed to connect monitoring stream كۆزىتىش ئÛ�قىمىنى ئۇلاش مەغلۇپ بولدى Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Û‹Û•Ù‚Û• دەپ بÛ�كىتىلگەنلىكى Û‹Û• شۇنىڭ بىلەن ۋەقەلىك ۋىكىپÛ�دىيە تەرىپىدىن بىر تەرەپ قىلىنغانلىقى سەۋەبىدىن چۆكمە كىرگۈزگۈچىنى نەزەردىن ساقىت قىلىش Establishing connection to PulseAudio. Please wait... PulseAudio غا ئۇلىنىش ئورناتقان. ساقلاپتۇرغىن... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_name() مەغلۇپ بولدى pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_name() مەغلۇپ بولدى UkuiMediaSetHeadsetWidget Sound Settings ئاۋاز تەڭشەكلىرى Cancel ئەمەلدىن قالدۇرۇش Select Sound Device ئاۋاز ئۈسكۈنىسىنى تاللاش Headphone تىڭشىغۇچ Headset تىڭشىغۇچ Microphone مىكروÙ�ون ukui-media/ukui-volume-control-applet-qt/translations/bo_CN.ts0000664000175000017500000006233315170054730023461 0ustar fengfeng ApplicationVolumeWidget Application Volume བཀོལ་སྤྱོད་བྱེད་ཚདà¼� System Volume མ་ལག་གི་བོངས་ཚདà¼� Sound Settings སྒྲའི་སྒྲིག་བཀོདà¼� DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_card_info_list() failed pa_context_get_card_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_sink_info_list() failed pa_context_get_sink_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_source_info_list() failed pa_context_get_source_info_list()ཕམ་à½�་བྱུང་བ་རེདà¼� Failed to initialize stream_restore extension: %s stream_restore་རིང་དུ་གà½�ོང་བའི་à½�ོག་མའི་དུས་ཚོད་ལ་སླེབས་མ་à½�ུབ་པà¼� %s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index()ཕམ་ཉེས་བྱུང་བà¼� Card callback failure བྱང་བུ་ཕྱིར་སློག་བྱེད་མ་à½�ུབ་པà¼� Sink callback failure ཕྱིར་ལྡོག་བྱེད་པར་ཕམ་ཉེས་བྱུང་བà¼� Source callback failure འབྱུང་à½�ུངས་ཕྱིར་ལྡོག་བྱེད་མ་à½�ུབ་པà¼� Fatal Error: Unable to connect to PulseAudio སྲོག་ལ་à½�ུག་པའི་ནོར་འà½�ྲུལà¼� ཕུའུ་ལུའུ་ཧྲི་ཨོ་à½�ོ་དང་འབྲེལ་མà½�ུད་བྱེད་à½�བས་བྲལà¼� pa_context_get_server_info() failed pa_context_get_server_info()ཕམ་ཉེས་བྱུང་བà¼� Sink input callback failure མ་དངུལ་འཇོག་པའི་ཕྱིར་ལྡོག་ལ་ཕམ་ཉེས་བྱུང Source output callback failure འབྱུང་à½�ུངས་ཕྱིར་ལྡོག་བྱེད་པར་ཕམ་ཉེས་བྱུང་བà¼� Client callback failure མངགས་བཅོལ་བྱེད་མà½�ན་གྱིས་ཕྱིར་སློག་ Server info callback failure ཞབས་ཞུའི་ཡོ་བྱད་ཀྱི་ཆ་འཕྲིན་ཕྱིར་ལྡོག་བྱེད་མ་à½�ུབ Failed to initialize device restore extension: %s 设备æ�¢å¤�扩展%s pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats()ཕམ་ཉེས་བྱུང་བà¼� Failed to initialize device manager extension: %s སྒྲིག་ཆས་དོ་དམ་གྱི་དུས་འགྱངས་ལ་à½�ོག་མའི་དུས་འགྱངས་བྱེད་མ་à½�ུབ་པà¼� %s pa_ext_device_manager_read() failed pa_ext_device_manager_read()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_sink_input_info() failed pa_context_get_sink_input_info()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_client_info() failed pa_context_get_client_info()ཕམ་ཉེས་བྱུང་བà¼� pa_context_client_info_list() failed pa_context_client_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list()ཕམ་ཉེས་བྱུང་བà¼� pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list()ཕམ་à½�་བྱུང་བ་རེདà¼� Connection failed, attempting reconnect འབྲེལ་མà½�ུད་བྱེད་མ་à½�ུབ་པར་ཡང་བསà¾�ྱར་འབྲེལ་མà½�ུད་བྱེད་རྩིས་བྱསà¼� moduleInfoCb callback failure moduleInfoCb ཕྱིར་ལྡོག་བྱེད་པར་ཕམ་ཉེས་བྱུང་བà¼� Ukui Media Volume Control à½�ུའུ་à½�ི་ལན་གྱི་སྨྱན་སྦྱོར་གྱི་བོངས་ pa_context_load_module() failed pa_context_load_module()ཕམ་ཉེས་བྱུང་བà¼� ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control à½�ོན་ཚད་ཚོད་འཛིན་ Mute é�™éŸ³ Sound preference སྒྲ་གདངས་ཀྱི་དགའ་ཕྱོགས་ System Volume མ་ལག་གི་བོངས་ཚདà¼� App Volume ཉེར་སྤྱོད་གྲངས་འབོརà¼� Current volume: མིག་སྔའི་བོངས་ཚད་ནིà¼� UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume བོངས་ཚདà¼� Output à½�ོན་ཚདà¼� Sound Settings སྒྲའི་སྒྲིག་བཀོདà¼� UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_move_sink_input_by_index() failed pa_context_move_source_output_by_name() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_volume()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_output_mute() failed pa_context_set_source_output_mute()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index()ཕམ་ཉེས་བྱུང་བà¼� pa_context_set_default_sink() failed pa_context_set_default_sink()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_default_source() failed pa_context_set_default_source()ཕམ་ཉེས་བྱུང་བà¼� pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name()ཕམ་ཉེས་བྱུང་བà¼� pa_context_kill_sink_input() failed pa_context_kill_sink_input()ཕམ་ཉེས་བྱུང་བà¼� (plugged in) (ནང་དུ་བཅུག་པ་)à¼� (unavailable) (སྤྱོད་གོ་མི་ཆོད་པ)à¼� (unplugged) (à½�་à½�ོར་ཡ་བྲལ་དུ་སོང་བ་)à¼� Failed to read data from stream ཆུ་ཕྲན་ནས་གཞི་གྲངས་ཀློག་མ་à½�ུབ་པà¼� Peak detect ཡང་རྩེར་ཞིབ་དཔྱད་ཚད་ལེན Failed to create monitoring stream ལྟ་ཞིབ་ཚད་ལེན་གྱི་ཆུ་ཕྲན་གསར་སà¾�ྲུན་བྱེད་མ་à½�ུབ་པ Failed to connect monitoring stream ལྟ་ཞིབ་ཚད་ལེན་གྱི་ཆུ་ཕྲན་སྦྲེལ་མà½�ུད་བྱེད་མ་à½�ུབ་པ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget དོན་རà¾�ྱེན་ཞིག་à½�ུ་བརྩིས་ནས་དོན་རà¾�ྱེན་ཆུང་ཆུང་ཞིག་à½�ུ་བརྩིས་ནས་à½�ག་གཅོད་བྱས་པའི་རà¾�ྱེན་གྱིས་ཆུ་ནང་དུ་འཛུལ་བར་སྣང་མེད་བྱས་པ་རེདà¼� Establishing connection to PulseAudio. Please wait... ཕུའུ་ལུའུ་ཧྲི་ཨོ་à½�ོ་དང་འབྲེལ་བ་བཙུགས་པ་རེདà¼� སà¾�ུ་མà½�ྱེན་སྒུག་རོགསà¼�... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_index()ཕམ་à½�་བྱུང་བ་རེདà¼� UkuiMediaSetHeadsetWidget Sound Settings སྒྲའི་སྒྲིག་བཀོདà¼� Cancel ཕྱིར་འà½�ེནà¼� Select Sound Device སྒྲའི་སྒྲིག་ཆས་བདམས་པà¼� Headphone རྣ་ཉནà¼� Headset རྣ་ཉནà¼� Microphone སà¾�ད་སྦུག ukui-media/ukui-volume-control-applet-qt/translations/vi.ts0000664000175000017500000005456415170054730023126 0ustar fengfeng ApplicationVolumeWidget Application Volume Khối lượng ứng dụng System Volume Khối lượng hệ thống Sound Settings Cài đặt âm thanh DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed Ä�ăng ký ngữ cảnh PA không thành công pa_context_get_card_info_list() failed pa_context_get_card_info_list() không thành công pa_context_get_sink_info_list() failed Lá»—i khi lấy danh sách thông tin đầu ra âm thanh (sink) từ ngữ cảnh PulseAudio pa_context_get_source_info_list() failed pa_context_get_source_info_list() không thành công Failed to initialize stream_restore extension: %s Không thể khởi tạo stream_restore phần mở rá»™ng: %s pa_ext_stream_restore_read() failed Ä�á»�c pa_ext_stream_restore thất bại pa_context_get_sink_info_by_index() failed Lấy thông tin thiết bị xuất âm bằng chỉ mục trong ngữ cảnh PulseAudio thất bại pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() không thành công pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() không thành công Card callback failure Lá»—i gá»�i lại thẻ Sink callback failure Lá»—i gá»�i lại chìm Source callback failure Lá»—i gá»�i lại Nguồn thất bại pa_context_get_server_info() failed pa_context_get_server_info() không thành công Sink input callback failure Lá»—i callback đầu vào sink Source output callback failure Lá»—i phản hồi đầu ra nguồn Client callback failure Lá»—i gá»�i lại từ khách hàng Server info callback failure Lá»—i gá»�i lại thông tin máy chá»§ Failed to initialize device restore extension: %s Không thể khởi tạo tiện ích khôi phục thiết bị: %s pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() không thành công Failed to initialize device manager extension: %s Khởi tạo phần mở rá»™ng quản lý thiết bị thất bại: %s pa_ext_device_manager_read() failed Ä�á»�c pa_ext_device_manager thất bại pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() không thành công pa_context_get_client_info() failed Pa context lấy thông tin khách hàng() thất bại pa_context_client_info_list() failed Hàm pa_context_client_info_list() thá»±c thi thất bại pa_context_get_sink_input_info_list() failed Hàm pa_context_get_sink_input_info_list() thá»±c thi thất bại pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() không thành công moduleInfoCb callback failure moduleInfoCb gá»�i lại không thành công Ukui Media Volume Control Bá»™ Ä‘iá»�u khiển âm lượng Ä‘a phương tiện Ukui pa_context_load_module() failed pa_context_load_module() không thành công ukui-volume-control-applet-qt is already running! ukui-volume-control-applet-qt đã chạy! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control Ä�iá»�u khiển âm lượng đầu ra Mute é�™éŸ³ Sound preference Sở thích âm thanh System Volume Âm lượng hệ thống App Volume Âm lượng ứng dụng Current volume: Khối lượng hiện tại: Muted Ä�ã tắt tiếng UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume Âm thanh Output Ra Sound Settings Cài đặt âm thanh UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed Hàm pa_context_set_sink_mute_by_index() thá»±c thi thất bại pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() không thành công pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index() không thành công pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index() không thành công pa_context_move_sink_input_by_index() failed Hàm pa_context_move_sink_input_by_index() thá»±c thi thất bại pa_context_move_source_output_by_name() failed Hàm pa_context_move_source_output_by_name() thá»±c thi thất bại pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() không thành công pa_context_set_source_output_mute() failed Hàm pa_context_set_source_output_mute() thá»±c thi thất bại pa_context_set_card_profile_by_index() failed Hàm pa_context_set_card_profile_by_index() thá»±c thi thất bại pa_context_set_default_sink() failed pa_context_set_default_sink() không thành công pa_context_set_default_source() failed Hàm pa_context_set_default_source() thá»±c thi thất bại pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() không thành công pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() không thành công pa_context_kill_sink_input() failed Hàm pa_context_kill_sink_input() thá»±c thi thất bại (plugged in) (cắm vào) (unavailable) (không khả dụng) (unplugged) (đã ngắt kết nối) Failed to read data from stream Không thể Ä‘á»�c dữ liệu từ luồng Peak detect Phát hiện đỉnh Failed to create monitoring stream Không thể tạo luồng giám sát Failed to connect monitoring stream Không kết nối được luồng giám sát Ignoring sink-input due to it being designated as an event and thus handled by the Event widget Bá»� qua sink-input do được chỉ định là sá»± kiện (event) và sẽ được xá»­ lý bởi widget Sá»± kiện Establishing connection to PulseAudio. Please wait... Thiết lập kết nối vá»›i PulseAudio. Hãy chá»�... pa_context_get_sink_info_by_name() failed Hàm pa_context_get_sink_info_by_name() thá»±c thi thất bại pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_name() không thành công UkuiMediaSetHeadsetWidget Sound Settings Cài đặt âm thanh Cancel Há»§y Select Sound Device Chá»�n thiết bị âm thanh Headphone Tai nghe Headset Tai nghe có mic Microphone Micrô ukui-media/ukui-volume-control-applet-qt/translations/mn_MN.ts0000664000175000017500000006401015170054730023477 0ustar fengfeng ApplicationVolumeWidget Application Volume ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ System Volume ᠰᠢᠰᠲᠸᠮ ᠤ᠋ᠨ ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ Sound Settings ᠳᠠᠭᠤ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_card_info_list() failed pa_context_get_card_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_source_info_list() failed pa_context_get_source_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Failed to initialize stream_restore extension: %s stream_restore ᠵᠢ/ ᠢ᠋ ᠠᠨᠭᠬᠠᠵᠢᠭᠤᠯᠵᠤ ᠦᠷᠬᠡᠳᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ᠄%s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Card callback failure ᠺᠠᠷᠲ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Sink callback failure ᠡᠬᠡᠬᠦᠯᠬᠦ ᠵᠢᠨ ᠭᠠᠷᠭᠠᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ Source callback failure ᠡᠬᠡᠬᠦᠯᠬᠦ ᠵᠢᠨ ᠤᠷᠤᠭᠤᠯᠤᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ Fatal Error: Unable to connect to PulseAudio ᠪᠤᠷᠤᠭᠤ᠄PulseAudio ᠳ᠋ᠤ᠌/ ᠲᠤ᠌ ᠴᠦᠷᠬᠡᠯᠡᠵᠦ ᠴᠢᠳᠠᠬᠤ ᠦᠬᠡᠢ pa_context_get_server_info() failed pa_context_get_server_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Sink input callback failure ᠤᠰᠤᠨ ᠬᠤᠪᠢᠯ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠬᠦ ᠤᠷᠤᠭᠤᠯᠤᠯᠳᠠ ᠢᠯᠠᠭᠳᠠᠪᠠ Source output callback failure source-ouput ᠡᠬᠡᠬᠦᠯᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Client callback failure ᠬᠡᠷᠡᠭᠯᠡᠭᠴᠢ ᠵᠢᠨ ᠦᠵᠦᠬᠦᠷᠯᠢᠭ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Server info callback failure ᠦᠢᠯᠡᠴᠢᠯᠡᠬᠦᠷ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠬᠦ ᠪᠤᠷᠤᠭᠤᠳᠠᠪᠠ Failed to initialize device restore extension: %s ᠳᠦᠬᠦᠬᠡᠷᠦᠮᠵᠢ ᠵᠢᠨ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠬᠢ ᠵᠢ ᠠᠨᠭᠬᠠᠵᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Failed to initialize device manager extension: %s ᠳᠦᠬᠦᠬᠡᠷᠦᠮᠵᠢ ᠵᠢᠨ ᠬᠠᠮᠢᠶᠠᠷᠤᠯᠳᠠ ᠵᠢᠨ ᠪᠠᠭᠠᠵᠢ ᠵᠢ ᠠᠨᠭᠬᠠᠵᠢᠭᠤᠯᠵᠤ ᠦᠷᠬᠡᠳᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ᠄%s pa_ext_device_manager_read() failed pa_ext_device_manager_read() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_client_info() failed pa_context_get_client_info() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_client_info_list() failed pa_context_client_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Connection failed, attempting reconnect ᠴᠦᠷᠬᠡᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ᠂ ᠰᠢᠨ᠎ᠡ ᠪᠡᠷ ᠴᠦᠷᠬᠡᠯᠡᠬᠦ ᠵᠢ ᠳᠤᠷᠰᠢᠵᠤ ᠪᠠᠢᠨ᠎ᠠ moduleInfoCb callback failure ᠬᠡᠰᠡᠭ ᠤ᠋ᠨ ᠰᠤᠷᠠᠭ ᠵᠠᠩᠬᠢCb ᠵᠢ/ ᠢ᠋ ᠡᠬᠡᠬᠦᠯᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ Ukui Media Volume Control Ukui ᠵᠠᠭᠤᠴᠢᠯᠠᠭᠤᠷ ᠤ᠋ᠨ ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ ᠵᠢ ᠡᠵᠡᠮᠳᠡᠬᠦ pa_context_load_module() failed pa_context_load_module() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶᠡᠨ ᠤ᠋ ᠬᠢᠨᠠᠨ ᠡᠵᠡᠮᠳᠡᠯ ᠢ᠋ ᠭᠠᠷᠭᠠᠬᠤ Mute é�™éŸ³ Sound preference ᠳᠠᠭᠤᠨ ᠤ᠋ ᠳᠦᠷᠦᠯ ᠢ᠋ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ System Volume ᠰᠢᠰᠲᠸᠮ ᠤ᠋ᠨ ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ App Volume ᠬᠡᠷᠡᠭᠯᠡᠯᠳᠡ ᠵᠢᠨ ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ Current volume: ᠤᠳᠤᠬᠠᠨ ᠤ᠋ ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ: UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume ᠳᠠᠭᠤᠨ ᠤ᠋ ᠬᠡᠮᠵᠢᠶ᠎ᠡ Output ᠭᠠᠷᠭᠠᠬᠤ Sound Settings ᠳᠠᠭᠤ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_source_mute_by_index() failed pa_context_set_source_mute_by_index () ᠢᠯᠠᠭᠳᠠᠪᠠ᠃ pa_context_set_source_volume_by_index() failed pa_context_set_source_volume_by_index () ᠢᠯᠠᠭᠳᠠᠪᠠ᠃ pa_context_move_sink_input_by_index() failed pa_context_move_source_output_by_name() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_default_sink() failed pa_context_set_default_sink() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_default_source() failed pa_context_set_default_source() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_kill_sink_input() failed pa_context_kill_sink_input() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ (plugged in) ( ᠬᠠᠪᠴᠢᠭᠤᠯᠤᠭᠰᠠᠨ ᠪᠠᠢᠨ᠎ᠠ) (unavailable) ( ᠬᠡᠷᠡᠭᠯᠡᠵᠦ ᠪᠤᠯᠬᠤ ᠦᠬᠡᠢ) (unplugged) ᠴᠦᠷᠬᠡᠯᠡᠬᠡ ᠪᠠᠢᠬᠤ ᠦᠬᠡᠢ Failed to read data from stream ᠳ᠋ᠠᠢᠲ᠋ᠠ ᠵᠢ ᠤᠨᠭᠰᠢᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Peak detect ᠣᠷᠭᠢᠯ ᠬᠡᠮᠵᠢᠭᠳᠡᠯ ᠦ᠋ᠨ ᠪᠠᠢᠴᠠᠭᠠᠯᠲᠠ Failed to create monitoring stream ᠬᠢᠨᠠᠨ ᠬᠡᠮᠵᠢᠬᠦ ᠤᠷᠤᠰᠬᠠᠯ ᠢ᠋ ᠪᠠᠢᠭᠤᠯᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Failed to connect monitoring stream ᠬᠢᠨᠠᠨ ᠬᠡᠮᠵᠢᠬᠦ ᠤᠷᠤᠰᠬᠠᠯ ᠢ᠋ ᠴᠦᠷᠬᠡᠯᠡᠵᠤ ᠴᠢᠳᠠᠭᠰᠠᠨ ᠦᠬᠡᠢ Ignoring sink-input due to it being designated as an event and thus handled by the Event widget ᠰᠠᠭᠤᠭᠳᠠᠭᠤᠯᠵᠤ ᠤᠷᠤᠭᠤᠯᠬᠤ ᠵᠢ ᠤᠮᠳᠤᠭᠠᠢᠯᠠᠨ᠎ᠠ᠂ ᠤᠴᠢᠷ ᠨᠢ ᠳᠡᠬᠦᠨ ᠢ᠋ ᠶᠠᠪᠤᠳᠠᠯ ᠵᠢᠨᠷ ᠳᠤᠭᠳᠠᠭᠠᠭᠰᠠᠨ᠂ ᠡᠢᠮᠤ á ¡á ´á ¡ ᠶᠠᠪᠤᠳᠠᠯ ᠤ᠋ᠨ ᠵᠢᠵᠢᠭ ᠰᠡᠯᠪᠢᠭ ᠵᠢᠡᠷ ᠰᠢᠢᠳᠪᠦᠷᠢᠯᠡᠬᠦ ᠬᠡᠷᠡᠭᠳᠡᠢ Establishing connection to PulseAudio. Please wait... PulseAudio ᠳ᠋ᠤ᠌/ ᠲᠤ᠌ ᠴᠦᠷᠬᠡᠯᠡᠵᠦ ᠪᠠᠢᠨ᠎ᠠ᠂ ᠳᠦᠷ ᠬᠦᠯᠢᠶᠡᠬᠡᠷᠡᠢ... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_name() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_name() ᠵᠢ/ ᠢ᠋ ᠬᠦᠢᠴᠡᠬᠡᠬᠦ ᠢᠯᠠᠭᠳᠠᠪᠠ UkuiMediaSetHeadsetWidget Sound Settings ᠳᠠᠭᠤ ᠳᠤᠬᠢᠷᠠᠭᠤᠯᠬᠤ Cancel ᠦᠬᠡᠢᠰᠭᠡᠬᠦ᠌ Select Sound Device ᠭᠠᠷᠭᠠᠬᠤ ᠳᠦᠬᠦᠬᠡᠷᠦᠮᠵᠢ ᠵᠢ ᠰᠤᠨᠭᠭᠤᠬᠤ Headphone ᠰᠤᠨᠤᠰᠤᠭᠤᠷ Headset ᠰᠤᠨᠤᠰᠤᠭᠤᠷ Microphone ᠮᠢᠺᠷᠣᠹᠣᠨ ukui-media/ukui-volume-control-applet-qt/translations/zh_HK.ts0000664000175000017500000005315715170054730023510 0ustar fengfeng ApplicationVolumeWidget Application Volume 應用 System Volume 系統音é‡� Sound Settings è�²éŸ³è¨­ç½® DeviceSwitchWidget Go Into Mini Mode 进入Mini模å¼� Output volume control 输出音é‡�控制 Mute é�™éŸ³ Sound preference 声音首选项 Device Volume 设备音é‡� Application Volume 应用音é‡� is using 正在使用 Bluetooth è“�牙 Error 错误 Unable to connect to the sound system, please check whether the pulseaudio service is running! 无法连接到系统声音,请检查pulseaudioæœ�务是å�¦æ­£åœ¨è¿�行ï¼� Dummy output 伪输出 Speaker (Realtek Audio) 扬声器(Realtek Audio) Headphone 模拟耳机 QObject pa_context_subscribe() failed pa_context_subscribe() 執行失敗 pa_context_get_card_info_list() failed pa_context_get_card_info_list() 執行失敗 pa_context_get_sink_info_list() failed pa_context_get_sink_info_list() 執行失敗 pa_context_get_source_info_list() failed pa_context_get_source_info_list() 執行失敗 Failed to initialize stream_restore extension: %s åˆ�始化stream_restore擴展失敗:%s pa_ext_stream_restore_read() failed pa_ext_stream_restore_read() 執行失敗 pa_context_get_sink_info_by_index() failed pa_context_get_sink_info_by_index() 執行失敗 pa_context_get_source_info_by_index() failed pa_context_get_source_info_by_index() 執行失敗 pa_context_get_card_info_by_index() failed pa_context_get_card_info_by_index() 執行失敗 Card callback failure å�¡ç‰‡å›žèª¿å¤±æ•— Sink callback failure 輸出回調失敗 Source callback failure 輸入回調失敗 Fatal Error: Unable to connect to PulseAudio 錯誤:ä¸�能連接到pulseaudio pa_context_get_server_info() failed pa_context_get_server_info() 執行失敗 Sink input callback failure 水槽輸入回調失敗 Source output callback failure source-ouput回調失敗 Client callback failure 用戶端回調失敗 Server info callback failure æœ�務端回調錯誤 Failed to initialize device restore extension: %s åˆ�始化設備信æ�¯å¤±æ•— pa_ext_device_restore_read_sink_formats() failed pa_ext_device_restore_read_sink_formats() 失敗 Failed to initialize device manager extension: %s åˆ�始化設備管ç�†å™¨æ“´å±•失敗:%s pa_ext_device_manager_read() failed pa_ext_device_manager_read() 執行失敗 pa_context_get_sink_input_info() failed pa_context_get_sink_input_info() 執行失敗 pa_context_get_client_info() failed pa_context_get_client_info() 執行失敗 pa_context_client_info_list() failed pa_context_client_info_list() 執行失敗 pa_context_get_sink_input_info_list() failed pa_context_get_sink_input_info_list() 執行失敗 pa_context_get_source_output_info_list() failed pa_context_get_source_output_info_list() 執行失敗 Connection failed, attempting reconnect 連接失敗,嘗試é‡�新連接中 moduleInfoCb callback failure 模組資訊Cb回調失敗 Ukui Media Volume Control UKUI 媒體音é‡�控制 pa_context_load_module() failed pa_context_load_module() 失敗 ukui-volume-control-applet-qt is already running! UkmediaDeviceWidget Input Device 输入设备 Microphone 麦克风 Output Device 输出设备 Speaker Realtek Audio 扬声器(Realtek Audio) Input device can not be detected 无法检测到输入设备 UkmediaMainWidget Output volume control 輸出音é‡�控制 Mute é�™éŸ³ Sound preference 設置è�²éŸ³é … System Volume 系統音é‡� App Volume 應用音é‡� Current volume: ç›®å‰�音é‡�: UkmediaMiniMasterVolumeWidget Speaker (Realtek Audio) 扬声器(Realtek Audio) Go Into Full Mode 进入完整模å¼� UkmediaSystemVolumeWidget Volume 音é‡� Output 輸出 Sound Settings è�²éŸ³è¨­ç½® UkmediaVolumeControl pa_context_set_sink_mute_by_index() failed pa_context_set_sink_volume_by_index() failed pa_context_set_sink_volume_by_index() 執行失敗 pa_context_set_source_mute_by_index() failed pa_context_set_source_volume_by_index() failed pa_context_move_sink_input_by_index() failed pa_context_move_source_output_by_name() failed pa_context_set_source_output_volume() failed pa_context_set_source_output_volume() 執行失敗 pa_context_set_source_output_mute() failed pa_context_set_source_output_mute() 執行失敗 pa_context_set_card_profile_by_index() failed pa_context_set_card_profile_by_index() 執行失敗 pa_context_set_default_sink() failed pa_context_set_default_sink() 執行失敗 pa_context_set_default_source() failed pa_context_set_default_source() 執行失敗 pa_context_set_sink_port_by_name() failed pa_context_set_sink_port_by_name() 執行失敗 pa_context_set_source_port_by_name() failed pa_context_set_source_port_by_name() 執行失敗 pa_context_kill_sink_input() failed pa_context_kill_sink_input() 失敗 (plugged in) (æ�’上了) (unavailable) ( ä¸�å�¯ç”¨ ) (unplugged) 沒有連接 Failed to read data from stream 從æµ�中讀å�–數據失敗 Peak detect 峰值檢測 Failed to create monitoring stream 創建監控æµ�失敗 Failed to connect monitoring stream 連接監控æµ�失敗 Ignoring sink-input due to it being designated as an event and thus handled by the Event widget 忽略沉é™�輸入,因為它被指定為事件,因此由事件å°�部件處ç�† Establishing connection to PulseAudio. Please wait... 正在建立與PulseAudio的連接。 請等待... pa_context_get_sink_info_by_name() failed pa_context_get_sink_info_by_index() failed pa_context_get_source_info_by_name() failed pa_context_get_source_info_by_index() failed UkuiMediaSetHeadsetWidget Sound Settings è�²éŸ³è¨­ç½® Cancel å�–消 Select Sound Device é�¸æ“‡è¼¸å‡ºè¨­å‚™ Headphone 耳機 Headset 耳麥 Microphone 麥克風 ukui-media/ukui-volume-control-applet-qt/res.qrc0000664000175000017500000000033515170052044020676 0ustar fengfeng data/img/setting.svg data/img/tick.png data/img/tick.svg data/qss/ukuimedia.qss ukui-media/ukui-volume-control-applet-qt/ukui_list_widget_item.h0000664000175000017500000000265015170052044024142 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include "ukmedia_custom_class.h" class UkuiListWidgetItem : public QWidget { Q_OBJECT public: UkuiListWidgetItem(QWidget *parent = 0); ~UkuiListWidgetItem(); void setLabelText(QString portText,QString deviceLabel); void setSelected(bool selected); void setButtonIcon(QString iconName); QLabel *deviceLabel; FixLabel *portLabel; QPushButton *deviceButton; private: QHBoxLayout *hLayout; protected: void mousePressEvent(QMouseEvent *event); }; #endif // UKUILISTWIDGETITEM_H ukui-media/ukui-volume-control-applet-qt/ukmedia_custom_class.h0000664000175000017500000000767115170054730023763 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include #include #include #include "kslider.h" #define MIDDLE_COLOR 178 #define BACKGROUND_COLOR QColor(0,0,0,0) using namespace kdk; typedef struct UkuiThemeIcon { QImage image; QColor color; }UkuiThemeIcon; enum PushButtonState{ PUSH_BUTTON_NORMAL, PUSH_BUTTON_CLICK, PUSH_BUTTON_PRESS }; static QColor symbolic_color = Qt::gray; class UkuiButtonDrawSvg:public QPushButton { Q_OBJECT public: UkuiButtonDrawSvg(QWidget *parent = nullptr); ~UkuiButtonDrawSvg(); QPixmap filledSymbolicColoredPixmap(QImage &source, QColor &baseColor); QRect IconGeometry(); void draw(QPaintEvent* e); void init(QImage image ,QColor color); friend class DeviceSwitchWidget; friend class UkmediaMainWidget; friend class UkmediaOsdDisplayWidget; friend class UkmediaSystemVolumeWidget; protected: void paintEvent(QPaintEvent *event); bool event(QEvent *e); private: int buttonState = PUSH_BUTTON_NORMAL; UkuiThemeIcon themeIcon; }; class UkuiApplicationWidget:public QWidget { Q_OBJECT public: UkuiApplicationWidget(QWidget *parent = nullptr); ~UkuiApplicationWidget(); protected: void paintEvent(QPaintEvent*); }; class UkuiSettingButton:public QLabel { Q_OBJECT public: UkuiSettingButton(QWidget *parent = nullptr); ~UkuiSettingButton(); friend class UkmediaMiniMasterVolumeWidget; friend class UkmediaMainWidget; friend class UkmediaSystemVolumeWidget; friend class ApplicationVolumeWidget; protected: void paintEvent(QPaintEvent *event); void enterEvent(QEvent *event); void leaveEvent(QEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); private: QColor m_foregroundColor; void setPressColor(); void setHoverColor(); void setNormalColor(); Q_SIGNALS: void clicked(void); private Q_SLOTS: void onPaletteChanged(); }; class AudioSlider : public KSlider { Q_OBJECT public: AudioSlider(QWidget *parent = nullptr); ~AudioSlider(); bool isMouseWheel = false; private: int blueValue = 0; Q_SIGNALS: void blueValueChanged(int value); //针对è“�牙a2dp模å¼�下滑动æ�¡è·³åŠ¨ï¼Œä»¥10为间隔设置音é‡� protected: void wheelEvent(QWheelEvent *e); void keyReleaseEvent(QKeyEvent *e); void mouseMoveEvent(QMouseEvent *e); void mouseReleaseEvent(QMouseEvent *e); }; //文本长自动çœ�略并添加悬浮 class FixLabel : public QLabel { Q_OBJECT public: explicit FixLabel(QWidget *parent = nullptr); explicit FixLabel(QString text , QWidget *parent = nullptr); ~FixLabel(); void setText(const QString &text, bool saveTextFlag = true); QString fullText; private: void paintEvent(QPaintEvent *event); private: }; class Divider : public QFrame { public: Divider(QWidget * parent = nullptr); ~Divider() = default; protected: void paintEvent(QPaintEvent *event); }; #endif ukui-media/ukui-volume-control-applet-qt/dbus-adaptor/0000775000175000017500000000000015170054730021766 5ustar fengfengukui-media/ukui-volume-control-applet-qt/dbus-adaptor/dbus-adaptor.pri0000664000175000017500000000024315170052044025062 0ustar fengfengINCLUDEPATH += $$PWD HEADERS += \ $$PWD/dbus-adaptor.h \ $$PWD/bluez-adaptor.h \ SOURCES += \ $$PWD/dbus-adaptor.cpp \ $$PWD/bluez-adaptor.cpp \ ukui-media/ukui-volume-control-applet-qt/dbus-adaptor/dbus-adaptor.h0000664000175000017500000001066315170054730024532 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include //#include "ukmedia_main_widget.h" QT_BEGIN_NAMESPACE class QByteArray; template class QList; template class QMap; class QString; class QVariant; QT_END_NAMESPACE /* * Adaptor class for interface org.ukui.media */ class MediaAdaptor: public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.media") Q_CLASSINFO("D-Bus Introspection", "" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" "") public: MediaAdaptor(QObject *parent); virtual ~MediaAdaptor(); public: // PROPERTIES public Q_SLOTS: // METHODS QStringList getAllInputDevices(); QStringList getAllOutputDevices(); QString getDefaultInputDevice(); bool getDefaultInputMuteState(); int getDefaultInputVolume(); QString getDefaultOutputDevice(); bool getDefaultOutputMuteState(); int getDefaultOutputVolume(); bool setDefaultInputDevice(const QString &deviceName); bool setDefaultInputMuteState(bool mute); bool setDefaultInputVolume(int value); bool setDefaultOutputDevice(const QString &deviceName); bool setDefaultOutputMuteState(bool mute); bool setDefaultOutputVolume(int value); int getBatteryLevel(const QString &deviceName); Q_SIGNALS: // SIGNALS void batteryChanged(const QString &device, int battery); }; #endif ukui-media/ukui-volume-control-applet-qt/dbus-adaptor/dbus-adaptor.cpp0000664000175000017500000001167515170054730025071 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include /* * Implementation of adaptor class MediaAdaptor */ MediaAdaptor::MediaAdaptor(QObject *parent) : QDBusAbstractAdaptor(parent) { // constructor setAutoRelaySignals(true); } MediaAdaptor::~MediaAdaptor() { // destructor } QStringList MediaAdaptor::getAllInputDevices() { // handle method call org.ukui.media.getAllInputDevices QStringList out0; QMetaObject::invokeMethod(parent(), "getAllInputDevices", Q_RETURN_ARG(QStringList, out0)); return out0; } QStringList MediaAdaptor::getAllOutputDevices() { // handle method call org.ukui.media.getAllOutputDevices QStringList out0; QMetaObject::invokeMethod(parent(), "getAllOutputDevices", Q_RETURN_ARG(QStringList, out0)); return out0; } QString MediaAdaptor::getDefaultInputDevice() { // handle method call org.ukui.media.getDefaultInputDevice QString out0; QMetaObject::invokeMethod(parent(), "getDefaultInputDevice", Q_RETURN_ARG(QString, out0)); return out0; } bool MediaAdaptor::getDefaultInputMuteState() { // handle method call org.ukui.media.getDefaultInputMuteState bool out0; QMetaObject::invokeMethod(parent(), "getDefaultInputMuteState", Q_RETURN_ARG(bool, out0)); return out0; } int MediaAdaptor::getDefaultInputVolume() { // handle method call org.ukui.media.getDefaultInputVolume int out0; QMetaObject::invokeMethod(parent(), "getDefaultInputVolume", Q_RETURN_ARG(int, out0)); return out0; } QString MediaAdaptor::getDefaultOutputDevice() { // handle method call org.ukui.media.getDefaultOutputDevice QString out0; QMetaObject::invokeMethod(parent(), "getDefaultOutputDevice", Q_RETURN_ARG(QString, out0)); return out0; } bool MediaAdaptor::getDefaultOutputMuteState() { // handle method call org.ukui.media.getDefaultOutputMuteState bool out0; QMetaObject::invokeMethod(parent(), "getDefaultOutputMuteState", Q_RETURN_ARG(bool, out0)); return out0; } int MediaAdaptor::getDefaultOutputVolume() { // handle method call org.ukui.media.getDefaultOutputVolume int out0; QMetaObject::invokeMethod(parent(), "getDefaultOutputVolume", Q_RETURN_ARG(int, out0)); return out0; } bool MediaAdaptor::setDefaultInputDevice(const QString &deviceName) { // handle method call org.ukui.media.setDefaultInputDevice bool out0; QMetaObject::invokeMethod(parent(), "setDefaultInputDevice", Q_RETURN_ARG(bool, out0), Q_ARG(QString, deviceName)); return out0; } bool MediaAdaptor::setDefaultInputMuteState(bool mute) { // handle method call org.ukui.media.setDefaultInputMuteState bool out0; QMetaObject::invokeMethod(parent(), "setDefaultInputMuteState", Q_RETURN_ARG(bool, out0), Q_ARG(bool, mute)); return out0; } bool MediaAdaptor::setDefaultInputVolume(int value) { // handle method call org.ukui.media.setDefaultInputVolume bool out0; QMetaObject::invokeMethod(parent(), "setDefaultInputVolume", Q_RETURN_ARG(bool, out0), Q_ARG(int, value)); return out0; } bool MediaAdaptor::setDefaultOutputDevice(const QString &deviceName) { // handle method call org.ukui.media.setDefaultOutputDevice bool out0; QMetaObject::invokeMethod(parent(), "setDefaultOutputDevice", Q_RETURN_ARG(bool, out0), Q_ARG(QString, deviceName)); return out0; } bool MediaAdaptor::setDefaultOutputMuteState(bool mute) { // handle method call org.ukui.media.setDefaultOutputMuteState bool out0; QMetaObject::invokeMethod(parent(), "setDefaultOutputMuteState", Q_RETURN_ARG(bool, out0), Q_ARG(bool, mute)); return out0; } bool MediaAdaptor::setDefaultOutputVolume(int value) { // handle method call org.ukui.media.setDefaultOutputVolume bool out0; QMetaObject::invokeMethod(parent(), "setDefaultOutputVolume", Q_RETURN_ARG(bool, out0), Q_ARG(int, value)); return out0; } int MediaAdaptor::getBatteryLevel(const QString &deviceName) { // handle method call org.ukui.media.bluetooth.getBatteryLevel int out0; QMetaObject::invokeMethod(parent(), "getBatteryLevel", Q_RETURN_ARG(int, out0), Q_ARG(QString, deviceName)); return out0; } ukui-media/ukui-volume-control-applet-qt/dbus-adaptor/bluez-adaptor.h0000664000175000017500000000304015170054730024705 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef BLUEZ_ADAPTOR_H #define BLUEZ_ADAPTOR_H #include #include #include #include #define ERROR -1 class Bluetooth_Dbus : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.media") public: Bluetooth_Dbus(); ~Bluetooth_Dbus(); int batteryLevel = -1;//è“�牙耳机电é‡� QString macAddress = ""; void UkmediaDbusRegister(); void sendBatteryChangedSignal(QString macAddr, int battery); Q_SIGNALS: void batteryChanged(QString macAddr, int battery);//è“�牙电é‡�改å�˜ä¿¡å�· public Q_SLOTS: int getBatteryLevel(QString macAddr);//获å�–è“�牙耳机电é‡� }; #endif // BLUEZ_ADAPTOR_H ukui-media/ukui-volume-control-applet-qt/dbus-adaptor/bluez-adaptor.cpp0000664000175000017500000000330415170054730025243 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "bluez-adaptor.h" Bluetooth_Dbus::Bluetooth_Dbus() { UkmediaDbusRegister(); } void Bluetooth_Dbus::UkmediaDbusRegister() { QDBusConnection con = QDBusConnection::sessionBus(); if(!con.registerService("org.ukui.media")) qDebug()<<"registerService failed"< ukui-media/ukui-volume-control-applet-qt/ukmedia_monitor_window_thread.h0000664000175000017500000000257215170052044025660 0ustar fengfeng/* * Copyright 2020. kylinos.cn. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include #include #include #include class UkmediaMonitorWindowThread : public QThread { public: UkmediaMonitorWindowThread(); void get_window_nameAndid(); //结æ�Ÿçº¿ç¨‹æ ‡å¿—ä½� bool bStopThread; bool bCreateWindow; bool bFirstEnterSystem; QVector windowId; void run(); }; #endif // UKMEDIAMONITORWINDOWTHREAD_H ukui-media/ukui-volume-control-applet-qt/ukui_media_set_headset_widget.h0000664000175000017500000000622515170054730025606 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include "windowmanager/windowmanager.h" #include "ukuistylehelper/ukuistylehelper.h" #include //设置声å�¡çš„key controls #define LEVEL_BASIC (1<<0) #define LEVEL_ID (1<<2) #define HW_CARD "hw:0" //任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ #define PANEL_SETTINGS "org.ukui.panel.settings" #define PANEL_SIZE_KEY "panelsize" #define PANEL_POSITION_KEY "panelposition" class UkuiMediaSetHeadsetWidget : public QWidget { Q_OBJECT enum PanelPosition{ Bottom = 0, //!< The bottom side of the screen. Top, //!< The top side of the screen. Left, //!< The left side of the screen. Right //!< The right side of the screen. }; public: UkuiMediaSetHeadsetWidget(QWidget *parent = nullptr); ~UkuiMediaSetHeadsetWidget(); void initSetHeadsetWidget(); int cset(char * name, char *card, char *c, int roflag, int keep_handle); void showControlId(snd_ctl_elem_id_t *id); int showControl(const char *space, snd_hctl_elem_t *elem,int level); void showWindow(); void initPanelGSettings(); QRect caculatePosition(); //任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ friend class DeviceSwitchWidget; friend class UkmediaMainWidget; private: QToolButton *headphoneIconButton; QToolButton *headsetIconButton; QToolButton *microphoneIconButton; QLabel *headphoneLabel; QLabel *headsetLabel; QLabel *microphoneLabel; QLabel *selectSoundDeviceLabel; QPushButton *soundSettingButton; QPushButton *cancelButton; bool isShow = false; QGSettings *m_panelGSettings = nullptr; int m_panelPosition; int m_panelSize; private Q_SLOTS: void headphoneButtonClickedSlot(); //点击headphone按钮 void headsetButtonClickedSlot(); //点击headset 按钮 void microphoneButtonClickedSlot(); //点击microphone 按钮 void soundSettingButtonClickedSlot(); //点击声音设置按钮 void cancelButtonClickedSlot(); //点击å�–消按钮 protected: void paintEvent(QPaintEvent *event); }; #endif // UKUIMEDIASETHEADSETWIDGET_H ukui-media/ukui-volume-control-applet-qt/main.cpp0000664000175000017500000000766715170054730021051 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include "ukmedia_main_widget.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "xatom/xatom-helper.h" #include "windowmanager/windowmanager.h" int main(int argc, char *argv[]) { initUkuiLog4qt("ukui-media"); // Display *display = XOpenDisplay(NULL); // Screen *scrn = DefaultScreenOfDisplay(display); // if (scrn == nullptr) { // return 0; // } #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); #endif #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif QString id = QString("ukui-volume-control-applet-qt-" + QLatin1String(getenv("DISPLAY"))); QtSingleApplication app(id, argc, argv); qDebug() << " DISPLAY id:" << id; if (app.isRunning()) { QDBusInterface interface("org.ukui.media", "/org/ukui/media", "org.ukui.media", QDBusConnection::sessionBus()); if (interface.isValid()){ interface.call("advancedWidgetShow"); } app.sendMessage(QApplication::arguments().length() > 1 ? QApplication::arguments().at(1) : app.applicationFilePath()); qDebug() << QObject::tr("ukui-volume-control-applet-qt is already running!"); return EXIT_SUCCESS; } #ifndef QT_NO_TRANSLATION QString translatorFileName = QLatin1String("qt_"); translatorFileName += QLocale::system().name(); QTranslator *pTranslator = new QTranslator(); if (pTranslator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) app.installTranslator(pTranslator); #endif //加载qm文件 QTranslator translator; translator.load("/usr/share/ukui-media/translations/" + QLocale::system().name()); app.installTranslator(&translator); //加载qss文件 QFile qss(":/data/qss/ukuimedia.qss"); qss.open(QFile::ReadOnly); qss.close(); UkmediaMainWidget w; app.setActivationWindow(&w); w.setProperty("useStyleWindowManager", false); //ç¦�用拖动 //start v11环境上此æ“�作覆盖qtsdk接å�£çš„圆角效果,故å±�蔽 // QString platform = QGuiApplication::platformName(); // if(!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ // MotifWmHints window_hints; // window_hints.flags = MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS; // window_hints.functions = MWM_FUNC_ALL; // window_hints.decorations = MWM_DECOR_BORDER; // XAtomHelper::getInstance()->setWindowMotifHint(w.winId(), window_hints); // } // else { // w.setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); // } //end // XCloseDisplay(display); return app.exec(); } ukui-media/ukui-volume-control-applet-qt/ukmedia_volume_control.cpp0000664000175000017500000027257015170054730024670 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include //pa_sink_info *m_pDefaultSink; /* Used for profile sorting */ struct profile_prio_compare { bool operator() (pa_card_profile_info2 const * const lhs, pa_card_profile_info2 const * const rhs) const { if (lhs->priority == rhs->priority) return strcmp(lhs->name, rhs->name) > 0; return lhs->priority > rhs->priority; } }; struct sink_port_prio_compare { bool operator() (const pa_sink_port_info& lhs, const pa_sink_port_info& rhs) const { if (lhs.priority == rhs.priority) return strcmp(lhs.name, rhs.name) > 0; return lhs.priority > rhs.priority; } }; struct source_port_prio_compare { bool operator() (const pa_source_port_info& lhs, const pa_source_port_info& rhs) const { if (lhs.priority == rhs.priority) return strcmp(lhs.name, rhs.name) > 0; return lhs.priority > rhs.priority; } }; pa_context* UkmediaVolumeControl::context = nullptr; int UkmediaVolumeControl::reconnectTimeout = 3; pa_mainloop_api* UkmediaVolumeControl::api = nullptr; QTimer UkmediaVolumeControl::deviceChangedTimer; UkmediaVolumeControl::UkmediaVolumeControl() : showSinkInputType(SINK_INPUT_CLIENT), showSinkType(SINK_ALL), showSourceOutputType(SOURCE_OUTPUT_CLIENT), showSourceType(SOURCE_NO_MONITOR), canRenameDevices(false), m_connected(false), m_config_filename(nullptr) { profileNameMap.clear(); //创建声音åˆ�始化记录文件 customSoundFile = new CustomSound(); customSoundFile->createAudioFile(); initUserConfig(); UkmediaDbusRegister(); //start pulseaudioå’Œukui-volume进程å�¯åŠ¨æ—¶é—´å·®å°�于3s时,会æ�•获到pulseaudioåˆ�始化设备时的é�žé¢„期数æ�®å¯¼è‡´å‡ºçŽ°è®¾å¤‡åˆ‡æ�¢åŠ¨ä½œ QTimer::singleShot(3*1000, [this]() { connectToPulse(this); }); //end } void UkmediaVolumeControl::initUserConfig() { m_pUsrConf = std::make_shared(); } /* * 设置输出设备é�™éŸ³ */ void UkmediaVolumeControl::setSinkMute(bool status) { pa_operation* o; if (!(o = pa_context_set_sink_mute_by_index(getContext(), sinkIndex, status, nullptr, nullptr))) { showError(tr("pa_context_set_sink_mute_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } /* * 设置输出设备音é‡�通过info */ void UkmediaVolumeControl::setSinkVolumeByInfo(const pa_sink_info &info, int value) { pa_cvolume v = info.volume; for (int i = 0; i < v.channels; i++) v.values[i] = value; pa_operation* o; if (!(o = pa_context_set_sink_mute_by_index(getContext(), info.index, false, nullptr, nullptr))) { showError(tr("pa_context_set_sink_mute_by_index() failed").toUtf8().constData()); return; } if (!(o = pa_context_set_sink_volume_by_index(getContext(), info.index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << info.index << value; } void UkmediaVolumeControl::setSourceVolumeByInfo(const pa_source_info &info,int value) { pa_cvolume v = info.volume; for (int i = 0; i < v.channels; i++) v.values[i] = value; pa_operation* o; if (!(o = pa_context_set_source_mute_by_index(getContext(), info.index,false, nullptr, nullptr))) { showError(tr("pa_context_set_source_mute_by_index() failed").toUtf8().constData()); return; } if (!(o = pa_context_set_source_volume_by_index(getContext(), info.index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_source_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << info.index << value; } /* * 设置输出设备音é‡� */ void UkmediaVolumeControl::setSinkVolume(int index, int value) { if (nullptr == m_pDefaultSink) { qWarning() << "m_pDefaultSink is nullptr, set sink volume failed"; return; } pa_cvolume v = m_pDefaultSink->volume; v.channels = channel; for (int i = 0; i < v.channels; i++) v.values[i] = value; if (balance != 0) pa_cvolume_set_balance(&v, &channelMap, balance); /* To set the volume in silent state, unmute the volume first */ if (sinkMuted) setSinkMute(false); pa_operation* o; if (!(o = pa_context_set_sink_volume_by_index(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << "index" << value; } /* * 设置输入设备é�™éŸ³ */ void UkmediaVolumeControl::setSourceMute(bool status) { pa_operation* o; if (!(o = pa_context_set_source_mute_by_index(getContext(), sourceIndex, status, nullptr, nullptr))) { showError(tr("pa_context_set_source_mute_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } /* * 设置输入设备音é‡� */ void UkmediaVolumeControl::setSourceVolume(int index, int value) { if (nullptr == m_pDefaultSource) { qWarning() << "m_pDefaultSource is nullptr, set source volume failed"; return; } pa_cvolume v = m_pDefaultSource->volume; v.channels = inputChannel; for (int i = 0; i < v.channels; i++) v.values[i] = value; /* To set the volume in silent state, unmute the volume first */ if (sourceMuted) setSourceMute(false); pa_operation* o; if (!(o = pa_context_set_source_volume_by_index(getContext(), index, &v, nullptr, nullptr))) { showError(tr("pa_context_set_source_volume_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); qDebug() << __func__ << "index" << value; } /* * 获å�–输出设备的é�™éŸ³çжæ€� */ bool UkmediaVolumeControl::getSinkMute() { return sinkMuted; } /* * 获å�–输出设备的音é‡�值 */ int UkmediaVolumeControl::getSinkVolume() { return sinkVolume; } /* * 获å�–输入设备的é�™éŸ³çжæ€� */ bool UkmediaVolumeControl::getSourceMute() { return sourceMuted; } /* * 获å�–输入设备的音é‡�值 */ int UkmediaVolumeControl::getSourceVolume() { return sourceVolume; } int UkmediaVolumeControl::getDefaultSinkIndex() { pa_operation *o; if (!(o = pa_context_get_server_info(getContext(), serverInfoIndexCb, this))) { showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return -1; } pa_operation_unref(o); return sinkIndex; } /* * æ ¹æ�®å��称获å�–sink inputé�™éŸ³çжæ€� */ bool UkmediaVolumeControl::getSinkInputMuted(QString description) { int muteStatus = 1; QMap::iterator it; for (it=sinkInputMuteMap.begin();it!=sinkInputMuteMap.end();) { qDebug() << "getSinkInputMuted" << it.key() << description << it.value(); if (it.key() == description) { muteStatus = it.value(); break; } ++it; } return muteStatus==1?true:false; } /* * æ ¹æ�®æ¨¡å�—å��称获å�–对应模å�—索引 */ void UkmediaVolumeControl::getModuleIndexByName(QString name) { findModuleStr = name; pa_context_get_module_info_list(getContext(), moduleInfoCb,this); } /* * 滑动æ�¡æ›´æ”¹è®¾ç½®sink input 音é‡�值 */ void UkmediaVolumeControl::setSinkInputVolume(int index, int value,int channel) { pa_cvolume v = m_pDefaultSink->volume; v.channels = channel; for (int i=0;i appIndexList = findAppIndex(SoundType::SINK, appName); if (appIndexList.isEmpty()) return false; for (int index : appIndexList) { pa_operation* o; if (!(o = pa_context_set_sink_input_mute(getContext(), index, status, nullptr, nullptr))) { showError(tr("pa_context_set_sink_volume_by_index() failed").toUtf8().constData()); } pa_operation_unref(o); qDebug() << "set sink input muted" << index << status; } return true; } void UkmediaVolumeControl::moveSinkInput(QString appName, const char* sinkName) { QList appIndexList = findAppIndex(SoundType::SINK, appName); if (appIndexList.isEmpty()) return; for (int index : appIndexList) { pa_operation* o; if (!(o = pa_context_move_sink_input_by_name(getContext(), index, sinkName, simple_callback, nullptr))) { showError(tr("pa_context_move_sink_input_by_index() failed").toUtf8().constData()); } qDebug() << __func__ << "app" << index << appName << "sink:" << sinkName; pa_operation_unref(o); } } void UkmediaVolumeControl::moveSoureOutput(QString appName, const char* sourceName) { QList appIndexList = findAppIndex(SoundType::SOURCE, appName); if (appIndexList.isEmpty()) return; for (int index : appIndexList) { pa_operation* o; if (!(o = pa_context_move_source_output_by_name(getContext(), index, sourceName, simple_callback, nullptr))) showError(tr("pa_context_move_source_output_by_name() failed").toUtf8().constData()); pa_operation_unref(o); qDebug() << __func__ << "app" << index << appName << "source:" << sourceName; } } /* * 滑动æ�¡æ›´æ”¹è®¾ç½®source output 音é‡�值 */ void UkmediaVolumeControl::setSourceOutputVolume(int index, int value, int channel) { pa_cvolume v = m_pDefaultSink->volume; v.channels = channel; for (int i=0;i appIndexList = findAppIndex(SoundType::SOURCE, appName); if (appIndexList.isEmpty()) return false; for (int index : appIndexList) { pa_operation* o; if (!(o = pa_context_set_source_output_mute(getContext(), index, status, nullptr, nullptr))) showError(tr("pa_context_set_source_output_mute() failed").toUtf8().constData()); pa_operation_unref(o); qDebug() << "set source output muted" << index << status; } return true; } /* * 设置声å�¡çš„é…�置文件 */ bool UkmediaVolumeControl::setCardProfile(int index, const gchar *name) { qDebug() << "setCardProfile" << index << name; pa_operation* o; if (!(o = pa_context_set_card_profile_by_index(getContext(), index, name, nullptr, nullptr))) { showError(tr("pa_context_set_card_profile_by_index() failed").toUtf8().constData()); return false; } return true; } /* * 设置默认的输出设备 */ bool UkmediaVolumeControl::setDefaultSink(const gchar *name) { bool monoAudioState = false; QGSettings *m_pSoundSettings = new QGSettings(KEY_SOUNDS_SCHEMA); monoAudioState = m_pSoundSettings->get(MONO_AUDIO).toBool(); pa_operation* o; if (!(o = pa_context_set_default_sink(getContext(), name, nullptr, nullptr))) { showError(tr("pa_context_set_default_sink() failed").toUtf8().constData()); return false; } #if 0 if(monoAudioState) { if (!(o = pa_context_set_default_sink(getContext(), "mono", nullptr, nullptr))) { showError(tr("pa_context_set_default_sink() failed").toUtf8().constData()); return false; } } #endif qDebug() << " setDefaultSink " << name << defaultSinkName << monoAudioState; return true; } /* * 设置默认的输入设备 */ bool UkmediaVolumeControl::setDefaultSource(const gchar *name) { qDebug() << "setDefaultSource" << name; pa_operation* o; if (!(o = pa_context_set_default_source(getContext(), name, nullptr, nullptr))) { showError(tr("pa_context_set_default_source() failed").toUtf8().constData()); return false; } return true; } /* * 设置输出设备的端å�£ */ bool UkmediaVolumeControl::setSinkPort(const gchar *sinkName, const gchar *portName) { qDebug() << "setSinkPort" << "sinkname:" << sinkName << "portname:" << portName; pa_operation* o; if (!(o = pa_context_set_sink_port_by_name(getContext(), sinkName, portName, nullptr, nullptr))) { showError(tr("pa_context_set_sink_port_by_name() failed").toUtf8().constData()); return false; } return true; } /* * 设置输入设备端å�£ */ bool UkmediaVolumeControl::setSourcePort(const gchar *sourceName, const gchar *portName) { qDebug() << "setSourcePort" << sourceName << portName; pa_operation* o; if (!(o = pa_context_set_source_port_by_name(getContext(), sourceName, portName, nullptr, nullptr))) { showError(tr("pa_context_set_source_port_by_name() failed").toUtf8().constData()); return false; } return true; } /* * kill 索引为index çš„sink input */ bool UkmediaVolumeControl::killSinkInput(int index) { pa_operation* o; if (!(o = pa_context_kill_sink_input(getContext(), index, nullptr, nullptr))) { showError(tr("pa_context_kill_sink_input() failed").toUtf8().constData()); return false; } return true; } UkmediaVolumeControl::~UkmediaVolumeControl() { while (!clientNames.empty()) { auto i = clientNames.begin(); g_free(i->second); clientNames.erase(i); } } static void updatePorts(UkmediaVolumeControl *d, std::map &ports) { std::map::iterator it; PortInfo p; for (auto & port : d->dPorts) { QByteArray desc; it = ports.find(port.first); if (it == ports.end()) { continue; } p = it->second; desc = p.description; if (p.available == PA_PORT_AVAILABLE_YES) { desc += UkmediaVolumeControl::tr(" (plugged in)").toUtf8().constData(); } else if (p.available == PA_PORT_AVAILABLE_NO) { if (p.name == "analog-output-speaker" || p.name == "analog-input-microphone-internal") { desc += UkmediaVolumeControl::tr(" (unavailable)").toUtf8().constData(); } else { desc += UkmediaVolumeControl::tr(" (unplugged)").toUtf8().constData(); } } port.second = desc; } qDebug() << "updatePorts" << p.name << p.description; Q_EMIT d->updatePortSignal(); it = ports.find(d->activePort); if (it != ports.end()) { p = it->second; // d->setLatencyOffset(p.latency_offset); } } static void setIconByName(QLabel* label, const char* name) { QIcon icon = QIcon::fromTheme(name); int size = label->style()->pixelMetric(QStyle::PM_ToolBarIconSize); QPixmap pix = icon.pixmap(size, size); label->setPixmap(pix); } void UkmediaVolumeControl::updateCard(UkmediaVolumeControl *c, const pa_card_info &info) { const char *description; QMap tempInput; QMap tempOutput; QList profileName; QMapportMap; QMap outputPortNameLabelMap; QMapinputPortNameLabelMap; QMap profilePriorityMap; std::set profile_priorities; // 记录声å�¡é…�置文件优先级 profile_priorities.clear(); for (pa_card_profile_info2 **p_profile = info.profiles2; *p_profile != nullptr; ++p_profile) { if (((*p_profile)->available == PA_PORT_AVAILABLE_UNKNOWN) || ((*p_profile)->available == PA_PORT_AVAILABLE_YES)) { profile_priorities.insert(*p_profile); profileName.append((*p_profile)->name); profilePriorityMap.insert((*p_profile)->name, (*p_profile)->priority); } } cardProfilePriorityMap.insert(info.index, profilePriorityMap); description = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_DESCRIPTION); c->ports.clear(); for (uint32_t i = 0; i < info.n_ports; ++i) { PortInfo p; p.name = info.ports[i]->name; p.description = info.ports[i]->description; p.priority = info.ports[i]->priority; p.available = info.ports[i]->available; p.direction = info.ports[i]->direction; p.latency_offset = info.ports[i]->latency_offset; if (info.ports[i]->profiles2)//bug#92426 该è“�牙音å“�存在输入端å�£æ— è¾“å…¥é…�置文件会导致段错误 for (pa_card_profile_info2 ** p_profile = info.ports[i]->profiles2; *p_profile != nullptr; ++p_profile) { if (((*p_profile)->available == PA_PORT_AVAILABLE_UNKNOWN) || ((*p_profile)->available == PA_PORT_AVAILABLE_YES)) { p.profiles.push_back((*p_profile)->name); } } #ifdef PA_PORT_AVAILABLE_DISABLE if (p.direction == 1 && p.available != PA_PORT_AVAILABLE_NO && p.available != PA_PORT_AVAILABLE_DISABLE) { //portMap.insert(p.name,p.description.data()); //新增UI设计,combobox显示portname+description QString outputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString outputPortName_and_description = outputPortName + "(" + description + ")"; tempOutput.insert(p.name,outputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); outputPortNameLabelMap.insert(p.description.data(),p_profile.data()); qDebug() << "ctf profilename map insert -----------" << p.description.data() << p_profile.data(); } profileNameMap.insert(info.index,outputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } else if (p.direction == 2 && p.available != PA_PORT_AVAILABLE_NO && p.available != PA_PORT_AVAILABLE_DISABLE) { qDebug() << " add source port name "<< info.index << p.name << p.description.data(); QString inputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString inputPortName_and_description = inputPortName + "(" + description + ")"; tempInput.insert(p.name,inputPortName_and_description); for (auto p_profile : p.profiles) { inputPortNameLabelMap.insert(p.description.data(),p_profile.data()); } inputPortProfileNameMap.insert(info.index,inputPortNameLabelMap); } #else if (p.direction == 1 && p.available != PA_PORT_AVAILABLE_NO) { //portMap.insert(p.name,p.description.data()); //新增UI设计,combobox显示portname+description QString outputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString outputPortName_and_description = outputPortName + "(" + description + ")"; tempOutput.insert(p.name,outputPortName_and_description); QList portProfileName; for (auto p_profile : p.profiles) { portProfileName.append(p_profile.data()); outputPortNameLabelMap.insert(p.description.data(),p_profile.data()); qDebug() << "ctf profilename map insert -----------" << p.description.data() << p_profile.data(); } profileNameMap.insert(info.index,outputPortNameLabelMap); cardProfileMap.insert(info.index,portProfileName); } else if (p.direction == 2 && p.available != PA_PORT_AVAILABLE_NO) { qDebug() << " add source port name "<< info.index << p.name << p.description.data(); QString inputPortName = p.description.data();//端å�£å��(如:扬声器,模拟耳机..) QString inputPortName_and_description = inputPortName + "(" + description + ")"; tempInput.insert(p.name,inputPortName_and_description); for (auto p_profile : p.profiles) { inputPortNameLabelMap.insert(p.description.data(),p_profile.data()); } inputPortProfileNameMap.insert(info.index,inputPortNameLabelMap); } #endif c->ports[p.name] = p; } inputPortMap.insert(info.index,tempInput); outputPortMap.insert(info.index,tempOutput); cardActiveProfileMap.insert(info.index,info.active_profile->name); c->profiles.clear(); for (auto p_profile : profile_priorities) { bool hasNo = false, hasOther = false; std::map::iterator portIt; QByteArray desc = p_profile->description; for (portIt = c->ports.begin(); portIt != c->ports.end(); portIt++) { PortInfo port = portIt->second; if (std::find(port.profiles.begin(), port.profiles.end(), p_profile->name) == port.profiles.end()) continue; if (port.available == PA_PORT_AVAILABLE_NO) { hasNo = true; } else { hasOther = true; break; } } if (hasNo && !hasOther) desc += tr(" (unplugged)").toUtf8().constData(); if (!p_profile->available) desc += tr(" (unavailable)").toUtf8().constData(); c->profiles.push_back(std::pair(p_profile->name, desc)); if (p_profile->n_sinks == 0 && p_profile->n_sources == 0) c->noInOutProfile = p_profile->name; } c->activeProfile = info.active_profile ? info.active_profile->name : ""; if (strstr(info.name, "bluez_card")) { getBatteryLevel(info.name); } /* Because the port info for sinks and sources is discontinued we need * to update the port info for them here. */ updatePorts(c,c->ports); Q_EMIT checkDeviceSelectionSianal(&info); } /* 获å�–声å�¡å��,å�‚考aplay -L */ QString card_get(int card) { snd_ctl_t *handle; int err, dev, idx; snd_ctl_card_info_t *info; snd_pcm_info_t *pcminfo; snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); char name[32]; // sprintf(name, "hw:%d", card); snprintf(name, sizeof(name), "hw:%d", card); if ((err = snd_ctl_open(&handle, name, 0)) < 0) { qInfo("control open (%i): %s", card, snd_strerror(err)); return "Error"; } if ((err = snd_ctl_card_info(handle, info)) < 0) { qInfo("control hardware info (%i): %s", card, snd_strerror(err)); snd_ctl_close(handle); return "Error"; } dev = -1; while (1) { unsigned int count; if (dev < 0) break; snd_pcm_info_set_device(pcminfo, dev); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_PLAYBACK); if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { // if (err != -ENOENT) // error("control digital audio info (%i): %s", card, snd_strerror(err)); continue; } qDebug() <<"card_get"<< card << snd_ctl_card_info_get_id(info); count = snd_pcm_info_get_subdevices_count(pcminfo); printf((" Subdevices: %i/%i\n"), snd_pcm_info_get_subdevices_avail(pcminfo), count); for (idx = 0; idx < (int)count; idx++) { snd_pcm_info_set_subdevice(pcminfo, idx); if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { qInfo("control digital audio playback info (%i): %s", card, snd_strerror(err)); } else { printf((" Subdevice #%i: %s\n"), idx, snd_pcm_info_get_subdevice_name(pcminfo)); } } } snd_ctl_close(handle); return snd_ctl_card_info_get_id(info); } void UkmediaVolumeControl::insertJson(const JsonType &type, const QString &key, const QJsonValue &value) { switch (type) { case JsonType::JSON_TYPE_SOUNDEFFECT: // m_pUsrConf->insert(m_pUsrConf->getJsonByType(std::dynamic_pointer_cast(m_pUsrConf)->getJsonMap(), type), // key, value); break; case JsonType::JSON_TYPE_USERINFO: m_pUsrConf->insert(m_pUsrConf->getJsonByType(std::dynamic_pointer_cast(m_pUsrConf)->getJsonMap(), type), key, value); break; default: break; } } /* * æ ¹æ�®å£°å�¡ç´¢å¼•查找声å�¡å�� */ QString UkmediaVolumeControl::findCardName(int index,QMap cardMap) { QMap::iterator it; for(it=cardMap.begin();it!=cardMap.end();) { if (it.key() == index) { return it.value(); } ++it; } return ""; } /* * åˆ�始化默认输出音é‡� */ void UkmediaVolumeControl::initDefaultSinkVolume(const pa_sink_info &info) { QString active_port_name = info.active_port ? info.active_port->name : ""; if (active_port_name.isEmpty() || active_port_name.contains("histen") || customSoundFile->isExist(stringRemoveUnrecignizedChar(active_port_name))) return; if (strstr(info.name, "bluez")) { if (defaultSinkName.contains("bluez")) { Q_EMIT initBlueDeviceVolumeSig(info.index, active_port_name); } return; } int volume; QString outputCardName = findCardName(defaultOutputCard, cardMap); if (active_port_name.contains("headphone", Qt::CaseInsensitive)) { volume = (outputCardName.contains("bluez", Qt::CaseSensitive)) ? OUTPUT_VOLUME : HEADPHONE_VOLUME; } else if (active_port_name.contains("hdmi", Qt::CaseInsensitive)) { volume = HDMI_VOLUME; } else if (active_port_name.contains("speaker", Qt::CaseInsensitive)) { volume = OUTPUT_VOLUME; } else if (active_port_name.contains("lineout", Qt::CaseInsensitive)) { volume = HEADPHONE_VOLUME; } else { volume = OUTPUT_VOLUME; } int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(volume); setSinkVolumeByInfo(info, paVolume); customSoundFile->addXmlNode(active_port_name, false); qDebug() << "initDefaultSinkVolume" << active_port_name << volume; } /* * Update output device when the default output device or port is updated */ bool UkmediaVolumeControl::updateSink(UkmediaVolumeControl *w,const pa_sink_info &info) { bool is_new = false; QString cardStr ="hw:CARD="; int volume = (info.volume.channels >= 2) ? MAX(info.volume.values[0], info.volume.values[1]) : info.volume.values[0]; if (pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { masterSinkDev = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE); } // Initialize the output volume // initDefaultSinkVolume(info); if (strcmp(defaultSinkName.data(), info.name) == 0) { channel = info.volume.channels; channelMap = info.channel_map; sinkIndex = info.index; QString portName = ""; int cardId = 0; if (info.active_port) { portName = info.active_port->name; //获å�–当å‰�声å�¡å�� if(pa_proplist_gets(info.proplist, "alsa.card") && pa_proplist_gets(info.proplist, "alsa.device")) { cardId = atoi(pa_proplist_gets(info.proplist, "alsa.card")); cardStr += card_get(atoi(pa_proplist_gets(info.proplist, "alsa.card"))); cardStr += ",DEV="; cardStr += pa_proplist_gets(info.proplist, "alsa.device"); } } else { portName = ""; } // 是å�¦å�‘é€�音ä¹�æš‚å�œä¿¡å�· // if (isNeedSendPortChangedSignal(portName, sinkPortName, info.name)) { // sendPortChangedSignal(); // } // 是å�¦å�‘é€�声音输出设备切æ�¢å¼¹çª—ä¿¡å�· // sendOsdWidgetSignal(portName, info.description); // å�Œæ­¥sinkPortName if (sinkPortName != portName) { sinkPortName = portName; // sendDeviceChangedSignal(this); } // 更新输出设备ã€�音é‡�ã€�é�™éŸ³çжæ€� insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_CARD_KEY, cardStr); insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_CARDID_KEY, cardId); insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_VOLUME_KEY, UkmediaCommon::getInstance().paVolumeToMediaVolume(volume)); insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_MUTE_KEY, info.mute ? true : false); // å�Œæ­¥é»˜è®¤å£°å�¡index defaultOutputCard = info.card; // å�Œæ­¥éŸ³é‡�,å�Œæ­¥UI balance = pa_cvolume_get_balance(&info.volume,&info.channel_map); refreshVolume(SoundType::SINK, volume, info.mute); } qDebug() << "UpdateSink--->" << "sinkIndex:" << sinkIndex << "sinkPortName:" << sinkPortName << "sinkVolume:" << sinkVolume << "channel:" << channel << "defaultSinkName:" << defaultSinkName.data(); if (info.ports) { QMap temp; for (pa_sink_port_info ** sinkPort = info.ports; *sinkPort != nullptr; ++sinkPort) { temp.insert(info.name,(*sinkPort)->name); } QList > sinkPortMapList; if (sinkPortMap.isEmpty()) { sinkPortMap.insert(info.card,temp); } sinkPortMapList = sinkPortMap.values(); if (!sinkPortMapList.contains(temp)) { sinkPortMap.insert(info.card,temp); } w->ports.clear(); } return is_new; } QString UkmediaVolumeControl::stringRemoveUnrecignizedChar(QString str) { str.remove(" "); str.remove("/"); str.remove("("); str.remove(")"); str.remove("["); str.remove("]"); return str; } /* * stream suspend callback */ static void suspended_callback(pa_stream *s, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (pa_stream_is_suspended(s)) { // w->updateVolumeMeter(pa_stream_get_device_index(s), PA_INVALID_INDEX, -1); } } static void read_callback(pa_stream *s, size_t length, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); const void *data; double v; if (pa_stream_peek(s, &data, &length) < 0) { w->showError(UkmediaVolumeControl::tr("Failed to read data from stream").toUtf8().constData()); return; } if (!data) { /* nullptr data means either a hole or empty buffer. * Only drop the stream when there is a hole (length > 0) */ if (length) pa_stream_drop(s); return; } assert(length > 0); assert(length % sizeof(float) == 0); v = ((const float*) data)[length / sizeof(float) -1]; pa_stream_drop(s); if (v < 0) v = 0; if (v > 1) v = 1; } pa_stream* UkmediaVolumeControl::createMonitorStreamForSource(uint32_t source_idx, uint32_t stream_idx = -1, bool suspend = false) { pa_stream *s; char t[16]; pa_buffer_attr attr; pa_sample_spec ss; pa_stream_flags_t flags; ss.channels = 1; ss.format = PA_SAMPLE_FLOAT32; ss.rate = 25; memset(&attr, 0, sizeof(attr)); attr.fragsize = sizeof(float); attr.maxlength = (uint32_t) -1; snprintf(t, sizeof(t), "%u", source_idx); if (!(s = pa_stream_new(getContext(), tr("Peak detect").toUtf8().constData(), &ss, nullptr))) { showError(tr("Failed to create monitoring stream").toUtf8().constData()); return nullptr; } if (stream_idx != (uint32_t) -1) pa_stream_set_monitor_stream(s, stream_idx); pa_stream_set_read_callback(s, read_callback, this); pa_stream_set_suspended_callback(s, suspended_callback, this); flags = (pa_stream_flags_t) (PA_STREAM_DONT_MOVE | PA_STREAM_PEAK_DETECT | PA_STREAM_ADJUST_LATENCY | (suspend ? PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND : PA_STREAM_NOFLAGS) /*| (!showVolumeMetersCheckButton->isChecked() ? PA_STREAM_START_CORKED : PA_STREAM_NOFLAGS)*/); if (pa_stream_connect_record(s, t, &attr, flags) < 0) { showError(tr("Failed to connect monitoring stream").toUtf8().constData()); pa_stream_unref(s); return nullptr; } return s; } void UkmediaVolumeControl::initDefaultSourceVolume(const pa_source_info &info) { QString active_port_name = info.active_port ? info.active_port->name : ""; if (active_port_name.isEmpty() || active_port_name.contains("3a-algo") || customSoundFile->isExist(stringRemoveUnrecignizedChar(active_port_name))) return; if (active_port_name.contains("hda")) { QString preSourcePortName = active_port_name; int index = preSourcePortName.indexOf("hda-"); preSourcePortName.remove(index, 4); if (customSoundFile->isExist(stringRemoveUnrecignizedChar(preSourcePortName))) { qDebug() << "å› PAé…�置导致端å�£å�˜åŒ–,ä¸�å�šåˆ�始化音é‡�处ç�†"; return; } } else if(active_port_name.contains("alc269vc")) { QString preSourcePortName = active_port_name; int index = preSourcePortName.indexOf("alc269vc-"); preSourcePortName.remove(index, 9); if (customSoundFile->isExist(stringRemoveUnrecignizedChar(preSourcePortName))) { qDebug() << "å› PAé…�置导致端å�£å�˜åŒ–,ä¸�å�šåˆ�始化音é‡�处ç�†"; return; } } int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(MIC_VOLUME); setSourceVolumeByInfo(info, paVolume); customSoundFile->addXmlNode(active_port_name, false); qDebug() << __func__ << active_port_name; } void UkmediaVolumeControl::updateSource(const pa_source_info &info) { int volume = (info.volume.channels >= 2) ? MAX(info.volume.values[0], info.volume.values[1]) : info.volume.values[0]; // Record the masterDevice of noiseReduceSource if (pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { masterDevice = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE); } // Initialize the input volume // initDefaultSourceVolume(info); // Update some variables for the default input if (UKMedia_Equal(defaultSourceName.data(), info.name)) { sourceIndex = info.index; inputChannel = info.volume.channels; QString portName = ""; int inputCard = -1; // Status: this is a filter soource if (pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { masterDevice = pa_proplist_gets(info.proplist, PA_PROP_DEVICE_MASTER_DEVICE); sourceInfo s = getSourceInfoByName(masterDevice); inputCard = s.card; portName = s.active_port_name; qInfo() << "This is a filter source:" << info.name << "master device:" << masterDevice; } // Status: generally else { inputCard = info.card; portName = (info.active_port) ? info.active_port->name : ""; } // 判断是å�¦å�‘é€�端å�£æ”¹å�˜ä¿¡å�· if (sourcePortName != portName || defaultInputCard != inputCard) { // sendSourcePortChangedSignal(); qInfo() << "Send SIGNAL: sourcePortChanged." << sourcePortName << portName << defaultInputCard << inputCard; } // 如果当å‰�端å�£ä¸ºæ—  or 内置Mic,需è¦�关闭侦å�¬GSettings // if (portName.isEmpty() || portName.contains("internal") || portName.contains("Mic1")) { // if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)) { // QGSettings soundSettings(KEY_SOUNDS_SCHEMA); // if(soundSettings.get(LOOP_BACK).toBool()) { // soundSettings.set(LOOP_BACK, "false"); // qInfo() << "Disable GSettings of the Loopback module"; // } // } // } // 当信å�·å�‘é€�完,更新defaultInputCardå’ŒsourcePortName sourcePortName = portName; defaultInputCard = inputCard; refreshVolume(SoundType::SOURCE, volume, info.mute); qInfo() << __func__ << "Status1 defaultSource:" << sourceIndex << defaultSourceName << "sourcePort" << sourcePortName; } /* å¼€å�¯é™�噪状æ€�下,如果这个source存在多个端å�£ï¼Œä¸”ä¸�å�Œç«¯å�£éŸ³é‡�相å�Œæ—¶ï¼Œä¸�会触å�‘ noiseReduceSource 回调,导致无法更新 portName */ else if (UKMedia_Equal(masterDevice.toLatin1().data(), info.name) && UKMedia_Equal(defaultSourceName, "noiseReduceSource")) { if (!UKMedia_Equal(info.active_port->name, sourcePortName.toLatin1().data()) || info.card != defaultInputCard) { // sendSourcePortChangedSignal(); qInfo() << "Send SIGNAL: sourcePortChanged. Status 2"; } defaultInputCard = info.card; sourcePortName = (info.active_port) ? info.active_port->name : ""; qInfo() << __func__ << "Status2 defaultSource:" << sourceIndex << defaultSourceName << "sourcePort" << sourcePortName; } if (info.ports) { QMap temp; for (pa_source_port_info **sourcePort = info.ports; *sourcePort != nullptr; ++sourcePort) { temp.insert(info.name, (*sourcePort)->name); } if (sourcePortMap.isEmpty()) { sourcePortMap.insert(info.card, temp); } if (!sourcePortMap.values().contains(temp)) { sourcePortMap.insert(info.card, temp); } } } void UkmediaVolumeControl::updateSinkInput(const pa_sink_input_info &info) { const char *t; if ((t = pa_proplist_gets(info.proplist, "module-stream-restore.id"))) { if (t && strcmp(t, "sink-input-by-media-role:event") == 0) { g_debug("%s", tr("Ignoring sink-input due to it being designated as an event and thus handled by the Event widget").toUtf8().constData()); return; } } const gchar *description = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_NAME); QString appId = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID); QString appIconName = pa_proplist_gets(info.proplist,PA_PROP_APPLICATION_ICON_NAME);\ const gchar *appBinary = pa_proplist_gets(info.proplist,PA_PROP_APPLICATION_PROCESS_BINARY); qDebug() << "description:" << description << "appId:" << appId << "appIconName:" << appIconName << "appBinary:" << appBinary; appBinary = AppDesktopFileAdaption(appBinary); if (appBinary) { appId = appBinary; appIconName = appBinary; description = appBinary; } else if (appBinary && UKMedia_Equal(appBinary, "kylin-recorder") && UKMedia_Equal(pa_proplist_gets(info.proplist, PA_PROP_MEDIA_NAME), "pulsesink probe")) { return; } else { return; } qDebug() << "updateSinkInput:" << "appIconName:"<< appIconName << "appId:" << appId << "desc:" << description << "appBinary:" << appBinary << info.volume.values[0]; //没制定应用å��ç§°çš„ä¸�加入到应用音é‡�中 if (description && !strstr(description,"QtPulseAudio") && !strstr(description,"ALSA") && !strstr(description,"aplay")) { sinkInputIndexMap.insert(info.index,description); //记录æ¯�个sinkinputçš„index sinkInputValueMap.insert(description,info.volume.values[0]); //记录相å�Œdescription的最新音é‡� sinkInputMuteMap.insert(description,info.mute); if (!sinkInputList.contains(description)) { sinkInputList.append(description); //记录应用的个数 æ�¥å¢žåˆ åº”用widget Q_EMIT addSinkInputSignal(description, appId, info.index, info.volume.values[0], info.volume.channels); } Q_EMIT sinkInputVolumeChangedSignal(description, appId, info.volume.values[0]); //应用音é‡�å�‘生改å�˜æ—¶å�‘é€�ä¿¡å�·æ›´æ–°æ»‘动æ�¡çš„值 // ukcc应用音é‡�需求 sinkInputMap.insert(info.index, addSinkInputInfo(info)); Q_EMIT updateApp(appBinary); } } void UkmediaVolumeControl::updateSourceOutput(const pa_source_output_info &info) { const char *app; bool is_new = false; if ((app = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID))) { if (strcmp(app, "org.PulseAudio.pavucontrol") == 0 || strcmp(app, "org.gnome.VolumeControl") == 0 || strcmp(app, "org.kde.kmixd") == 0) { return; } } const gchar *description = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_NAME); QString appId = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ID); QString appIconName = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_ICON_NAME); const gchar *appBinary = pa_proplist_gets(info.proplist,PA_PROP_APPLICATION_PROCESS_BINARY); qDebug() << "description:" << description << "appId:" << appId << "appIconName:" << appIconName << "appBinary:" << appBinary; appBinary = AppDesktopFileAdaption(appBinary); if (appBinary) { appId = appBinary; description = appBinary; appIconName = appBinary; } else { qDebug() << "updateSourceOutput appBinary is null"; return; } qDebug() << "updateSourceOutput:" << "appIconName:"<< appIconName << "appId:" << appId << "desc:" << description << "appBinary:" << appBinary << info.volume.values[0]; if(description && !strstr(description,"QtPulseAudio") && !strstr(description,"ALSA") && !strstr(description,"Volume Control") && !strstr(description,"aplay")) { sourceOutputIndexMap.insert(info.index,description); //记录所有source-output index sourceOutputValueMap.insert(description,info.volume.values[0]); //记录相å�Œdescription的最新音é‡� sinkInputMuteMap.insert(description,info.mute); if (!sinkInputList.contains(description)) { sinkInputList.append(description); Q_EMIT addSinkInputSignal(description, appId, info.index, info.volume.values[0], info.volume.channels); } if (!sinkInputValueMap.keys().contains(description)) Q_EMIT sinkInputVolumeChangedSignal(description, appId, info.volume.values[0]); // ukcc应用音é‡�需求 sourceOutputMap.insert(info.index, addSourceOutputInfo(info)); Q_EMIT updateApp(description); } } void UkmediaVolumeControl::updateClient(const pa_client_info &info) { g_free(clientNames[info.index]); clientNames[info.index] = g_strdup(info.name); } void UkmediaVolumeControl::updateServer(const pa_server_info &info) { defaultSourceName = info.default_source_name ? info.default_source_name : ""; defaultSinkName = info.default_sink_name ? info.default_sink_name : ""; qDebug() << "updateServer" << "defaultSinkName " << defaultSinkName << "defaultSourceName" << defaultSourceName; } #if HAVE_EXT_DEVICE_RESTORE_API void UkmediaVolumeControl::updateDeviceInfo(const pa_ext_device_restore_info &info) { // if (sinkWidgets.count(info.index)) { // SinkWidget *w; // pa_format_info *format; // w = sinkWidgets[info.index]; // w->updating = true; // /* Unselect everything */ // for (int j = 1; j < PAVU_NUM_ENCODINGS; ++j) // w->encodings[j].widget->setChecked(false); // for (uint8_t i = 0; i < info.n_formats; ++i) { // format = info.formats[i]; // for (int j = 1; j < PAVU_NUM_ENCODINGS; ++j) { // if (format->encoding == w->encodings[j].encoding) { // w->encodings[j].widget->setChecked(true); // break; // } // } // } // w->updating = false; // } } #endif void UkmediaVolumeControl::setConnectionState(gboolean connected) { if (m_connected != connected) { m_connected = connected; if (m_connected) { // connectingLabel->hide(); // notebook->show(); } else { // notebook->hide(); // connectingLabel->show(); } } } void UkmediaVolumeControl::removeCard(uint32_t index) { } void UkmediaVolumeControl::removeSink(uint32_t index) { QMap::iterator it; Q_EMIT removeSinkSignal(); for (it = sinkMap.begin(); it != sinkMap.end();) { if (it.key() == index) { qDebug() << "removeSink" << index; sinkMap.erase(it); break; } ++it; } } void UkmediaVolumeControl::removeSource(uint32_t index) { QMap::iterator it; for (it=sourceMap.begin();it!=sourceMap.end();) { if (it.key() == index) { qDebug() << "removeSource" << index; sourceMap.erase(it); break; } ++it; } } void UkmediaVolumeControl::removeSinkInput(uint32_t index) { QString description = ""; qDebug() << "removeSinkInput" << index; sinkInputMap.remove(index); description = sinkInputIndexMap.value(index); //先获å�–è¦�移除sinkinputçš„description sinkInputIndexMap.remove(index);//移除对应indexçš„sinkinput if(!sinkInputIndexMap.values().contains(description) || sinkInputIndexMap.isEmpty()) { sinkInputValueMap.remove(description);//如果所有相å�Œdescriptionçš„index都被移除,需è¦�移除valueMap对应的description sinkInputMuteMap.remove(description); if(description != "") Q_EMIT removeSinkInputSignal(description);//并移除对应app widget } } void UkmediaVolumeControl::removeSourceOutput(uint32_t index) { QString description = ""; sourceOutputMap.remove(index); description = sourceOutputIndexMap.value(index); sourceOutputIndexMap.remove(index); qDebug() << __func__ << index << description; if(description == "Loopback") isLoadLoopback = false; if(!sourceOutputIndexMap.values().contains(description) || sourceOutputIndexMap.isEmpty()) { sourceOutputValueMap.remove(description); sinkInputMuteMap.remove(description); //sinkinput包å�«å�Œå��应用时,ä¸�å�‘é€�removeä¿¡å�·ï¼Œå�ªæ›´æ–°åº”用类型为仅输出å�¯ç”¨ if(description != "" && !sinkInputIndexMap.values().contains(description)){ Q_EMIT removeSinkInputSignal(description); } else if (description != "") Q_EMIT updateApp(description); } } void UkmediaVolumeControl::removeClient(uint32_t index) { g_free(clientNames[index]); clientNames.erase(index); } void UkmediaVolumeControl::setConnectingMessage(const char *string) { QByteArray markup = ""; if (!string) markup += tr("Establishing connection to PulseAudio. Please wait...").toUtf8().constData(); else markup += string; markup += ""; } void UkmediaVolumeControl::showError(const char *txt) { char buf[256]; snprintf(buf, sizeof(buf), "%s: %s", txt, pa_strerror(pa_context_errno(context))); qWarning() << QString::fromUtf8(buf); } void UkmediaVolumeControl::decOutstanding(UkmediaVolumeControl *w) { if (w->n_outstanding <= 0) return; if (--w->n_outstanding <= 0) { w->setConnectionState(true); } } void UkmediaVolumeControl::cardCb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Card callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->cardMap.insert(i->index,i->name); w->updateCard(w,*i); } void UkmediaVolumeControl::batteryLevelCb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Card callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } qDebug() << "batteryLevelCb" << i->index << eol; const char *battery = pa_proplist_gets(i->proplist,"bluetooth.battery"); QString macAddr = pa_proplist_gets(i->proplist, "device.string"); if (battery) { qDebug() << "get bluetooth battery is:" << battery << atoi(battery); w->batteryLevel = atoi(battery); } else { w->batteryLevel = -1; } Q_EMIT w->bluetoothBatteryChanged(macAddr, w->batteryLevel); } void UkmediaVolumeControl::bluetoothCardCb(pa_context *c, const pa_card_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Card callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } qDebug() << "bluetooth card cb" << i->index << eol; const char *battery = pa_proplist_gets(i->proplist,"bluetooth.battery"); QString macAddr = pa_proplist_gets(i->proplist, "device.string"); if (battery) { qDebug() << "bluetooth battery is ===" << battery << atoi(battery); // char *str = strtok(battery,"."); w->batteryLevel = atoi(battery); } else { w->batteryLevel = -1; } Q_EMIT w->bluetoothBatteryChanged(macAddr, w->batteryLevel); } #if HAVE_EXT_DEVICE_RESTORE_API static void ext_device_restore_subscribeCb(pa_context *c, pa_device_type_t type, uint32_t idx, void *userdata); #endif void UkmediaVolumeControl::sinkIndexCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Sink callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } int volume; QString portName = ""; if (i->volume.channels >= 2) { volume = MAX(i->volume.values[0],i->volume.values[1]); } else { volume = i->volume.values[0]; } w->channel = i->volume.channels; w->sinkIndex = i->index; w->balance = pa_cvolume_get_balance(&i->volume,&i->channel_map); /* å�Œæ­¥sinkPortName三ç§�情况 * case1: 默认声å�¡ç«¯å�£å�¯ç”¨ï¼Œç›´æŽ¥å�Œæ­¥å½“å‰�å�¯ç”¨ç«¯å�£ * case2:默认声å�¡ç«¯å�£ä¸�å�¯ç”¨ï¼Œç«¯å�£è®¾ç½®ä¸ºç©º * case3: 默认声å�¡ä¸ºè™šæ‹Ÿå£°å�¡ï¼ŒæŸ¥æ‰¾master.device声å�¡ä¿¡æ�¯å¹¶å�Œæ­¥ */ if (i->active_port) { portName = i->active_port->name; } else { portName = ""; } if (pa_proplist_gets(i->proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { portName = w->findSinkMasterDeviceInfo(i->proplist, i->name); } // 是å�¦å�‘é€�音ä¹�æš‚å�œä¿¡å�· if (w->isNeedSendPortChangedSignal(portName, w->sinkPortName, i->name)) { // w->sendPortChangedSignal(); } // 是å�¦å�‘é€�声音输出设备切æ�¢å¼¹çª—ä¿¡å�· // w->sendOsdWidgetSignal(portName, i->description); // å�Œæ­¥sinkPortName w->sinkPortName = (w->sinkPortName != portName) ? portName : w->sinkPortName; // å�Œæ­¥é»˜è®¤å£°å�¡index w->defaultOutputCard = i->card; // å�Œæ­¥éŸ³é‡�,å�Œæ­¥UI w->refreshVolume(SoundType::SINK, volume, i->mute); qDebug() << "sinkIndexCb" << w->defaultOutputCard << w->sinkPortName << w->sinkIndex; } void UkmediaVolumeControl::sourceIndexCb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Source callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } int volume; if (i->volume.channels >= 2) { volume = MAX(i->volume.values[0],i->volume.values[1]); } else { volume = i->volume.values[0]; } w->inputChannel = i->volume.channels; w->sourceIndex = i->index; QString portName = ""; int inputCard = -1; if (pa_proplist_gets(i->proplist, PA_PROP_DEVICE_MASTER_DEVICE)) { w->masterDevice = pa_proplist_gets(i->proplist, PA_PROP_DEVICE_MASTER_DEVICE); sourceInfo s = w->getSourceInfoByName(w->masterDevice); inputCard = s.card; portName = s.active_port_name; } else { inputCard = i->card; portName = (i->active_port) ? i->active_port->name : ""; } // 判断是å�¦å�‘é€�端å�£æ”¹å�˜ä¿¡å�· if (w->sourcePortName != portName || w->defaultInputCard != inputCard) { // w->sendSourcePortChangedSignal(); qInfo() << "Send SIGNAL: sourcePortChanged." << w->sourcePortName << portName << w->defaultInputCard << inputCard; } // 当信å�·å�‘é€�完,更新defaultInputCardå’ŒsourcePortName w->sourcePortName = portName; w->defaultInputCard = inputCard; w->refreshVolume(SoundType::SOURCE, volume, i->mute); qDebug() << __func__ << "defaultInputCard" << w->defaultInputCard << "sourcePort" << w->sourcePortName; } void UkmediaVolumeControl::sinkCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) { return; } w->showError(QObject::tr("Sink callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->m_pDefaultSink = i; w->sinkMap.insert(i->index, w->addSinkInfo(*i)); qDebug() << __func__ << "Volume:" << i->volume.values[0] << "isMute:" << i->mute << i->name; w->updateSink(w,*i); } void UkmediaVolumeControl::sourceCb(pa_context *c, const pa_source_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) { return; } w->showError(QObject::tr("Source callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->m_pDefaultSource = i; qInfo() << "sourceCb" << i->index << i->name; w->sourceMap.insert(i->index, w->addSourceInfo(*i)); w->updateSource(*i); } void UkmediaVolumeControl::sinkInputCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Sink input callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } w->updateSinkInput(*i); } void UkmediaVolumeControl::sourceOutputCb(pa_context *c, const pa_source_output_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Source output callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } if (i->source == PA_ID_INVALID) return; if (strstr(i->name,"Loopback")) { w->sourceOutputIndexMap.insert(i->index,"Loopback"); qDebug() << "The module-loopback has been loaded." << w->sourceOutputIndexMap; } qDebug() << "sourceOutputCb" << i->name; w->updateSourceOutput(*i); } void UkmediaVolumeControl::clientCb(pa_context *c, const pa_client_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("Client callback failure").toUtf8().constData()); return; } if (eol > 0) { decOutstanding(w); return; } // qDebug() << "clientCb" << i->name; w->updateClient(*i); } void UkmediaVolumeControl::serverInfoCb(pa_context *, const pa_server_info *i, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (!i) { w->showError(QObject::tr("Server info callback failure").toUtf8().constData()); return; } pa_operation *o; //默认的输出设备改å�˜æ—¶éœ€è¦�获å�–默认的输出音é‡� if (strcmp(w->defaultSinkName.data(),i->default_sink_name) != 0) { //默认输出改å�˜æ—¶æ‰�èµ°sinkindexcb if(!(o = pa_context_get_sink_info_by_name(w->getContext(),i->default_sink_name,sinkIndexCb,w))) { w->showError(tr("pa_context_get_sink_info_by_name() failed").toUtf8().constData()); } } if(!(o = pa_context_get_source_info_by_name(w->getContext(),i->default_source_name,sourceIndexCb,w))){ w->showError(tr("pa_context_get_source_info_by_name() failed").toUtf8().constData()); } qDebug() << "serverInfoCb" << i->default_sink_name << i->default_source_name; w->updateServer(*i); sendDeviceChangedSignal(w); decOutstanding(w); } void UkmediaVolumeControl::serverInfoIndexCb(pa_context *, const pa_server_info *i, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (!i) { w->showError(QObject::tr("Server info callback failure").toUtf8().constData()); return; } pa_operation *o; // qDebug() << "serverInfoIndexCb" << i->default_sink_name << i->default_source_name; w->updateServer(*i); decOutstanding(w); } void UkmediaVolumeControl::getBatteryLevel(QString dev) { pa_operation *o; if (!(o = pa_context_get_card_info_by_name(getContext(), dev.toLatin1().data(), batteryLevelCb, this))) { showError(QObject::tr("pa_context_get_card_info_by_index() failed").toUtf8().constData()); return ; } pa_operation_unref(o); } void UkmediaVolumeControl::extStreamRestoreReadCb( pa_context *c, const pa_ext_stream_restore_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { decOutstanding(w); g_debug(QObject::tr("Failed to initialize stream_restore extension: %s").toUtf8().constData(), pa_strerror(pa_context_errno(c))); return; } if (eol > 0) { decOutstanding(w); return; } } void UkmediaVolumeControl::extStreamRestoreSubscribeCb(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); pa_operation *o; if (!(o = pa_ext_stream_restore_read(c, extStreamRestoreReadCb, w))) { w->showError(QObject::tr("pa_ext_stream_restore_read() failed").toUtf8().constData()); return; } qDebug() << "extStreamRestoreSubscribeCb" ; pa_operation_unref(o); } #if HAVE_EXT_DEVICE_RESTORE_API void ext_device_restore_read_cb( pa_context *, const pa_ext_device_restore_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { w->decOutstanding(w); g_debug(QObject::tr("Failed to initialize device restore extension: %s").toUtf8().constData(), pa_strerror(pa_context_errno(context))); return; } if (eol > 0) { w->decOutstanding(w); return; } /* Do something with a widget when this part is written */ w->updateDeviceInfo(*i); } static void ext_device_restore_subscribeCb(pa_context *c, pa_device_type_t type, uint32_t idx, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); pa_operation *o; if (type != PA_DEVICE_TYPE_SINK) return; if (!(o = pa_ext_device_restore_read_formats(c, type, idx, ext_device_restore_read_cb, w))) { w->showError(QObject::tr("pa_ext_device_restore_read_sink_formats() failed").toUtf8().constData()); return; } pa_operation_unref(o); } #endif void UkmediaVolumeControl::extDeviceManagerReadCb( pa_context *c, const pa_ext_device_manager_info *, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { decOutstanding(w); g_debug(QObject::tr("Failed to initialize device manager extension: %s").toUtf8().constData(), pa_strerror(pa_context_errno(c))); return; } w->canRenameDevices = true; if (eol > 0) { decOutstanding(w); return; } qDebug() << "extDeviceManagerReadCb"; /* Do something with a widget when this part is written */ } void UkmediaVolumeControl::extDeviceManagerSubscribeCb(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); pa_operation *o; if (!(o = pa_ext_device_manager_read(c, extDeviceManagerReadCb, w))) { w->showError(QObject::tr("pa_ext_device_manager_read() failed").toUtf8().constData()); return; } qDebug() << "extDeviceManagerSubscribeCb"; pa_operation_unref(o); } void UkmediaVolumeControl::subscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) { case PA_SUBSCRIPTION_EVENT_SINK: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSink(index); else { pa_operation *o; if (!(o = pa_context_get_sink_info_by_index(c, index, sinkCb, w))) { w->showError(QObject::tr("pa_context_get_sink_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSource(index); else { pa_operation *o; if (!(o = pa_context_get_source_info_by_index(c, index, sourceCb, w))) { w->showError(QObject::tr("pa_context_get_source_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SINK_INPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSinkInput(index); else { pa_operation *o; if (!(o = pa_context_get_sink_input_info(c, index, sinkInputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeSourceOutput(index); else { pa_operation *o; if (!(o = pa_context_get_source_output_info(c, index, sourceOutputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_CLIENT: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) w->removeClient(index); else { pa_operation *o; if (!(o = pa_context_get_client_info(c, index, clientCb, w))) { w->showError(QObject::tr("pa_context_get_client_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; case PA_SUBSCRIPTION_EVENT_SERVER: { pa_operation *o; if (!(o = pa_context_get_server_info(c, serverInfoCb, w))) { w->showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; #ifdef PA_SUBSCRIPTION_EVENT_BLUETOOTH_BATTERY case PA_SUBSCRIPTION_EVENT_BLUETOOTH_BATTERY: qDebug() << "PA_SUBSCRIPTION_EVENT_BLUETOOTH_BATTERY" ; pa_operation *o; if (!(o = pa_context_get_card_info_by_index(c, index, bluetoothCardCb, w))) { w->showError(QObject::tr("pa_context_get_card_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); break; #endif case PA_SUBSCRIPTION_EVENT_CARD: if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) { qDebug() << "remove cards------"; //移除outputPort w->removeSinkPortMap(index); w->removeOutputPortMap(index); w->removeSourcePortMap(index); w->removeInputPortMap(index); Q_EMIT w->updatePortSignal(); w->removeCardMap(index); w->removeCardProfileMap(index); w->removeProfileMap(index); w->removeInputProfile(index); w->removeCard(index); } else { pa_operation *o; if (!(o = pa_context_get_card_info_by_index(c, index, cardCb, w))) { w->showError(QObject::tr("pa_context_get_card_info_by_index() failed").toUtf8().constData()); return; } pa_operation_unref(o); } break; } } void UkmediaVolumeControl::contextStateCallback(pa_context *c, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); g_assert(c); switch (pa_context_get_state(c)) { case PA_CONTEXT_UNCONNECTED: case PA_CONTEXT_CONNECTING: case PA_CONTEXT_AUTHORIZING: case PA_CONTEXT_SETTING_NAME: break; case PA_CONTEXT_READY: { pa_operation *o; qDebug() << "pa_context_get_state" << "PA_CONTEXT_READY" << pa_context_get_state(c); reconnectTimeout = 3; pa_context_set_subscribe_callback(c, subscribeCb, w); if (!(o = pa_context_subscribe(c, (pa_subscription_mask_t) (PA_SUBSCRIPTION_MASK_SINK| PA_SUBSCRIPTION_MASK_SOURCE| PA_SUBSCRIPTION_MASK_SINK_INPUT| PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT| PA_SUBSCRIPTION_MASK_CLIENT| PA_SUBSCRIPTION_MASK_SERVER| PA_SUBSCRIPTION_MASK_CARD), nullptr, nullptr))) { w->showError(QObject::tr("pa_context_subscribe() failed").toUtf8().constData()); return; } pa_operation_unref(o); /* Keep track of the outstanding callbacks for UI tweaks */ w->n_outstanding = 0; if (!(o = pa_context_get_server_info(c, serverInfoCb, w))) { w->showError(QObject::tr("pa_context_get_server_info() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_client_info_list(c, clientCb, w))) { w->showError(QObject::tr("pa_context_client_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_card_info_list(c, cardCb, w))) { w->showError(QObject::tr("pa_context_get_card_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_sink_info_list(c, sinkCb, w))) { w->showError(QObject::tr("pa_context_get_sink_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_source_info_list(c, sourceCb, w))) { w->showError(QObject::tr("pa_context_get_source_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_sink_input_info_list(c, sinkInputCb, w))) { w->showError(QObject::tr("pa_context_get_sink_input_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; if (!(o = pa_context_get_source_output_info_list(c, sourceOutputCb, w))) { w->showError(QObject::tr("pa_context_get_source_output_info_list() failed").toUtf8().constData()); return; } pa_operation_unref(o); w->n_outstanding++; Q_EMIT w->paContextReady(); break; } case PA_CONTEXT_FAILED: w->setConnectionState(false); if (w->context != nullptr) { pa_context_unref(w->context); w->context = nullptr; } qWarning("Connection failed, attempting reconnect"); reconnectTimeout--; if (reconnectTimeout <= 0) { qWarning("reconnect pulseaudio Three times failed"); return; } g_timeout_add_seconds(5, connectToPulse, w); return; case PA_CONTEXT_TERMINATED: default: return; } } void UkmediaVolumeControl::moduleInfoCb(pa_context *c, const pa_module_info *i, int eol, void *userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (eol < 0) { if (pa_context_errno(c) == PA_ERR_NOENTITY) return; w->showError(QObject::tr("moduleInfoCb callback failure").toUtf8().constData()); return; } if(i && strcmp(i->name,w->findModuleStr.toLatin1().data()) == 0) { w->findModuleIndex = i->index; } } pa_context* UkmediaVolumeControl::getContext(void) { g_assert(context); return context; } gboolean UkmediaVolumeControl::connectToPulse(gpointer userdata) { UkmediaVolumeControl *w = static_cast(userdata); if (context) { qWarning("pulseAudio is connected"); return false; } pa_glib_mainloop *m = pa_glib_mainloop_new(g_main_context_default()); api = pa_glib_mainloop_get_api(m); pa_proplist *proplist = pa_proplist_new(); pa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, QObject::tr("Ukui Media Volume Control").toUtf8().constData()); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "org.PulseAudio.pavucontrol"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "audio-card"); pa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "PACKAGE_VERSION"); context = pa_context_new_with_proplist(api, nullptr, proplist); g_assert(context); pa_proplist_free(proplist); pa_context_set_state_callback(context, contextStateCallback, w); if (pa_context_connect(context, nullptr, PA_CONTEXT_NOFAIL, nullptr) < 0) { if (pa_context_errno(context) == PA_ERR_INVALID) { /*w->setConnectingMessage(QObject::tr("Connection to PulseAudio failed. Automatic retry in 5s\n\n" "In this case this is likely because PULSE_SERVER in the Environment/X11 Root Window Properties\n" "or default-server in client.conf is misconfigured.\n" "This situation can also arrise when PulseAudio crashed and left stale details in the X11 Root Window.\n" "If this is the case, then PulseAudio should autospawn again, or if this is not configured you should\n" "run start-pulseaudio-x11 manually.").toUtf8().constData());*/ qFatal("connect pulseaudio failed"); } else { reconnectTimeout--; if (reconnectTimeout <= 0) { qWarning("reconnect pulseaudio Three times failed"); return false; } g_timeout_add_seconds(5, connectToPulse, w); } } return false; } /* * æ ¹æ�®å��称获å�–sink input音é‡� */ int UkmediaVolumeControl::getSinkInputVolume(const gchar *name) { return sinkInputValueMap.value(name); } /* * æ ¹æ�®å��称获å�–source output音é‡� */ int UkmediaVolumeControl::getSourceOutputVolume(const gchar *name) { return sourceOutputValueMap.value(name); } /* * 移除指定索引的output port */ void UkmediaVolumeControl::removeOutputPortMap(int index) { QMap>::iterator it; for (it=outputPortMap.begin();it!=outputPortMap.end();) { if (it.key() == index) { qDebug() << "removeoutputport" <>::iterator it; for (it=inputPortMap.begin();it!=inputPortMap.end();) { if (it.key() == index) { inputPortMap.erase(it); break; } ++it; } } /* * 移除指定索引的card */ void UkmediaVolumeControl::removeCardMap(int index) { QMap::iterator it; for (it=cardMap.begin();it!=cardMap.end();) { if (it.key() == index) { cardMap.erase(it); break; } ++it; } } void UkmediaVolumeControl::removeCardProfileMap(int index) { qDebug() << "removeCardProfileMap"; QMap>::iterator it; QMap>::iterator at; for (it=cardProfileMap.begin();it!=cardProfileMap.end();) { if (it.key() == index) { cardProfileMap.erase(it); break; } ++it; } for (at=cardProfilePriorityMap.begin();at!=cardProfilePriorityMap.cend();) { if (at.key() == index) { cardProfilePriorityMap.erase(at); if(cardProfilePriorityMap.keys().contains(index)) cardProfilePriorityMap.remove(index); break; } ++at; } } void UkmediaVolumeControl::removeSinkPortMap(int index) { qDebug() << "removeSinkPortMap///"; QMap>::iterator it; for(it=sinkPortMap.begin();it!=sinkPortMap.end();){ if(it.key() == index) { //usb耳机一个声å�¡å­˜åœ¨ä¸¤ä¸ªç«¯å�£ï¼Œä½¿ç”¨eraseæ—¶å�ªä¼šæ“¦é™¤ä¸€ä¸ªkey时,导致拔出耳机时没有完全移除key值,需è¦�使用remove将存入的两个相å�Œçš„key值全部删除 //sinkPortMap.erase(it); sinkPortMap.remove(index); break; } ++it; } } void UkmediaVolumeControl::removeSourcePortMap(int index) { qDebug() << "removeSourcePortMap///"; QMap>::iterator it; for(it=sourcePortMap.begin();it!=sourcePortMap.end();){ if(it.key() == index) { sourcePortMap.remove(index); break; } ++it; } } void UkmediaVolumeControl::removeProfileMap(int index) { QMap>::iterator it; qDebug() << "removeProfileMap" << index; for (it=profileNameMap.begin();it!=profileNameMap.end();) { if(it.key() == index) { profileNameMap.erase(it); break; } ++it; } } int UkmediaVolumeControl::findOutputPort(QString name){ QMap>::iterator it; QMap::iterator at; QMap portMap; int count = 0; for (it=outputPortMap.begin();it!=outputPortMap.end();) { portMap = it.value(); for (at=portMap.begin();at!=portMap.end();) { if (at.key() == name) { ++count; } ++at; } ++it; } return count; } void UkmediaVolumeControl::removeInputProfile(int index) { QMap>::iterator it; qDebug() << "removeInputProfile" << index; for (it=inputPortProfileNameMap.begin();it!=inputPortProfileNameMap.end();) { if(it.key() == index){ inputPortProfileNameMap.erase(it); break; } ++it; } } bool UkmediaVolumeControl::isNeedSendPortChangedSignal(QString newPort, QString prePort, QString cardName) { // 端å�£ä¸�å�˜æ—¶ä¸�å�‘é€�ä¿¡å�· if (newPort == prePort) return false; // 切æ�¢åˆ°ç©ºç«¯å�£å�‘é€�ä¿¡å�· if (newPort.isEmpty() && !prePort.isEmpty() && cardName != "mono") { qDebug() << "Send SIGNAL: sinkPortChanged. Case: Switch to a null port" << newPort << prePort; return true; } // æ‹”æ�’设备自动切æ�¢åˆ°æ‰¬å£°å™¨ç«¯å�£æ—¶å�‘é€�ä¿¡å�·ï¼Œç”¨æˆ·ä¸»åŠ¨åˆ‡æ�¢è¾“出时ä¸�å�šä¿¡å�·å�‘é€� if (newPort.contains(SPEAKER) && !cardName.contains("bluez") && !cardName.contains("usb")) { int newPortCount = -1; int prePortCount = -1; newPortCount = findOutputPort(newPort); prePortCount = findOutputPort(prePort); // ä¿�è¯�outputPortMap中å�ªå�«æœ‰ä¸€ä¸ªæ‰¬å£°å™¨ç«¯å�£ï¼Œå¹¶ä¸”之å‰�的端å�£å·²ä¸�在map中 if (newPortCount == 1 && prePortCount == 0) { qDebug() << "Send SIGNAL: sinkPortChanged. Case: Switch to speaker port" << newPort << prePort; return true; } } return false; } void UkmediaVolumeControl::sendPortChangedSignal() { QDBusMessage message = QDBusMessage::createSignal("/","org.ukui.media","sinkPortChanged"); message<<"portChanged"; QDBusConnection::sessionBus().send(message); qDebug() << "sendPortChangedSignal sinkPortChanged "; } void UkmediaVolumeControl::sendSourcePortChangedSignal() { QDBusMessage message = QDBusMessage::createSignal("/","org.ukui.media","sourcePortChanged"); message<<"portChanged"; QDBusConnection::sessionBus().send(message); qDebug() << "sendSourcePortChangedSignal sourcePortChanged "; } int UkmediaVolumeControl::findPortSinkIndex(QString name) { QMap>::iterator it; QMap portNameMap; QMap::iterator tempMap; int cardIndex = -1; for (it=sinkPortMap.begin();it!=sinkPortMap.end();) { portNameMap = it.value(); for (tempMap=portNameMap.begin();tempMap!=portNameMap.end();) { if (tempMap.key() == name) { cardIndex = it.key(); break; } ++tempMap; } ++it; } return cardIndex; } QString UkmediaVolumeControl::findSinkPortName(int cardIndex) { QMap>::iterator it; QMap portNameMap; QMap::iterator tempMap; QString portName = ""; for (it=outputPortMap.begin();it!=outputPortMap.end();) { if(it.key() == cardIndex){ portNameMap = it.value(); for (tempMap=portNameMap.begin();tempMap!=portNameMap.end();) { portName = tempMap.key(); break; } ++tempMap; } ++it; } return portName; } QString UkmediaVolumeControl::findSinkMasterDeviceInfo(pa_proplist *proplist, const char *info_name) { masterSinkDev = pa_proplist_gets(proplist,PA_PROP_DEVICE_MASTER_DEVICE); if (!masterSinkDev.isEmpty()) { int cardIndex = findPortSinkIndex(masterSinkDev); if (cardIndex != -1) { qDebug() << "findSinkMasterDeviceInfo" << sinkPortName << findSinkPortName(cardIndex); defaultOutputCard = findPortSinkIndex(masterSinkDev); return findSinkPortName(cardIndex); } else { qDebug() << "can't find masterDevice info in findSinkMasterDeviceInfo()"; return ""; } } } int UkmediaVolumeControl::findMasterDeviceCardIndex(QString masterDev) { return findPortSinkIndex(masterDev); } /** * @brief UkmediaVolumeControl::refreshVolume * å�‘é€�ä¿¡å�·åˆ·æ–°éŸ³é‡� */ void UkmediaVolumeControl::refreshVolume(int soundType, int info_Vol, bool info_Mute) { switch (soundType) { case SoundType::SINK: { qDebug() << __func__ << "defaultSinkName:" << defaultSinkName; if (defaultSinkName.compare("auto_null") == 0) { info_Mute = true; info_Vol = 0; } if (sinkMuted != info_Mute) { sinkMuted = info_Mute; Q_EMIT updateMute(sinkMuted); } if (sinkVolume != info_Vol) { sinkVolume = info_Vol; sinkMuted = info_Mute; sendVolumeUpdateSignal(); } } break; case SoundType::SOURCE: { if (sourceMuted != info_Mute) { sourceMuted = info_Mute; Q_EMIT updateSourceMute(sourceMuted); } if (sourceVolume != info_Vol) { sourceVolume = info_Vol; sourceMuted = info_Mute; sendSourceVolumeUpdateSignal(); } } break; default: break; } } void UkmediaVolumeControl::sendOsdWidgetSignal(QString portName, QString description) { if (portName == "histen-algo" || defaultSinkName.contains("auto_null")) { return; } if (osdFirstFlag) { m_description = description; osdFirstFlag = false; return; } if (portName != sinkPortName || (sinkPortName == portName && !m_description.contains(description) && !description.contains(m_description))) { QString iconStr = ""; if (portName.contains("headphone", Qt::CaseInsensitive)) { iconStr = "audio-headphones-symbolic"; } else if (portName.contains("headset", Qt::CaseInsensitive)) { iconStr = "audio-headset-symbolic"; } else { iconStr = "audio-volume-high-symbolic"; } // sendOSDDeviceChangedSignal(iconStr); qDebug() << "Send SIGNAL: osdWidgetSignal. Case: sink port has changed" << portName << sinkPortName << description << m_description; } m_description = description; } void UkmediaVolumeControl::UkmediaDbusRegister() { QDBusConnection::sessionBus().unregisterService("org.ukui.media"); QDBusConnection con=QDBusConnection::sessionBus(); if (!con.registerService("org.ukui.media")) qDebug() << "registerService failed" << con.lastError().message(); if (!con.registerObject("/org/ukui/media/control", this, QDBusConnection::ExportAllSlots| QDBusConnection::ExportAllSignals)) qDebug() << "registerObject failed" << con.lastError().message(); } sinkInfo UkmediaVolumeControl::addSinkInfo(const pa_sink_info& i) { sinkInfo info; info.name = i.name; info.index = i.index; info.description = i.description; info.volume = i.volume; info.mute = i.mute; info.card = i.card; if (i.active_port) { info.active_port_name = i.active_port->name; info.active_port_description = i.active_port->description; } if (pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) info.master_device = pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE); if (i.ports) { for (pa_sink_port_info** sinkPort = i.ports; *sinkPort != nullptr; ++sinkPort) { portInfo pInfo; pInfo.name = (*sinkPort)->name; pInfo.description = (*sinkPort)->description; pInfo.priority = (*sinkPort)->priority; pInfo.available = (*sinkPort)->available; info.sink_port_list.append(pInfo); } } return info; } sourceInfo UkmediaVolumeControl::addSourceInfo(const pa_source_info& i) { sourceInfo info; info.name = i.name; info.index = i.index; info.description = i.description; info.volume = i.volume; info.mute = i.mute; info.card = i.card; if (i.active_port) { info.active_port_name = i.active_port->name; info.active_port_description = i.active_port->description; } if (pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE)) info.master_device = pa_proplist_gets(i.proplist, PA_PROP_DEVICE_MASTER_DEVICE); if (i.ports) { for (pa_source_port_info** sourcePort = i.ports; *sourcePort != nullptr; ++sourcePort) { portInfo pInfo; pInfo.name = (*sourcePort)->name; pInfo.description = (*sourcePort)->description; pInfo.priority = (*sourcePort)->priority; pInfo.available = (*sourcePort)->available; info.source_port_list.append(pInfo); } } return info; } appInfo UkmediaVolumeControl::addSinkInputInfo(const pa_sink_input_info& info) { appInfo app; app.name = AppDesktopFileAdaption(pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_PROCESS_BINARY)); #ifdef PA_PROP_APPLICATION_MOVE app.move = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_MOVE); #endif app.index = info.index; app.mute = info.mute; app.volume = info.volume.values[0]; app.channel = info.volume.channels; app.direction = PA_STREAM_PLAYBACK; app.masterIndex = info.sink; sinkInfo sink = getSinkInfoByIndex(info.sink); app.masterDevice = sink.name; return app; } appInfo UkmediaVolumeControl::addSourceOutputInfo(const pa_source_output_info& info) { appInfo app; app.name = AppDesktopFileAdaption(pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_PROCESS_BINARY)); #ifdef PA_PROP_APPLICATION_MOVE app.move = pa_proplist_gets(info.proplist, PA_PROP_APPLICATION_MOVE); #endif app.index = info.index; app.mute = info.mute; app.volume = info.volume.values[0]; app.channel = info.volume.channels; app.direction = PA_STREAM_RECORD; app.masterIndex = info.source; sourceInfo source = getSourceInfoByIndex(info.source); app.masterDevice = source.name; return app; } /* * 通过 sink-input name 寻找对应 index */ QList UkmediaVolumeControl::findAppIndex(int soundType, QString appName) { QList appIndexList; QMap appMap; QMap::iterator it; if (SoundType::SINK == soundType) appMap = sinkInputIndexMap; else if (SoundType::SOURCE == soundType) appMap = sourceOutputIndexMap; for (it = appMap.begin(); it != appMap.end(); it++) { if (appName == it.value()) appIndexList.append(it.key()); } return appIndexList; } void UkmediaVolumeControl::simple_callback(pa_context *c, int success, void *userdata) { if (!success) { qDebug() << "move failed" << pa_strerror(pa_context_errno(c)); return; } } const gchar* UkmediaVolumeControl::AppDesktopFileAdaption(const gchar* appName) { if (appName == nullptr) return nullptr; //æŸ�些第三方应用获å�–到appName与它的desktop文件å��ä¸�一致,需手动适é…� if (UKMedia_Equal(appName, "aplay")) appName = nullptr; else if (UKMedia_Equal(appName, "kylin-kmre-audio")) appName = nullptr; else if (UKMedia_Equal(appName, "ukui-powermanagement")) appName = nullptr; else if (UKMedia_Equal(appName, "wpp")) appName = "wps-office-wpp"; else if (UKMedia_Equal(appName, "wine-preloader")) appName = "kylin-kwre-wechat"; else if (strstr(appName, "qaxbrowser")) appName = "qaxbrowser-safe"; else if (strstr(appName, "browser360")) appName = "browser360-cn"; return appName; } void UkmediaVolumeControl::sendDeviceChangedSignal(UkmediaVolumeControl* w) { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® if (nullptr == w) { qDebug() << "w is null"; return; } static UkmediaVolumeControl* control = w; static bool isConnect = false; if (deviceChangedTimer.isActive()) { deviceChangedTimer.stop(); } deviceChangedTimer.setInterval(300); deviceChangedTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&deviceChangedTimer, &QTimer::timeout, control, [&control](){ qDebug() << "deviceChangedSignal"; if (control) { Q_EMIT control->deviceChangedSignal(); } }); } deviceChangedTimer.start(); //end } void UkmediaVolumeControl::sendVolumeUpdateSignal() { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static bool isConnect = false; if (m_updateVolumeTimer.isActive()) { m_updateVolumeTimer.stop(); } m_updateVolumeTimer.setInterval(150); m_updateVolumeTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&m_updateVolumeTimer, &QTimer::timeout, this, [&](){ qDebug() << "refreshVolume sinkVolume:" << sinkVolume; Q_EMIT this->updateVolume(sinkVolume); }); } m_updateVolumeTimer.start(); //end } void UkmediaVolumeControl::sendSourceVolumeUpdateSignal() { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static bool isConnect = false; if (m_updateSourceVolumeTimer.isActive()) { m_updateSourceVolumeTimer.stop(); } m_updateSourceVolumeTimer.setInterval(150); m_updateSourceVolumeTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&m_updateSourceVolumeTimer, &QTimer::timeout, this, [&](){ qDebug() << "refreshVolume sourceVolume:" << sourceVolume; Q_EMIT this->updateSourceVolume(sourceVolume); }); } m_updateSourceVolumeTimer.start(); //end } void UkmediaVolumeControl::sendOSDDeviceChangedSignal(QString icon) { //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static QString iconStr = ""; iconStr = icon; static bool isConnect = false; if (m_osdDeviceChangedTimer.isActive()) { m_osdDeviceChangedTimer.stop(); } m_osdDeviceChangedTimer.setInterval(300); m_osdDeviceChangedTimer.setSingleShot(true); if (!isConnect) { isConnect = QObject::connect(&m_osdDeviceChangedTimer, &QTimer::timeout, this, [&](){ qDebug() << "device_changed_signal iconStr:" << iconStr; Q_EMIT this->device_changed_signal(iconStr); }); } m_osdDeviceChangedTimer.start(); //end } sinkInfo UkmediaVolumeControl::getSinkInfoByIndex(int index) { QMap::iterator it; for (it = sinkMap.begin(); it != sinkMap.end(); ++it) { if (index == it.key()) return it.value(); } qInfo() << "Can't find sink info by index" << index; return {}; } sinkInfo UkmediaVolumeControl::getSinkInfoByName(QString name) { QMap::iterator it; for (it = sinkMap.begin(); it != sinkMap.end(); ++it) { if (name == it.value().name) return it.value(); } qInfo() << "Can't find sink info by name" << name; return {}; } sourceInfo UkmediaVolumeControl::getSourceInfoByIndex(int index) { QMap::iterator it; for (it = sourceMap.begin(); it != sourceMap.end(); ++it) { if (index == it.key()) return it.value(); } qInfo() << "Can't find source info by index" << index; return {}; } sourceInfo UkmediaVolumeControl::getSourceInfoByName(QString name) { QMap::iterator it; for (it = sourceMap.begin(); it != sourceMap.end(); ++it) { if (name == it.value().name) return it.value(); } qInfo() << "Can't find source info by name" << name; return {}; } ukui-media/ukui-volume-control-applet-qt/ukui_list_widget_item.cpp0000664000175000017500000000546415170052044024503 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 setFixedSize(404,48); hLayout = new QHBoxLayout(this); portLabel = new FixLabel(this); deviceLabel = new QLabel(this); deviceButton = new QPushButton(this); portLabel->setFixedSize(326,24); deviceLabel->setFixedSize(326,24); deviceLabel->hide(); // 记录cardname deviceButton->setFixedSize(36,36); deviceButton->setCheckable(true); deviceButton->setProperty("isRoundButton", true); deviceButton->setProperty("useButtonPalette", true); deviceButton->setProperty("needTranslucent", true); hLayout->addWidget(deviceButton); hLayout->addSpacing(12); hLayout->addWidget(portLabel); hLayout->setSpacing(0); this->setLayout(hLayout); hLayout->setContentsMargins(14,6,24,6); this->show(); } void UkuiListWidgetItem::setButtonIcon(QString iconName) { QString iconStr; if (iconName.contains("headphone", Qt::CaseInsensitive)) iconStr = "audio-headphones-symbolic"; else if (iconName.contains("headset", Qt::CaseInsensitive)) iconStr = "audio-headset-symbolic"; else iconStr = "audio-volume-high-symbolic"; deviceButton->setIcon(QIcon::fromTheme(iconStr)); } void UkuiListWidgetItem::setLabelText(QString portLabel, QString deviceLabel) { this->portLabel->setText(portLabel,true); this->deviceLabel->setText(deviceLabel); } void UkuiListWidgetItem::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); qDebug() << "Mouse Press Event" << this->portLabel->fullText << this->deviceLabel->text(); //è“�牙输入去除勾选 if (this->deviceLabel->text().contains("bluez_card")) { if (isCheckBluetoothInput == false) isCheckBluetoothInput = true; else { isCheckBluetoothInput = false; QString cmd = "pactl set-card-profile "+this->deviceLabel->text()+" a2dp_sink"; system(cmd.toLocal8Bit().data()); } } } UkuiListWidgetItem::~UkuiListWidgetItem() { } ukui-media/ukui-volume-control-applet-qt/ukmedia_custom_class.cpp0000664000175000017500000002541615170054730024313 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #define TIMER_TIMEOUT (2*1000) #define FOREGROUND_COLOR_NORMAL qApp->palette().text().color() extern double transparency; UkuiApplicationWidget::UkuiApplicationWidget(QWidget *parent) { // this->setAttribute(Qt::WA_TranslucentBackground); // this->setStyleSheet("QWiget{background:rgba(0,0,0,0);}"); Q_UNUSED(parent); } void UkuiApplicationWidget::paintEvent(QPaintEvent *e) { QStyleOption opt; opt.initFrom(this); QPainter p(this); double transparence = transparency * 255; QColor color = palette().color(QPalette::Base); color.setAlpha(transparence); QBrush brush = QBrush(QColor(0,0,0,0)); p.setBrush(brush); p.setBrush(this->palette().base()); p.setBrush(QBrush(QColor(19, 19, 20, 0))); p.setPen(Qt::NoPen); QPainterPath path; opt.rect.adjust(0,0,0,0); path.addRoundedRect(opt.rect,0,0); p.setRenderHint(QPainter::Antialiasing); // å��锯齿; p.drawRoundedRect(opt.rect,0,0); setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } UkuiApplicationWidget::~UkuiApplicationWidget() { } static inline qreal mixQreal(qreal a, qreal b, qreal bias) { return a + (b - a) * bias; } QColor mixColor(const QColor &c1, const QColor &c2, qreal bias) { if (bias <= 0.0) { return c1; } if (bias >= 1.0) { return c2; } if (qIsNaN(bias)) { return c1; } qreal r = mixQreal(c1.redF(), c2.redF(), bias); qreal g = mixQreal(c1.greenF(), c2.greenF(), bias); qreal b = mixQreal(c1.blueF(), c2.blueF(), bias); qreal a = mixQreal(c1.alphaF(), c2.alphaF(), bias); return QColor::fromRgbF(r, g, b, a); } void UkuiSettingButton::onPaletteChanged() { m_foregroundColor = FOREGROUND_COLOR_NORMAL; this->repaint(); } void UkuiSettingButton::setPressColor() { QColor hightlight = this->palette().color(QPalette::Active,QPalette::Highlight); QColor mix = this->palette().color(QPalette::Active,QPalette::BrightText); m_foregroundColor = mixColor(hightlight, mix, 0.05); } void UkuiSettingButton::setHoverColor() { QColor hightlight = this->palette().color(QPalette::Active,QPalette::Highlight); QColor mix = this->palette().color(QPalette::Active,QPalette::BrightText); m_foregroundColor = mixColor(hightlight, mix, 0.2); } void UkuiSettingButton::setNormalColor() { m_foregroundColor = FOREGROUND_COLOR_NORMAL; } UkuiSettingButton::UkuiSettingButton(QWidget *parent) { connect(qApp, &QApplication::paletteChanged, this, &UkuiSettingButton::onPaletteChanged); onPaletteChanged(); } UkuiSettingButton::~UkuiSettingButton() { } void UkuiSettingButton::paintEvent(QPaintEvent *event) { QPalette pal = this->palette(); pal.setColor(QPalette::WindowText, m_foregroundColor); this->setPalette(pal); return QLabel::paintEvent(event); } void UkuiSettingButton::enterEvent(QEvent *event) { setHoverColor(); this->update(); } void UkuiSettingButton::leaveEvent(QEvent *event) { setNormalColor(); this->update(); } void UkuiSettingButton::mousePressEvent(QMouseEvent *event) { setPressColor(); this->update(); return QLabel::mousePressEvent(event); } void UkuiSettingButton::mouseReleaseEvent(QMouseEvent *event) { setHoverColor(); this->update(); Q_EMIT clicked(); return QLabel::mouseReleaseEvent(event); } AudioSlider::AudioSlider(QWidget *parent) : KSlider(parent) { Q_UNUSED(parent); setRange(0,100); setSliderType(SmoothSlider); setOrientation(Qt::Horizontal); setFocusPolicy(Qt::StrongFocus); setNodeVisible(false); } void AudioSlider::wheelEvent(QWheelEvent *e) { if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::wheelEvent(e); } void AudioSlider::keyReleaseEvent(QKeyEvent *e) { if (e->key() == Qt::Key_VolumeMute) { qDebug() << "AudioSlider keyReleaseEvent " << e->key(); // 过滤掉快æ�·é”®çš„æ“�作 e->ignore(); // 忽略该事件 return; } //start 长按左键或者下键调低音é‡� if (e->isAutoRepeat()) { if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return; } //end if (this->value() != blueValue) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::keyReleaseEvent(e); } void AudioSlider::mouseMoveEvent(QMouseEvent *e) { isMouseWheel = true; if (this->value() - blueValue >= 10 || blueValue - this->value() >= 10) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::mouseMoveEvent(e); } void AudioSlider::mouseReleaseEvent(QMouseEvent *e) { isMouseWheel = false; if (this->value() != blueValue) { blueValue = this->value(); Q_EMIT blueValueChanged(blueValue); } return KSlider::mouseReleaseEvent(e); } AudioSlider::~AudioSlider() { } void UkuiButtonDrawSvg::init(QImage img, QColor color) { themeIcon.image = img; themeIcon.color = color; } void UkuiButtonDrawSvg::paintEvent(QPaintEvent *event) { QStyleOptionComplex opt; opt.initFrom(this); QPainter p(this); QColor color; switch (buttonState) { case PUSH_BUTTON_NORMAL: color = QColor(0x25,0x25,0x25,0xFF); break; case PUSH_BUTTON_CLICK: color = QColor(0x37,0x90,0xFA,0xFF); break; case PUSH_BUTTON_PRESS: color = QColor(0x24,0x6D,0xD4,0xFF); break; default: break; } p.setBrush(QBrush(color)); p.setPen(Qt::NoPen); QPainterPath path; opt.rect.adjust(0,0,0,0); path.addRoundedRect(opt.rect,18,18); p.setRenderHint(QPainter::Antialiasing); // å��锯齿; p.drawRoundedRect(opt.rect,18,18); setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); style()->drawComplexControl(QStyle::CC_ToolButton,&opt,&p,this); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); // QStyleOption opt; // opt.initFrom(this); // QPainter p(this); // p.setBrush(QBrush(QColor(0x13,0x13,0x14,0x00))); // p.setPen(Qt::NoPen); // QPainterPath path; // opt.rect.adjust(0,0,0,0); // path.addRoundedRect(opt.rect,18,18); // p.setRenderHint(QPainter::Antialiasing); // å��锯齿; // p.drawRoundedRect(opt.rect,18,18); // setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } QRect UkuiButtonDrawSvg::IconGeometry() { QRect res = QRect(QPoint(0,0),QSize(24,24)); res.moveCenter(QRect(0,0,width(),height()).center()); return res; } void UkuiButtonDrawSvg::draw(QPaintEvent* e) { Q_UNUSED(e); QPainter painter(this); QRect iconRect = IconGeometry(); if (themeIcon.image.size() != iconRect.size()) { themeIcon.image = themeIcon.image.scaled(iconRect.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QRect r = themeIcon.image.rect(); r.moveCenter(iconRect.center()); iconRect = r; } this->setProperty("fillIconSymbolicColor", true); filledSymbolicColoredPixmap(themeIcon.image,themeIcon.color); painter.drawImage(iconRect, themeIcon.image); } bool UkuiButtonDrawSvg::event(QEvent *event) { switch (event->type()) { case QEvent::Paint: draw(static_cast(event)); break; case QEvent::Move: case QEvent::Resize: { QRect rect = IconGeometry(); } break; case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: event->accept(); break; default: break; } return QPushButton::event(event); } UkuiButtonDrawSvg::UkuiButtonDrawSvg(QWidget *parent) { Q_UNUSED(parent); } UkuiButtonDrawSvg::~UkuiButtonDrawSvg() { } QPixmap UkuiButtonDrawSvg::filledSymbolicColoredPixmap(QImage &img, QColor &baseColor) { for (int x = 0; x < img.width(); x++) { for (int y = 0; y < img.height(); y++) { auto color = img.pixelColor(x, y); if (color.alpha() > 0) { int hue = color.hue(); if (!qAbs(hue - symbolic_color.hue()) < 10) { color.setRed(baseColor.red()); color.setGreen(baseColor.green()); color.setBlue(baseColor.blue()); img.setPixelColor(x, y, color); } } } } return QPixmap::fromImage(img); } FixLabel::FixLabel(QWidget *parent): QLabel(parent) { } FixLabel::FixLabel(QString text , QWidget *parent): QLabel(parent) { this->setText(text); } FixLabel::~FixLabel() { } void FixLabel::paintEvent(QPaintEvent *event) { QFontMetrics fontMetrics(this->font()); int fontSize = fontMetrics.horizontalAdvance(fullText); if (fontSize > this->width()) { this->setText(fontMetrics.elidedText(fullText, Qt::ElideRight, this->width()), false); this->setToolTip(fullText); } else { this->setText(fullText, false); this->setToolTip(""); } QLabel::paintEvent(event); } void FixLabel::setText(const QString & text, bool saveTextFlag) { if (saveTextFlag) fullText = text; QLabel::setText(text); } Divider::Divider(QWidget * parent) : QFrame(parent) { this->setFixedSize(420,1); } void Divider::paintEvent(QPaintEvent * e) { QPainter p(this); QColor color = qApp->palette().color(QPalette::BrightText); color.setAlphaF(0.08); p.save(); p.setBrush(color); p.setPen(Qt::transparent); p.drawRoundedRect(this->rect(), 6, 6); p.restore(); return QFrame::paintEvent(e); } ukui-media/ukui-volume-control-applet-qt/ukui_volume_control_user_config.cpp0000664000175000017500000000407515170054730026602 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukui_volume_control_user_config.h" #include UkuiVolumeControlUserConfig::UkuiVolumeControlUserConfig() { initJsonMap(); } UkuiVolumeControlUserConfig::~UkuiVolumeControlUserConfig() { } std::unordered_map> UkuiVolumeControlUserConfig::getJsonMap() const { return m_jsonMap; } void UkuiVolumeControlUserConfig::initJsonMap() { for (const auto& [k, v] : m_keys) { std::shared_ptr json = nullptr; switch (k) { case JsonType::JSON_TYPE_SOUNDEFFECT: { json = std::make_shared(v()); break; } case JsonType::JSON_TYPE_USERINFO: { json = std::make_shared(v()); json->init(); break; } default: break; } if (json) { m_jsonMap.emplace(k, json); } } } QString UkuiVolumeControlUserConfig::getSoundEffectFullPath() { return SOUND_EFFECT_JSON; } QString UkuiVolumeControlUserConfig::getUserInfoFullPath() { QString path = getenv("HOME"); path.append(AUDIO_JSON); syslog(LOG_DEBUG, "usr info file path: %s.", path.toLatin1().data()); return path; } ukui-media/ukui-volume-control-applet-qt/ukmedia_application_volume_widget.cpp0000664000175000017500000001754615170054730027056 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include ApplicationVolumeWidget::ApplicationVolumeWidget(QWidget *parent) : QWidget (parent) { connect(qApp, &QApplication::paletteChanged, this, &ApplicationVolumeWidget::onPaletteChanged); app_volume_list = new QStringList; //系统音é‡�label systemVolumeLabel = new QLabel(tr("System Volume"),this); QWidget *systemVolumeLabelWidget = new QWidget(this); systemVolumeLabelWidget->setFixedSize(412,29); systemVolumeLabel->setFixedSize(372,29); QHBoxLayout *systemVolumeLabelLayout = new QHBoxLayout; systemVolumeLabelLayout->addWidget(systemVolumeLabel); systemVolumeLabelWidget->setLayout(systemVolumeLabelLayout); systemVolumeLabelLayout->setContentsMargins(16,0,24,0); //应用label applicationLabel = new QLabel(tr("Application Volume"),this); QWidget *applicationLabelWidget = new QWidget(this); applicationLabelWidget->setFixedSize(412,29); applicationLabel->setFixedSize(372,29); QHBoxLayout *applicationLabelLayout = new QHBoxLayout; applicationLabelLayout->addWidget(applicationLabel); applicationLabelWidget->setLayout(applicationLabelLayout); applicationLabelLayout->setContentsMargins(16,0,24,0); //文本颜色置ç�° QPalette palette = applicationLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); applicationLabel->setPalette(palette); systemVolumeLabel->setPalette(palette); //音é‡�滑动æ�¡ systemVolumeSliderWidget = new QWidget(this); systemVolumeSliderWidget->setFixedSize(412,48); systemVolumeBtn = new QPushButton(systemVolumeSliderWidget); systemVolumeBtn->setFixedSize(36,36); systemVolumeBtn->setCheckable(true); systemVolumeBtn->setProperty("isRoundButton",true); //圆形按钮 systemVolumeBtn->setProperty("useButtonPalette",true); //ç�°è‰²æŒ‰é’® systemVolumeBtn->setProperty("needTranslucent", true); //ç�°è‰²å�Šé€�明按钮 systemVolumeSlider = new AudioSlider(systemVolumeSliderWidget); systemVolumeSlider->setOrientation(Qt::Horizontal); systemVolumeSlider->setFocusPolicy(Qt::StrongFocus); systemVolumeSlider->setProperty("needTranslucent", true); // Increase translucent effect systemVolumeSlider->setRange(0,100); systemVolumeSlider->setFixedSize(286,48); systemVolumeDisplayLabel = new QLabel(systemVolumeSliderWidget); systemVolumeDisplayLabel->setText("0%"); systemVolumeDisplayLabel->setFixedSize(52,48); //系统音é‡�滑动æ�¡å¸ƒå±€ QHBoxLayout *systemVolumeSliderLayout = new QHBoxLayout(); systemVolumeSliderLayout->addWidget(systemVolumeBtn); systemVolumeSliderLayout->addSpacing(0); systemVolumeSliderLayout->addWidget(systemVolumeSlider); systemVolumeSliderLayout->addWidget(systemVolumeDisplayLabel); systemVolumeSliderLayout->setSpacing(0); systemVolumeSliderWidget->setLayout(systemVolumeSliderLayout); systemVolumeSliderLayout->setContentsMargins(16,0,24,0); systemVolumeSlider->setObjectName("systemVolumeSlider"); //声音设置布局 volumeSettingButton = new UkuiSettingButton(volumeSettingFrame); volumeSettingButton->setText(tr("Sound Settings")); volumeSettingButton->setCursor(Qt::PointingHandCursor); volumeSettingButton->setScaledContents(true); volumeSettingFrame = new QFrame(this); volumeSettingFrame->setFixedHeight(52); QHBoxLayout *volumeSettingLayout = new QHBoxLayout(volumeSettingFrame); volumeSettingLayout->addWidget(volumeSettingButton); volumeSettingLayout->addStretch(); volumeSettingFrame->setLayout(volumeSettingLayout); volumeSettingLayout->setContentsMargins(16,0,24,0); //应用音é‡�widget appArea = new QScrollArea(this); appArea->setFixedSize(412,245); appArea->setFrameShape(QFrame::NoFrame);//bjc去掉appArea的边框 appArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); appArea->verticalScrollBar()->setProperty("drawScrollBarGroove",false);//滚动æ�¡èƒŒæ™¯é€�明 QPalette pal = appArea->palette(); pal.setColor(QPalette::Window, QColor(0x00,0xff,0x00,0x00)); //改å�˜appArea背景色é€�明 appArea->setPalette(pal); displayAppVolumeWidget = new UkuiApplicationWidget(appArea); displayAppVolumeWidget->setFixedWidth(412); displayAppVolumeWidget->setAttribute(Qt::WA_TranslucentBackground); appArea->setWidget(displayAppVolumeWidget); m_pVlayout = new QVBoxLayout(displayAppVolumeWidget); displayAppVolumeWidget->setLayout(m_pVlayout); // this->setObjectName("mainWidget"); // setObjectName("appWidget"); //整体布局 QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(systemVolumeLabelWidget); mainLayout->addSpacing(3); mainLayout->addWidget(systemVolumeSliderWidget); mainLayout->addSpacing(13); mainLayout->addWidget(applicationLabelWidget); mainLayout->addSpacing(3); mainLayout->addWidget(appArea); mainLayout->addSpacing(2); mainLayout->addWidget(volumeSettingFrame); mainLayout->setSpacing(0); this->setLayout(mainLayout); mainLayout->setContentsMargins(8,12,0,0); this->setFixedSize(420,436); } //void ApplicationVolumeWidget::fullushBlueRecordStream() //{ // isRecording = true; // outputFile.setFileName("/tmp/test.raw"); // outputFile.open( QIODevice::WriteOnly | QIODevice::Truncate ); // QAudioFormat format; // format.setSampleRate(8000); // format.setChannelCount(1); // format.setSampleSize(8); // format.setCodec("audio/pcm"); // format.setByteOrder(QAudioFormat::LittleEndian); // format.setSampleType(QAudioFormat::UnSignedInt); // QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); // qDebug() << "input device" << info.deviceName(); // if (!info.isFormatSupported(format)) // { // qWarning()<<"default format not supported try to use nearest"; // format = info.nearestFormat(format); // } // qDebug() << "准备è“�牙录音-------"; // audio = new QAudioInput(info, format, this); // audio->start(&outputFile); //} //void ApplicationVolumeWidget::deleteBlueRecordStream() //{ // isRecording = false; // qDebug() << "å�œæ­¢å½•制-------"; // audio->stop(); // outputFile.close(); // system("rm /tmp/test.raw"); // delete audio; //} void ApplicationVolumeWidget::setLabelAlignment(Qt::Alignment alignment) { systemVolumeDisplayLabel->setAlignment(alignment); } void ApplicationVolumeWidget::onPaletteChanged(){ QPalette palette = applicationLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); applicationLabel->setPalette(palette); systemVolumeLabel->setPalette(palette); } void ApplicationVolumeWidget::setVolumeSliderRange(bool status) { int maxValue = (status) ? 125 : 100; systemVolumeSlider->blockSignals(true); systemVolumeSlider->setRange(0, maxValue); systemVolumeSlider->blockSignals(false); } ApplicationVolumeWidget::~ApplicationVolumeWidget() { // delete app_volume_list; // delete appIconBtn; } ukui-media/ukui-volume-control-applet-qt/ukmedia_monitor_window_thread.cpp0000664000175000017500000001073015170054730026212 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 UkmediaMonitorWindowThread::UkmediaMonitorWindowThread() { bStopThread = false; bCreateWindow = false; bFirstEnterSystem = true; } void UkmediaMonitorWindowThread::get_window_nameAndid() { Display *display; Window rootwin; display = XOpenDisplay( NULL ); rootwin = DefaultRootWindow( display ); Atom atom = XInternAtom(display, "WM_DELETE_WINDOW", false); XSelectInput( display, rootwin, SubstructureNotifyMask | ExposureMask);/*事件å�¯ä»¥å�‚考x.h*/ XEvent event; // while ( 1 ) // { // printf("get event\n"); fflush(stdout); while (true) { XNextEvent(display, &event ); // printf("event type is %d\n",event.type); fflush(stdout); if (event.type == Expose /*ReparentNotify*/ /*&& bCreateWindow == false*/) { printf("ReparentNotify\n\n"); fflush(stdout); if (bFirstEnterSystem == false) { Window x11window; Display *x11display; char **srname = (char **)malloc(sizeof(char *)); XReparentEvent *reparentevent = (XReparentEvent *)&event; //printf( "new window: %ld \n", (unsigned long)(reparentevent->window)); //printf( "new parent: %ld \n", (unsigned long)(reparentevent->parent)); fflush(stdout); windowId.append((unsigned long)reparentevent->window); /*获å�–到新建窗å�£çš„window ID*/ x11window = (unsigned long)(reparentevent->window); x11display =(reparentevent->display); XFetchName(x11display, x11window, srname); x11display = XOpenDisplay( NULL );/*ï¼�ï¼�ï¼�注æ„�这里以å�Žå¦‚果你想对获å�–到的window ID进行æ“�作必须é‡�新链接*/ fflush(stdout); free(srname); bCreateWindow = true; XCloseDisplay(x11display); } bFirstEnterSystem = false; } else if (event.type == /*DestroyNotify*//*ClientMessage*/ UnmapNotify /*&&*/ /*bCreateWindow*/) { bCreateWindow = false; // 执行用户定义的关闭窗å�£æ“�作 fflush(stdout); Window x11window; Display *x11display; char **srname = (char **)malloc(sizeof(char *)); XUnmapEvent *reparentevent = (XUnmapEvent *)&event; //printf( "close window: %ld \n", (unsigned long)(reparentevent->window)); fflush(stdout); if (windowId.contains((unsigned long)reparentevent->window)) { int index = windowId.indexOf((unsigned long)reparentevent->window); //printf( "remove ---------------------------- index : %d \n\n",index); fflush(stdout); windowId.removeAt(index); } /*获å�–到新建窗å�£çš„window ID*/ x11window = (unsigned long)(reparentevent->window); x11display =(reparentevent->display); XFetchName(x11display, x11window, srname); x11display = XOpenDisplay( NULL );/*ï¼�ï¼�ï¼�注æ„�这里以å�Žå¦‚果你想对获å�–到的window ID进行æ“�作必须é‡�新链接*/ fflush(stdout); free(srname); XCloseDisplay(x11display); } } XCloseDisplay(display); } //线程执行函数 void UkmediaMonitorWindowThread::run() { // qDebug()<<"thread run!"; bStopThread = false; while(!bStopThread) { // printf("thread run! \n\n"); fflush(stdout); //to do what you want get_window_nameAndid(); //延时等待一会 QEventLoop eventloop; QTimer::singleShot(1000, &eventloop, SLOT(quit())); eventloop.exec(); } } ukui-media/ukui-volume-control-applet-qt/ukmedia_volume_control.h0000664000175000017500000003137515170054730024331 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 #if HAVE_EXT_DEVICE_RESTORE_API # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "custom_sound.h" #include "../ukui-login-sound/ukui_login_sound_user_config.h" #include "../common/ukmedia_common.h" #include "ukui_volume_control_user_config.h" class PortInfo { public: QByteArray name; QByteArray description; uint32_t priority; int available; int direction; int64_t latency_offset; std::vector profiles; }; class UkmediaVolumeControl : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.media") public: UkmediaVolumeControl(); void UkmediaDbusRegister(); friend class UkmediaMainWidget; virtual ~UkmediaVolumeControl(); public: // Connect to pulseaudio pa_context* getContext(void); static gboolean connectToPulse(gpointer userdata); static void contextStateCallback(pa_context *c, void *userdata); static void subscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t index, void *userdata); static void clientCb(pa_context *, const pa_client_info *i, int eol, void *userdata); static void serverInfoCb(pa_context *, const pa_server_info *i, void *userdata); static void cardCb(pa_context *, const pa_card_info *i, int eol, void *userdata); static void sinkCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void sourceCb(pa_context *, const pa_source_info *i, int eol, void *userdata); static void sinkInputCb(pa_context *, const pa_sink_input_info *i, int eol, void *userdata); static void sourceOutputCb(pa_context *, const pa_source_output_info *i, int eol, void *userdata); static void batteryLevelCb(pa_context *c, const pa_card_info *i, int eol, void *userdata); static void bluetoothCardCb(pa_context *c, const pa_card_info *i, int eol, void *userdata); static void moduleInfoCb(pa_context *c, const pa_module_info *i, int eol, void *userdata); // 待优化 void showError(const char *txt); static void decOutstanding(UkmediaVolumeControl *w); static void simple_callback(pa_context *c, int success, void *userdata); static void serverInfoIndexCb(pa_context *, const pa_server_info *i, void *userdata); static void sinkIndexCb(pa_context *c, const pa_sink_info *i, int eol, void *userdata); static void sourceIndexCb(pa_context *c, const pa_source_info *i, int eol, void *userdata); // 暂未使用 void setConnectionState(gboolean connected); void setConnectingMessage(const char *string = NULL); pa_stream* createMonitorStreamForSource(uint32_t source_idx, uint32_t stream_idx, bool suspend); static void extStreamRestoreReadCb(pa_context *,const pa_ext_stream_restore_info *i,int eol,void *userdata); static void extStreamRestoreSubscribeCb(pa_context *c, void *userdata); // void ext_device_restore_read_cb(pa_context *,const pa_ext_device_restore_info *i,int eol,void *userdata); // static void ext_device_restore_subscribe_cb(pa_context *c, pa_device_type_t type, uint32_t idx, void *userdata); static void extDeviceManagerReadCb(pa_context *,const pa_ext_device_manager_info *,int eol,void *userdata); static void extDeviceManagerSubscribeCb(pa_context *c, void *userdata); //#if HAVE_EXT_DEVICE_RESTORE_API // void updateDeviceInfo(const pa_ext_device_restore_info &info); //#endif // Update audio info void updateClient(const pa_client_info &info); void updateServer(const pa_server_info &info); void updateCard(UkmediaVolumeControl *c, const pa_card_info &info); bool updateSink(UkmediaVolumeControl *c, const pa_sink_info &info); void updateSource(const pa_source_info &info); void updateSinkInput(const pa_sink_input_info &info); void updateSourceOutput(const pa_source_output_info &info); void refreshVolume(int soundType, int info_Vol, bool info_Mute); // Sink volume bool getSinkMute(); int getSinkVolume(); void setSinkMute(bool status); void setSinkVolume(int index, int value); void setSinkVolumeByInfo(const pa_sink_info &info, int value); // Source volume bool getSourceMute(); int getSourceVolume(); void setSourceMute(bool status); void setSourceVolume(int index,int value); void setSourceVolumeByInfo(const pa_source_info &info, int value); // Sink-input volume bool getSinkInputMuted(QString description); int getSinkInputVolume(const gchar* name); bool setSinkInputMuted(QString name,bool status); void setSinkInputVolume(int index, int value, int channel); // Source-output volume int getSourceOutputVolume(const gchar *name); bool setSourceOutputMuted(QString appName, bool status); void setSourceOutputVolume(int index, int value, int channel); // sinkInfo sinkInfo addSinkInfo(const pa_sink_info& i); sinkInfo getSinkInfoByIndex(int index); sinkInfo getSinkInfoByName(QString name); // sourceInfo sourceInfo addSourceInfo(const pa_source_info& i); sourceInfo getSourceInfoByIndex(int index); sourceInfo getSourceInfoByName(QString name); int getDefaultSinkIndex(); void getModuleIndexByName(QString name); bool setCardProfile(int index,const gchar *name); bool setDefaultSink(const gchar *name); bool setDefaultSource(const gchar *name); bool setSinkPort(const gchar *sinkName,const gchar *name); bool setSourcePort(const gchar *portName, const gchar *name); // Remove info void removeCard(uint32_t index); void removeSink(uint32_t index); void removeSource(uint32_t index); void removeSinkInput(uint32_t index); void removeSourceOutput(uint32_t index); void removeClient(uint32_t index); void removeCardMap(int index); //移除指定索引的 card void removeCardProfileMap(int index); //移除声å�¡profile map void removeInputPortMap(int index); //移除指定索引的input port void removeOutputPortMap(int index); //移除指定索引的output port void removeSinkPortMap(int index); void removeSourcePortMap(int index); void removeProfileMap(int index); void removeInputProfile(int index); QString findCardName(int index, QMap cardMap); //æ ¹æ�®å£°å�¡index查找声å�¡å�� QString findSinkPortName(int cardIndex); int findOutputPort(QString name); int findPortSinkIndex(QString name); int findMasterDeviceCardIndex(QString masterDev); QString findSinkMasterDeviceInfo(pa_proplist *proplist, const char *info_name); // 开机音ä¹�é…�置文件 void insertJson(const JsonType& type, const QString& key, const QJsonValue& value); // åˆ�始化音é‡�设计 void initDefaultSinkVolume(const pa_sink_info &info); void initDefaultSourceVolume(const pa_source_info &info); QString stringRemoveUnrecignizedChar(QString str); //移除xml中ä¸�能识别的字符 // 应用音é‡�管ç�† appInfo addSinkInputInfo(const pa_sink_input_info & info); appInfo addSourceOutputInfo(const pa_source_output_info& info); bool killSinkInput(int index); void moveSinkInput(QString appName, const char* sinkName); void moveSoureOutput(QString appName, const char* sourceName); QList findAppIndex(int soundType, QString appName); const gchar* AppDesktopFileAdaption(const gchar* appName); // ä¿¡å�· void sendPortChangedSignal(); void sendSourcePortChangedSignal(); bool isNeedSendPortChangedSignal(QString newPort, QString prePort, QString cardName); void sendOsdWidgetSignal(QString portName, QString description); private: static void sendDeviceChangedSignal(UkmediaVolumeControl* w=nullptr); void sendVolumeUpdateSignal(); void sendSourceVolumeUpdateSignal(); void sendOSDDeviceChangedSignal(QString icon=""); Q_SIGNALS: void paContextReady(); void updateSourceVolume(int value); void updateSourceMute(bool state); void checkDeviceSelectionSianal(const pa_card_info *info); void deviceChangedSignal(); void removeSinkSignal(); void device_changed_signal(QString str); void bluetoothBatteryChanged(QString dev, int battery); void initBlueDeviceVolumeSig(int index, QString name); void updatePortSignal(); void updateMute(bool state); void updateVolume(int value); void removeSinkInputSignal(QString name); void sinkInputVolumeChangedSignal(QString name, QString id, int value); void updateApp(QString name); void addSinkInputSignal(QString name, QString id, int index, int value, int channel); protected Q_SLOTS: void getBatteryLevel(QString dev); public: static pa_context *context; static int reconnectTimeout; static pa_mainloop_api* api; int n_outstanding = 0; bool canRenameDevices; std::map clientNames; SinkType showSinkType; SourceType showSourceType; SinkInputType showSinkInputType; SourceOutputType showSourceOutputType; // 输出 int sinkIndex; bool sinkMuted; int sinkVolume = 0; int channel = 2; float balance = 0.0; int defaultOutputCard = -1; QString sinkPortName = ""; QString masterSinkDev = ""; QByteArray defaultSinkName; pa_channel_map channelMap; const pa_sink_info *m_pDefaultSink = nullptr; // 输入 int sourceIndex; int sourceVolume = 0; int inputChannel = 0; bool sourceMuted; int defaultInputCard; QString sourcePortName = ""; QString masterDevice = ""; QByteArray defaultSourceName; const pa_source_info *m_pDefaultSource = nullptr; int batteryLevel; // è“�牙电é‡� int findModuleIndex = -1; // 查找到模å�—çš„index QString findModuleStr = ""; // 需è¦�查找的module name bool isLoadLoopback = false; // Card Info QMap cardMap; QMap> cardProfileMap; QMap cardActiveProfileMap; QMap> cardProfilePriorityMap; //记录声å�¡ä¼˜å…ˆçº§é…�置文件 QMap> profileNameMap; //声å�¡è¾“出é…�置文件 QMap> inputPortProfileNameMap; //声å�¡è¾“å…¥é…�置文件 // Sink Info QMap sinkMap; QMap> sinkPortMap; QMap> outputPortMap; // Source Info QMap sourceMap; QMap> sourcePortMap; QMap> inputPortMap; // 针对一个应用产生多个sinkinput,indexMap记录应用产生sinkinputçš„æ¯�个index, valueMap刷新应用的最新音é‡�(待优化) QStringList sinkInputList; QMap sinkInputMap; QMap sinkInputMuteMap; QMap sinkInputValueMap; QMap sinkInputIndexMap; QMap sourceOutputMap; QMap sourceOutputIndexMap; QMap sourceOutputValueMap; QByteArray activePort; QByteArray activeProfile; QByteArray noInOutProfile; std::map ports; std::vector< std::pair > dPorts; std::vector< std::pair > profiles; private: void initUserConfig(); private: CustomSound *customSoundFile; gboolean m_connected; gchar* m_config_filename; QString m_description; // sink_description bool osdFirstFlag = true; //start 过滤设备端å�£åˆ‡æ�¢æˆ–者设备拔æ�’期间,subscribecb回调å��馈的é�žé¢„期数æ�® static QTimer deviceChangedTimer; QTimer m_osdDeviceChangedTimer; QTimer m_updateVolumeTimer; QTimer m_updateSourceVolumeTimer; //end std::shared_ptr m_pUsrConf; }; #endif // UKMEDIAVOLUMECONTROL_H ukui-media/ukui-volume-control-applet-qt/ukui_media_set_headset_widget.cpp0000664000175000017500000004376015170054730026146 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include extern double transparency; UkuiMediaSetHeadsetWidget::UkuiMediaSetHeadsetWidget(QWidget *parent) : QWidget (parent) { headphoneIconButton = new QToolButton(); headsetIconButton = new QToolButton(); microphoneIconButton = new QToolButton(); soundSettingButton = new QPushButton(tr("Sound Settings")); cancelButton = new QPushButton(tr("Cancel")); selectSoundDeviceLabel = new QLabel(tr("Select Sound Device")); initSetHeadsetWidget(); initPanelGSettings(); headphoneIconButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); connect(headphoneIconButton,SIGNAL(clicked()),this,SLOT(headphoneButtonClickedSlot())); connect(headsetIconButton,SIGNAL(clicked()),this,SLOT(headsetButtonClickedSlot())); connect(microphoneIconButton,SIGNAL(clicked()),this,SLOT(microphoneButtonClickedSlot())); connect(soundSettingButton,SIGNAL(clicked()),this,SLOT(soundSettingButtonClickedSlot())); connect(cancelButton,SIGNAL(clicked()),this,SLOT(cancelButtonClickedSlot())); this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::ToolTip); } void UkuiMediaSetHeadsetWidget::initSetHeadsetWidget() { this->setFixedSize(402,252); headphoneIconButton->setFixedSize(96,96); headsetIconButton->setFixedSize(96,96); microphoneIconButton->setFixedSize(96,96); headphoneIconButton->setIconSize(QSize(32,32)); headsetIconButton->setIconSize(QSize(32,32)); microphoneIconButton->setIconSize(QSize(32,32)); selectSoundDeviceLabel->setFixedSize(402,24); soundSettingButton->setFixedSize(120,36); cancelButton->setFixedSize(107,36); soundSettingButton->setContextMenuPolicy(Qt::DefaultContextMenu); headphoneIconButton->setText(tr("Headphone")); headsetIconButton->setText(tr("Headset")); microphoneIconButton->setText(tr("Microphone")); headphoneIconButton->setIcon(QIcon::fromTheme("headphones-symbolic")); headsetIconButton->setIcon(QIcon::fromTheme("audio-headset-symbolic")); microphoneIconButton->setIcon(QIcon::fromTheme("audio-input-microphone")); headphoneIconButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); headsetIconButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); microphoneIconButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); selectSoundDeviceLabel->setAlignment(Qt::AlignCenter); QWidget *labelWidget = new QWidget; labelWidget->setFixedSize(402,24); QVBoxLayout *labelLayout = new QVBoxLayout; labelLayout->addWidget(selectSoundDeviceLabel); labelLayout->setContentsMargins(0,0,0,0); labelWidget->setLayout(labelLayout); QWidget *headsetButtonWidget = new QWidget(); headsetButtonWidget->setFixedSize(402,96); QHBoxLayout *headsetButtonLayout = new QHBoxLayout; headsetButtonLayout->addWidget(headphoneIconButton); headsetButtonLayout->addWidget(headsetIconButton); headsetButtonLayout->addWidget(microphoneIconButton); headsetButtonLayout->setSpacing(24); headsetButtonLayout->setContentsMargins(32,0,32,0); headsetButtonWidget->setLayout(headsetButtonLayout); QWidget *buttonWidget = new QWidget; buttonWidget->setFixedSize(402,36); // buttonWidget->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout->addWidget(soundSettingButton); buttonLayout->addWidget(cancelButton); buttonLayout->setSpacing(108); buttonLayout->setContentsMargins(32,0,32,0); buttonWidget->setLayout(buttonLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(labelWidget); mainLayout->addWidget(headsetButtonWidget); mainLayout->addWidget(buttonWidget); this->setLayout(mainLayout); this->setProperty("useSystemStyleBlur",true); this->setWindowTitle("whole window blur"); this->setAttribute(Qt::WA_TranslucentBackground); this->setContentsMargins(0,16,0,16); } void UkuiMediaSetHeadsetWidget::paintEvent(QPaintEvent *event) { QStyleOption opt; opt.initFrom(this); QPainter p(this); // double transparence = transparency * 255; QColor color = palette().color(QPalette::Base); // color.setAlpha(transparence); QBrush brush = QBrush(color); p.setBrush(brush); p.setPen(Qt::NoPen); QPainterPath path; opt.rect.adjust(0,0,0,0); path.addRoundedRect(opt.rect,12,12); p.setRenderHint(QPainter::Antialiasing); // å��锯齿; p.drawRoundedRect(opt.rect,12,12); setProperty("blurRegion",QRegion(path.toFillPolygon().toPolygon())); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); QWidget::paintEvent(event); } /* * set input and output port. * input: intel mic * output: headphone */ void UkuiMediaSetHeadsetWidget::headphoneButtonClickedSlot() { isShow = false; // cset("name=Capture Source", HW_CARD, "2", 0, 0); QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "headsetJack"); message<<"headphone"; QDBusConnection::sessionBus().send(message); this->hide(); } /* * set input and output port. * input: headsed mic * output: headphone */ void UkuiMediaSetHeadsetWidget::headsetButtonClickedSlot() { isShow = false; // cset("name=Capture Source", HW_CARD, "0", 0, 0); QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "headsetJack"); message<<"headset"; QDBusConnection::sessionBus().send(message); this->hide(); } /* * set input and output port. * input: headphone mic * output: speaker */ void UkuiMediaSetHeadsetWidget::microphoneButtonClickedSlot() { isShow = false; // int ret = cset("name=Capture Source", HW_CARD, "1", 0, 0); QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "headsetJack"); message<<"headphone mic" ; // if (ret < 0) // cset("name=Input Source", HW_CARD, "1", 0, 0); QDBusConnection::sessionBus().send(message); this->hide(); } /* * Jump to the control panel */ void UkuiMediaSetHeadsetWidget::soundSettingButtonClickedSlot() { QProcess *process; QStringList args; args.append("-m Audio"); QString command = "ukui-control-center"; process = new QProcess(); process->setProcessChannelMode(QProcess::MergedChannels); process->start(command, args); if (!process->waitForStarted()) { qDebug() << "start failed:" << process->errorString(); } else { qDebug() << "start success:"; } this->hide(); isShow = false; } /* * Cancel settings */ void UkuiMediaSetHeadsetWidget::cancelButtonClickedSlot() { this->hide(); isShow = false; } int UkuiMediaSetHeadsetWidget::cset(char * name, char *card, char *c, int roflag, int keep_handle) { int err; static snd_ctl_t *handle = NULL; snd_ctl_elem_info_t *info; snd_ctl_elem_id_t *id; snd_ctl_elem_value_t *control; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_value_alloca(&control); printf("name[%s]card[%s]c[%s]", name, card, c); if (snd_ctl_ascii_elem_id_parse(id, name)) { printf("Wrong control identifier: %s\n", name); return -1; } if (handle == NULL && (err = snd_ctl_open(&handle, card, 0)) < 0) { printf("Control %s open error: %s", card, snd_strerror(err)); return err; } snd_ctl_elem_info_set_id(info, id); if ((err = snd_ctl_elem_info(handle, info)) < 0) { //if (ignore_error) //return 0; printf("Cannot find the given element from control %s", card); if (! keep_handle) { snd_ctl_close(handle); handle = NULL; } return err; } snd_ctl_elem_info_get_id(info, id); if (!roflag) { snd_ctl_elem_value_set_id(control, id); if ((err = snd_ctl_elem_read(handle, control)) < 0) { //if (ignore_error) //return 0; printf("Cannot read the given element from control %s", card); if (! keep_handle) { snd_ctl_close(handle); handle = NULL; } return err; } err = snd_ctl_ascii_value_parse(handle, control, info, c); if (err < 0) { //if (!ignore_error) //error("Control %s parse error: %s\n", card, snd_strerror(err)); if (!keep_handle) { snd_ctl_close(handle); handle = NULL; } //return ignore_error ? 0 : err; return err; } if ((err = snd_ctl_elem_write(handle, control)) < 0) { //if (!ignore_error) //error("Control %s element write error: %s\n", card, snd_strerror(err)); if (!keep_handle) { snd_ctl_close(handle); handle = NULL; } //return ignore_error ? 0 : err; return err; } } if (! keep_handle) { snd_ctl_close(handle); handle = NULL; } snd_hctl_t *hctl; snd_hctl_elem_t *elem; if ((err = snd_hctl_open(&hctl, card, 0)) < 0) { printf("Control %s open error: %s", card, snd_strerror(err)); return err; } if ((err = snd_hctl_load(hctl)) < 0) { printf("Control %s load error: %s", card, snd_strerror(err)); return err; } elem = snd_hctl_find_elem(hctl, id); if (elem) showControl(" ", elem, LEVEL_BASIC | LEVEL_ID); else printf("Could not find the specified element"); snd_hctl_close(hctl); return 0; } void UkuiMediaSetHeadsetWidget::showControlId(snd_ctl_elem_id_t *id) { char *str; str = snd_ctl_ascii_elem_id_get(id); if (str) printf("%s", str); free(str); } int UkuiMediaSetHeadsetWidget::showControl(const char *space, snd_hctl_elem_t *elem, int level) { int err; unsigned int item, idx, count, *tlv; snd_ctl_elem_type_t type; snd_ctl_elem_id_t *id; snd_ctl_elem_info_t *info; snd_ctl_elem_value_t *control; snd_aes_iec958_t iec958; snd_ctl_elem_id_alloca(&id); snd_ctl_elem_info_alloca(&info); snd_ctl_elem_value_alloca(&control); if ((err = snd_hctl_elem_info(elem, info)) < 0) { printf("Control hw snd_hctl_elem_info error: %s\n", snd_strerror(err)); return err; } if (level & LEVEL_ID) { snd_hctl_elem_get_id(elem, id); showControlId(id); printf("\n"); } count = snd_ctl_elem_info_get_count(info); type = snd_ctl_elem_info_get_type(info); switch (type) { case SND_CTL_ELEM_TYPE_INTEGER: printf(",min=%li,max=%li,step=%li \n", snd_ctl_elem_info_get_min(info), snd_ctl_elem_info_get_max(info), snd_ctl_elem_info_get_step(info)); break; case SND_CTL_ELEM_TYPE_INTEGER64: printf(",min=%lli,max=%lli,step=%lli \n", snd_ctl_elem_info_get_min64(info), snd_ctl_elem_info_get_max64(info), snd_ctl_elem_info_get_step64(info)); break; case SND_CTL_ELEM_TYPE_ENUMERATED: { unsigned int items = snd_ctl_elem_info_get_items(info); printf(",items=%u\n", items); for (item = 0; item < items; item++) { snd_ctl_elem_info_set_item(info, item); if ((err = snd_hctl_elem_info(elem, info)) < 0) { printf("Control hw element info error: %s\n", snd_strerror(err)); return err; } printf("%s; Item #%u '%s' \n", space, item, snd_ctl_elem_info_get_item_name(info)); } break; } default: printf("\n"); break; } if (level & LEVEL_BASIC) { if (!snd_ctl_elem_info_is_readable(info)) goto __skip_read; if ((err = snd_hctl_elem_read(elem, control)) < 0) { printf("Control hw:0 element read error: %s\n", snd_strerror(err)); return err; } for (idx = 0; idx < count; idx++) { if (idx > 0) printf(",\n"); switch (type) { case SND_CTL_ELEM_TYPE_BOOLEAN: printf("%s \n", snd_ctl_elem_value_get_boolean(control, idx) ? "on" : "off"); break; case SND_CTL_ELEM_TYPE_INTEGER: printf("%li \n", snd_ctl_elem_value_get_integer(control, idx)); break; case SND_CTL_ELEM_TYPE_INTEGER64: printf("%lli \n", snd_ctl_elem_value_get_integer64(control, idx)); break; case SND_CTL_ELEM_TYPE_ENUMERATED: printf("%u \n", snd_ctl_elem_value_get_enumerated(control, idx)); break; case SND_CTL_ELEM_TYPE_BYTES: printf("0x%02x \n", snd_ctl_elem_value_get_byte(control, idx)); break; case SND_CTL_ELEM_TYPE_IEC958: snd_ctl_elem_value_get_iec958(control, &iec958); printf("[AES0=0x%02x AES1=0x%02x AES2=0x%02x AES3=0x%02x] \n", iec958.status[0], iec958.status[1], iec958.status[2], iec958.status[3]); break; default: printf("? \n"); break; } } __skip_read: if (!snd_ctl_elem_info_is_tlv_readable(info)) goto __skip_tlv; /* skip ASoC ext bytes controls that may have huge binary TLV data */ if (type == SND_CTL_ELEM_TYPE_BYTES && !snd_ctl_elem_info_is_readable(info) && !snd_ctl_elem_info_is_writable(info)) { printf("%s; ASoC TLV Byte control, skipping bytes dump \n", space); goto __skip_tlv; } tlv = (unsigned int *)malloc(4096); if ((err = snd_hctl_elem_tlv_read(elem, tlv, 4096)) < 0) { printf("Control hw:0 element TLV read error: %s \n", snd_strerror(err)); free(tlv); return err; } //decode_tlv(strlen(space), tlv, 4096); free(tlv); } __skip_tlv: return 0; } void UkuiMediaSetHeadsetWidget::showWindow() { QRect rect = caculatePosition(); QString platform = QGuiApplication::platformName(); if (!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ this->setGeometry(QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); this->showNormal(); } else { this->show(); kdk::WindowManager::setGeometry(this->windowHandle(), QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); } isShow = true; this->show(); } void UkuiMediaSetHeadsetWidget::initPanelGSettings() { const QByteArray id(PANEL_SETTINGS); if (QGSettings::isSchemaInstalled(id)) { if (m_panelGSettings == nullptr) { m_panelGSettings = new QGSettings(id); } if (m_panelGSettings->keys().contains(PANEL_POSITION_KEY)) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (m_panelGSettings->keys().contains(PANEL_SIZE_KEY)) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } connect(m_panelGSettings, &QGSettings::changed, this, [&] (const QString &key) { if (key == PANEL_POSITION_KEY) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (key == PANEL_SIZE_KEY) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } if (this->isVisible()) { QRect rect = caculatePosition(); QString platform = QGuiApplication::platformName(); if (!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ this->setGeometry(QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); this->showNormal(); } else { this->show(); kdk::WindowManager::setGeometry(this->windowHandle(), QRect((rect.x() - rect.width()*2), rect.y(), rect.width(), rect.height())); } } }); } } QRect UkuiMediaSetHeadsetWidget::caculatePosition() { QRect availableGeo = QGuiApplication::screenAt(QCursor::pos())->geometry(); int x, y; int margin = 8; switch (m_panelPosition) { case PanelPosition::Top: { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + m_panelSize + margin; } break; case PanelPosition::Bottom: { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + availableGeo.height() - m_panelSize - this->height() - margin; } break; case PanelPosition::Left: { x = availableGeo.x() + m_panelSize + margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; case PanelPosition::Right: { x = availableGeo.x() + availableGeo.width() - m_panelSize - this->width() - margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; } return QRect(x, y, this->width(), this->height()); } UkuiMediaSetHeadsetWidget::~UkuiMediaSetHeadsetWidget() { } ukui-media/ukui-volume-control-applet-qt/ukmedia_volume_slider.h0000664000175000017500000001246215170052044024123 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include #include //typedef struct UkuiThemeIcon //{ // QImage image; // QColor color; //}UkuiThemeIcon; //enum DisplayerMode{ // MINI_MODE, // ADVANCED_MODE //}; //enum SwitchButtonState{ // SWITCH_BUTTON_NORMAL, // SWITCH_BUTTON_HOVER, // SWITCH_BUTTON_PRESS //}; //static QColor symbolic_color = Qt::gray; //class UkuiMediaSliderTipLabel:public QLabel //{ // public: // UkuiMediaSliderTipLabel(); // ~UkuiMediaSliderTipLabel(); //protected: // void paintEvent(QPaintEvent*); //}; //class UkuiButtonDrawSvg:public QPushButton //{ // Q_OBJECT //public: // UkuiButtonDrawSvg(QWidget *parent = nullptr); // ~UkuiButtonDrawSvg(); // QPixmap filledSymbolicColoredPixmap(QImage &source, QColor &baseColor); // QRect IconGeometry(); // void draw(QPaintEvent* e); // void init(QImage image ,QColor color); // friend class DeviceSwitchWidget; // friend class UkmediaOsdDisplayWidget; //protected: // void paintEvent(QPaintEvent *event); // bool event(QEvent *e); //private: // UkuiThemeIcon themeIcon; //}; //class UkuiApplicationWidget:public QWidget //{ // Q_OBJECT //public: // UkuiApplicationWidget(QWidget *parent = nullptr); // ~UkuiApplicationWidget(); //protected: // void paintEvent(QPaintEvent*); //}; //class UkuiMediaButton:public QPushButton //{ // Q_OBJECT //public: // UkuiMediaButton(QWidget *parent = nullptr); // ~UkuiMediaButton(); // friend class UkmediaMiniMasterVolumeWidget; //Q_SIGNALS: // void advanceToMiniSignal(); // void miniToAdvanceSignal(); // void moveMiniSwitchBtnSignale(); // void moveAdvanceSwitchBtnSignal(); //protected: // void mousePressEvent(QMouseEvent *e)override; // void mouseMoveEvent(QMouseEvent *e)override; // void mouseReleaseEvent(QMouseEvent *e)override; //// void paintEvent(QPaintEvent *event); // void enterEvent(QEvent *event); // void leaveEvent(QEvent *event); //private: //}; //class UkmediaVolumeSlider : public QSlider //{ // Q_OBJECT //public: //// UkmediaVolumeSlider(QWidget *parent = nullptr); // UkmediaVolumeSlider(QWidget *parent = nullptr,bool needTip = false); // void initStyleOption(QStyleOptionSlider *option); // ~UkmediaVolumeSlider(); //Q_SIGNALS: // void silderPressSignal(); // void silderReleaseSignal(); //private: // UkuiMediaSliderTipLabel *m_pTiplabel; // bool state = false; // bool mousePress = false; //protected: // void mousePressEvent(QMouseEvent *ev); // void mouseReleaseEvent(QMouseEvent *e); // void mouseMoveEvent(QMouseEvent *e) // { // int value = 0; // int currentX = e->pos().x(); // double per = currentX * 1.0 / this->width(); // if ((this->maximum() - this->minimum()) >= 50) { //å‡�å°�鼠标点击åƒ�素的影å“� // value = qRound(per*(this->maximum() - this->minimum())) + this->minimum(); // if (value <= (this->maximum() / 2 - this->maximum() / 10 + this->minimum() / 10)) { // value = qRound(per*(this->maximum() - this->minimum() - 1)) + this->minimum(); // } else if (value > (this->maximum() / 2 + this->maximum() / 10 + this->minimum() / 10)) { // value = qRound(per*(this->maximum() - this->minimum() + 1)) + this->minimum(); // } else { // value = qRound(per*(this->maximum() - this->minimum())) + this->minimum(); // } // } else { // value = qRound(per*(this->maximum() - this->minimum())) + this->minimum(); // } // this->setValue(value); // QSlider::mousePressEvent(e); //// setCursor(QCursor(Qt::OpenHandCursor)); //// m_displayLabel->move((this->width()-m_displayLabel->width())*this->value()/(this->maximum()-this->minimum()),3); //// QSlider::mouseMoveEvent(e); // } // void leaveEvent(QEvent *e); // void enterEvent(QEvent *e); // void paintEvent(QPaintEvent *e); //}; //class UkuiScrollArea : public QScrollArea //{ // Q_OBJECT //public: // UkuiScrollArea(QWidget *parent = nullptr); // ~UkuiScrollArea(); //protected: // void paintEvent(QPaintEvent *e); //}; //class UkuiQMenu:public QMenu //{ // Q_OBJECT //public: // UkuiQMenu(); // ~UkuiQMenu(); //protected: // void hideEvent(QHideEvent *e); // virtual bool event(QEvent *e) override; //}; #endif // UKMEDIAVOLUMESLIDER_H ukui-media/ukui-volume-control-applet-qt/ukui_volume_control_user_config.h0000664000175000017500000000157515170054730026251 0ustar fengfeng#ifndef UKUIVOLUMECONTROLUSERCONFIG_H #define UKUIVOLUMECONTROLUSERCONFIG_H #include #include #include #include "../common/user_config.h" #include "../common/sound_effect_json.h" #include "../common/user_info_json.h" class UkuiVolumeControlUserConfig : public UserConfig { public: UkuiVolumeControlUserConfig(); ~UkuiVolumeControlUserConfig(); public: std::unordered_map> getJsonMap() const; virtual void initJsonMap(); private: QString getSoundEffectFullPath(); QString getUserInfoFullPath(); private: std::unordered_map> m_keys { {JsonType::JSON_TYPE_SOUNDEFFECT, [this](){ return getSoundEffectFullPath();}}, {JsonType::JSON_TYPE_USERINFO, [this](){ return getUserInfoFullPath(); }}, }; }; #endif // UKUIVOLUMECONTROLUSERCONFIG_H ukui-media/ukui-volume-control-applet-qt/ukui-volume-control-applet-qt.pro0000664000175000017500000000560515170054730025776 0ustar fengfeng###################################################################### # Automatically generated by qmake (3.1) Fri Oct 11 17:35:00 2019 ###################################################################### QT += core gui dbus xml greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TEMPLATE = app TARGET = ukui-volume-control-applet-qt INCLUDEPATH += . QMAKE_CXXFLAGS += -std=c++11 PKGCONFIG += kysdk-waylandhelper include(QtSingleApplication/qtsingleapplication.pri) include(xatom/xatom.pri) include(dbus-adaptor/dbus-adaptor.pri) DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 # Default rules for deployment. target.path = /usr/bin CONFIG += \ c++17 \ no_keywords link_pkgconfig debug\ PKGCONFIG += \ glib-2.0 \ gsettings-qt6 \ Qt6Svg \ gio-2.0 \ dconf \ x11 \ libcanberra \ libpulse \ libpulse-mainloop-glib \ alsa \ kysdk-sysinfo \ kysdk-hardware \ kysdk-waylandhelper \ kysdk-qtwidgets \ KF6WindowSystem # libwnck-1.0 LIBS += -lukui-log4qt -lukcc HEADERS += \ ../common/ukmedia_common.h \ config.h \ custom_sound.h \ ukmedia_custom_class.h \ ukmedia_main_widget.h \ ukmedia_application_volume_widget.h \ ukmedia_monitor_window_thread.h \ ukmedia_osd_display_widget.h \ ukmedia_system_volume_widget.h \ ukmedia_volume_control.h \ ukui_list_widget_item.h \ ukui_media_set_headset_widget.h \ ../common/json.h \ ../common/sound_effect_json.h \ ../common/user_info_json.h \ ../common/user_config.h \ ukui_volume_control_user_config.h SOURCES += \ custom_sound.cpp \ main.cpp \ ukmedia_custom_class.cpp \ ukmedia_application_volume_widget.cpp \ ukmedia_main_widget.cpp \ ukmedia_monitor_window_thread.cpp \ ukmedia_osd_display_widget.cpp \ ukmedia_system_volume_widget.cpp \ ukmedia_volume_control.cpp \ ukui_list_widget_item.cpp \ ukui_media_set_headset_widget.cpp \ ../common/sound_effect_json.cpp \ ../common/user_info_json.cpp \ ../common/user_config.cpp \ ../common/ukmedia_common.cpp \ ukui_volume_control_user_config.cpp RESOURCES += \ res.qrc TRANSLATIONS += \ translations/zh_CN.ts \ translations/tr.ts \ translations/bo.ts \ translations/mn.ts isEmpty(QMAKE_LRELEASE) { system("/usr/lib/qt6/bin/lrelease translations/*.ts") } else { system($$QMAKE_LRELEASE translations/*.ts) } qm_file.files = translations/*.qm qm_file.path = $${PREFIX}/translations/ data_files.files = data/* data_files.path = $${PREFIX}/ INSTALLS += \ target qm_file data_files #DISTFILES += \ # xatom/xatom.pri ukui-media/ukui-volume-control-applet-qt/ukmedia_system_volume_widget.cpp0000664000175000017500000001471415170054730026071 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include UkmediaSystemVolumeWidget::UkmediaSystemVolumeWidget(QWidget *parent) : QWidget(parent) { connect(qApp, &QApplication::paletteChanged, this, &UkmediaSystemVolumeWidget::onPaletteChanged); m_pOutputListWidget = new QListWidget(this); m_pInputListWidget = new QListWidget(this); m_pSysSliderWidget = new QWidget(this); m_pOutputListWidget->setFixedSize(412,245); m_pOutputListWidget->setFrameShape(QFrame::Shape::NoFrame); QPalette pal = m_pOutputListWidget->palette(); pal.setBrush(QPalette::Base, QColor(0,0,0,0)); //背景é€�明 m_pOutputListWidget->setPalette(pal); m_pOutputListWidget->setProperty("needTranslucent", true); m_pOutputListWidget->setSelectionMode(QAbstractItemView:: NoSelection); QWidget *outputWidget = new QWidget(this); outputWidget->setFixedSize(412,245); QHBoxLayout *outputWidgetLayout = new QHBoxLayout; outputWidgetLayout->addWidget(m_pOutputListWidget); outputWidgetLayout->setSpacing(0); outputWidget->setLayout(outputWidgetLayout); if (UkmediaCommon::getInstance().isHWKLanguageEnv(getenv("LANGUAGE"))) { outputWidgetLayout->setContentsMargins(5,0,0,0); } else { outputWidgetLayout->setContentsMargins(0,0,8,0); } m_pInputListWidget->hide(); m_pSysSliderWidget->setFixedSize(412,48); m_pSystemVolumeBtn = new QPushButton(m_pSysSliderWidget); m_pSystemVolumeBtn->setFixedSize(36,36); m_pSystemVolumeBtn->setCheckable(true); m_pSystemVolumeBtn->setProperty("isRoundButton",true); //圆形按钮 m_pSystemVolumeBtn->setProperty("useButtonPalette",true); //ç�°è‰²æŒ‰é’® m_pSystemVolumeBtn->setProperty("needTranslucent", true); //ç�°è‰²å�Šé€�明按钮 m_pSystemVolumeSlider = new AudioSlider(m_pSysSliderWidget); m_pSystemVolumeSlider->setOrientation(Qt::Horizontal); m_pSystemVolumeSlider->setFocusPolicy(Qt::StrongFocus); m_pSystemVolumeSlider->setProperty("needTranslucent", true); // Increase translucent effect m_pSystemVolumeSlider->setFixedSize(286,48); m_pSystemVolumeSlider->setRange(0,100); m_pSystemVolumeSliderLabel = new QLabel(m_pSysSliderWidget); m_pSystemVolumeSliderLabel->setText("0%"); m_pSystemVolumeSliderLabel->setFixedSize(52,48); //音é‡�label布局 m_pSystemVolumeLabel = new QLabel(this); m_pSystemVolumeLabel->setText(tr("Volume")); m_pSystemVolumeLabel->setFixedSize(372,29);//防止字体显示ä¸�å…¨ QWidget *systemVolumeLabelWidget = new QWidget(this); systemVolumeLabelWidget->setFixedSize(412,29); QHBoxLayout *systemVolumeLabelLayout = new QHBoxLayout; systemVolumeLabelLayout->addWidget(m_pSystemVolumeLabel); systemVolumeLabelWidget->setLayout(systemVolumeLabelLayout); systemVolumeLabelLayout->setContentsMargins(16,0,24,0); //输出label布局 m_pOutputLabel = new QLabel(this); m_pOutputLabel->setText(tr("Output")); m_pOutputLabel->setFixedSize(372,29); QWidget *outputLabelWidget = new QWidget(this); outputLabelWidget->setFixedSize(412,29); QHBoxLayout *outputLabelLayout = new QHBoxLayout; outputLabelLayout->addWidget(m_pOutputLabel); outputLabelWidget->setLayout(outputLabelLayout); outputLabelLayout->setContentsMargins(16,0,24,0); QPalette palette = m_pSystemVolumeLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); m_pSystemVolumeLabel->setPalette(palette); m_pOutputLabel->setPalette(palette); volumeSettingButton = new UkuiSettingButton(volumeSettingFrame); volumeSettingButton->setText(tr("Sound Settings")); volumeSettingButton->setCursor(Qt::PointingHandCursor); volumeSettingButton->setScaledContents(true); volumeSettingFrame = new QFrame(this); volumeSettingFrame->setFixedHeight(52); QHBoxLayout *volumeSettingLayout = new QHBoxLayout; volumeSettingLayout->addWidget(volumeSettingButton); volumeSettingLayout->addStretch(); volumeSettingFrame->setLayout(volumeSettingLayout); volumeSettingLayout->setContentsMargins(16,0,24,0); //系统音é‡�滑动æ�¡å¸ƒå±€ QHBoxLayout *sysVolumeLay = new QHBoxLayout(); sysVolumeLay->addWidget(m_pSystemVolumeBtn); sysVolumeLay->addSpacing(3); sysVolumeLay->addWidget(m_pSystemVolumeSlider); sysVolumeLay->addWidget(m_pSystemVolumeSliderLabel); sysVolumeLay->setSpacing(0); m_pSysSliderWidget->setLayout(sysVolumeLay); sysVolumeLay->setContentsMargins(11,0,24,0); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(systemVolumeLabelWidget); mainLayout->addSpacing(3); mainLayout->addWidget(m_pSysSliderWidget); mainLayout->addSpacing(13); mainLayout->addWidget(outputLabelWidget); mainLayout->addSpacing(3); mainLayout->addWidget(outputWidget); mainLayout->addSpacing(2); mainLayout->addWidget(volumeSettingFrame); mainLayout->setSpacing(0); this->setLayout(mainLayout); mainLayout->setContentsMargins(8,12,0,0); this->setFixedSize(420,436); } void UkmediaSystemVolumeWidget::setLabelAlignment(Qt::Alignment alignment) { m_pSystemVolumeSliderLabel->setAlignment(alignment); } void UkmediaSystemVolumeWidget::onPaletteChanged(){ QPalette palette = m_pSystemVolumeLabel->palette(); QColor color = palette.color(QPalette::PlaceholderText); palette.setColor(QPalette::WindowText,color); m_pSystemVolumeLabel->setPalette(palette); m_pOutputLabel->setPalette(palette); } void UkmediaSystemVolumeWidget::setVolumeSliderRange(bool status) { int maxValue = (status) ? 125 : 100; m_pSystemVolumeSlider->blockSignals(true); m_pSystemVolumeSlider->setRange(0, maxValue); m_pSystemVolumeSlider->blockSignals(false); } ukui-media/ukui-volume-control-applet-qt/ukmedia_application_volume_widget.h0000664000175000017500000000402715170054730026511 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include "ukmedia_custom_class.h" class ApplicationVolumeWidget : public QWidget { Q_OBJECT public: ApplicationVolumeWidget(QWidget *parent = nullptr); ~ApplicationVolumeWidget(); // void fullushBlueRecordStream(); // void deleteBlueRecordStream(); void setVolumeSliderRange(bool status); friend class DeviceSwitchWidget; friend class UkmediaMainWidget; private: void setLabelAlignment(Qt::Alignment alignment); private: QLabel *applicationLabel; QLabel *systemVolumeLabel; QPushButton *systemVolumeBtn; AudioSlider *systemVolumeSlider; QLabel *systemVolumeDisplayLabel; QWidget *systemVolumeSliderWidget; QWidget *displayAppVolumeWidget; QStringList *app_volume_list; QLabel *appVolumeLabel; QPushButton *appMuteBtn; QPushButton *appIconBtn; QSlider *appSlider; QScrollArea *appArea; QVBoxLayout *m_pVlayout; QFrame * volumeSettingFrame; UkuiSettingButton *volumeSettingButton; bool isRecording = false; protected: // void paintEvent(QPaintEvent *event); public Q_SLOTS: void onPaletteChanged(); }; #endif // APPLICATIONVOLUMEWIDGET_H ukui-media/ukui-volume-control-applet-qt/custom_sound.cpp0000664000175000017500000001372015170054730022632 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU 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 ='0' && nodeName.at(0)<='9'){ nodeName = "Audio_"+nodeName; } while(!ele.isNull()) { if(ele.nodeName() == nodeName) return true; ele = ele.nextSiblingElement(); } } else { QFile::remove(audioPath); qDebug() << errorStr << "line: " << errorLine << "col: " << errorCol; } file.close(); } return false; } //添加第一个å­�节点å�Šå…¶å­�元素 int CustomSound::addXmlNode(QString nodeName, bool initState) { //打开文件 QString audioPath = QDir::homePath() + "/.config/customAudio.xml"; QFile file(audioPath); QDomDocument doc;//增加一个一级å­�节点以å�Šå…ƒç´  if(file.open(QFile::ReadOnly)){ if(doc.setContent(&file)){ file.close(); } else { file.close(); return -1; } } else return -1; //添加新节点 nodeName.remove(" "); nodeName.remove("/"); nodeName.remove("("); nodeName.remove(")"); nodeName.remove("["); nodeName.remove("]"); nodeName.remove(";"); if(nodeName != "" && nodeName.at(0)>='0' && nodeName.at(0)<='9'){ nodeName = "Audio_"+nodeName; } QDomElement root=doc.documentElement(); QDomElement node=doc.createElement(nodeName); QDomElement init=doc.createElement("init"); QDomText text; if(initState) text = doc.createTextNode("true"); else text = doc.createTextNode("false"); init.appendChild(text); node.appendChild(init); root.appendChild(node); qDebug() << "addXmlNode" << nodeName ; //修改first-run状æ€� QDomElement ele = root.firstChildElement(); while(!ele.isNull()) { if(ele.nodeName() == "firstRun"){ QString value = ele.firstChildElement().firstChild().nodeValue(); if(value == "true") ele.firstChildElement().firstChild().setNodeValue("false"); } ele = ele.nextSiblingElement(); } if(file.open(QFile::WriteOnly|QFile::Truncate)) { //输出到文件 QTextStream out_stream(&file); doc.save(out_stream,4); //缩进4æ ¼ file.close(); } return 0; } bool CustomSound::isFirstRun() { QString audioPath = QDir::homePath() + "/.config/customAudio.xml"; QFile file(audioPath); if(!file.exists()){ createAudioFile(); } if(file.open(QFile::ReadOnly)){ QDomDocument doc; if(doc.setContent(&file)){ file.close(); QDomElement root = doc.documentElement(); QDomElement ele = root.firstChildElement(); qDebug()<<"===================ele.nodeName() :"< #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dbus-adaptor/dbus-adaptor.h" #include "dbus-adaptor/bluez-adaptor.h" #include "custom_sound.h" #include "ukmedia_application_volume_widget.h" #include "ukmedia_osd_display_widget.h" #include "ukui_media_set_headset_widget.h" #include "ukmedia_volume_control.h" #include "ukui_list_widget_item.h" #include "ukmedia_system_volume_widget.h" extern "C" { #include #include #include #include } #include #include // 为平æ�¿æ¨¡å¼�æ��供设置音é‡�值 #define UKUI_VOLUME_KEY "volumesize" //音é‡�大å°� #define UKUI_VOLUME_STATE "soundstate" //音é‡�状æ€� #define UKUI_VOLUME_BRIGHTNESS_GSETTING_ID "org.ukui.quick-operation.panel" // åˆ�始化音é‡� #define HEADPHONE_VOLUME 11141 #define HDMI_VOLUME 65536 #define OUTPUT_VOLUME 43909 #define MIC_VOLUME 65536 // 任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ #define PANEL_SETTINGS "org.ukui.panel.settings" #define PANEL_SIZE_KEY "panelsize" #define PANEL_POSITION_KEY "panelposition" const QByteArray TRANSPARENCY_GSETTINGS = "org.ukui.control-center.personalise"; static const gchar *iconNameOutputs[] = { "audio-volume-muted-symbolic", "audio-volume-low-symbolic", "audio-volume-medium-symbolic", "audio-volume-high-symbolic", NULL }; static const gchar *iconNameInputs[] = { "microphone-sensitivity-muted-symbolic", "microphone-sensitivity-low-symbolic", "microphone-sensitivity-medium-symbolic", "microphone-sensitivity-high-symbolic", NULL }; typedef struct { const pa_card_port_info *headphones; const pa_card_port_info *headsetmic; const pa_card_port_info *headphonemic; const pa_card_port_info *internalmic; const pa_card_port_info *internalspk; } headsetPorts; class QDBusServiceWatcher; class UkmediaMainWidget : public QMainWindow { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.ukui.media")//ukui-mediaçš„dbus接å�£ public: explicit UkmediaMainWidget(QMainWindow *parent = nullptr); ~UkmediaMainWidget(); enum PanelPosition{ Bottom = 0, //!< The bottom side of the screen. Top, //!< The top side of the screen. Left, //!< The left side of the screen. Right //!< The right side of the screen. }; protected: bool eventFilter(QObject *obj, QEvent *event); void paintEvent(QPaintEvent *event); void keyPressEvent(QKeyEvent *event); Q_SIGNALS: void updateVolume(int value); void updateSourceVolume(int value); void updateMute(bool isMute); void updateSourceMute(bool isMute); void updateDevSignal(); public Q_SLOTS: QString getDefaultOutputDevice(); QString getDefaultInputDevice(); bool isNoneOutputDevice(); bool isNoneInputDevice(); QStringList getAllOutputDevices(); QStringList getAllInputDevices(); int getDefaultOutputVolume(); int getDefaultInputVolume(); bool getDefaultOutputMuteState(); bool getDefaultInputMuteState(); bool setDefaultOutputVolume(int value); bool setDefaultInputVolume(int value); bool setDefaultOutputMuteState(bool mute); bool setDefaultInputMuteState(bool mute); bool setDefaultOutputDevice(QString deviceName); bool setDefaultInputDevice(QString deviceName); void initPanelGSettings(); QRect caculatePosition(); //任务æ �多å±�显示声音应用获å�–å±�幕å�¯ç”¨åŒºåŸŸæŽ¥å�£ void advancedWidgetShow(); //显示advance widget QStringList getAppList(); QList getRecordAppInfo(); QList getPlaybackAppInfo(); QString getSystemInputDevice(); QString getSystemOutputDevice(); QString getAppInputDevice(QString appName); QString getAppOutputDevice(QString appName); int getAppVolume(QString appName); bool getAppMuteState(QString appName); bool setAppVolume(QString appName, int value); bool setAppMuteState(QString appName, bool state); bool setSystemInputDevice(QString portLabel); bool setSystemOutputDevice(QString portLabel); bool setAppOutputDevice(QString appName, int cardIndex, QString sinkPortName); bool setAppInputDevice(QString appName, int cardIndex, QString sourcePortName); bool isPortHidingNeeded(int soundType, int cardIndex, QString portLabel); private Q_SLOTS: void switchMonoAudio(); void switchModuleLoopBack(); void activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason reason); //托盘图标 void jumpControlPanelSlot(); //跳转到控制é�¢æ�¿ void setHeadsetPort(QString str); //æ ¹æ�®å¼¹å‡ºæ¡†é€‰æ‹©çš„切æ�¢ä¸�å�Œçš„端å�£ void handleTimeout(); void advancedSystemSliderChangedSlot(int value); //advancedSystemSlider值改å�˜ void systemVolumeSliderChangedSlot(int value); void systemVolumeButtonClickedSlot(); void mouseMeddleClickedTraySlot(); //鼠标中间贱点击托盘图标 void appWidgetMuteButtonCLickedSlot();//应用音é‡�é�™éŸ³æŒ‰é’®ç‚¹å‡» void ukuiThemeChangedSlot(const QString &themeStr); //主题改å�˜ void soundThemeChangedSlot(const QString &soundThemeStr); void fontSizeChangedSlot(const QString &themeStr); //字体大å°�改å�˜ void initVolumeSlider(); //åˆ�始化滑动æ�¡ void addAppToAppwidget(QString name, QString iconName, int index, int value, int channel); //添加应用 void removeSubAppWidget(QString m_pAppName); //移除å­�应用窗å�£ void sinkInputVolumeChangedSlot(QString name, QString iconName, int value); //sinkInput音é‡�æ›´æ–° void soundSettingChanged(const QString &); //添加拔æ�’headsetæ��示 void checkAudioDeviceSelectionNeeded (const pa_card_info *info); void updateDevicePort(); void updateListWidgetItemSlot(); //更新输出设备列表 void outputListWidgetCurrentRowChangedSlot(int row); //output list widget选项改å�˜ void inputListWidgetCurrentRowChangedSlot(int row); //output list widget选项改å�˜ void updateAppVolume(QString str, int value, bool state); void deviceChangedShowSlot(QString dev_name);//osdæ��示弹窗 void onTransChanged(); void paintWithTrans(); void onPrepareForSleep(bool sleep); void getSessionActive(); //获å�–session的活跃状æ€� void batteryLevelChanged(QString dev_macAddr, int battery); void sendUpdateVolumeSignal(int soundType, int value); void sendUpdateMuteSignal(int soundType, bool isMute); void initBlueDeviceVolume(int index, QString name); void deviceAdjustSlots(int); private: void UkmediaDbusRegister(); //注册Dbusä¿¡å�· void initSystemTrayIcon(); //åˆ�始化系统托盘 void initWidget(); //åˆ�始化弹出框 void initVolumeLed();//åˆ�始化é�™éŸ³ç�¯ void initGsettings(); //åˆ�始化gsetting void initStrings(); void initLabelAlignment(); //åˆ�始化label对é½�æ–¹å¼� void initSystemVolume(); //åˆ�始化系统音é‡� void myLine(QFrame *volumeLine,QFrame *volumeSettingLine);//添加分隔线 void dealSlot(); //处ç�†æ§½å‡½æ•° void systemTrayMenuInit(); //åˆ�始化å�³é”®è�œå�• void initOutputListWidgetItem();//åˆ�始化默认选择的输出设备 void initInputListWidgetItem();//åˆ�始化默认选择的输输入设备 QPixmap drawLightColoredPixmap(const QPixmap &source); //绘制高亮颜色图标 QPixmap drawDarkColoredPixmap(const QPixmap &source); //绘制深色颜色图标 void themeChangeIcons(); //主题更改时更新图标颜色 void hideWindow(); //éš�è—�窗å�£ void inputVolumeDarkThemeImage(int value,bool status); //绘制input button颜色 void outputVolumeDarkThemeImage(int value,bool status); //绘制output button颜色 void drawImagColorFromTheme(UkuiButtonDrawSvg *button, QString iconStr); //绘制iamge颜色 QString outputVolumeToIconStr(bool status,int volume); QString getAppName(QString desktopfp); //从desktop中获å�–应用å��ç§° QString getAppIcon(QString desktopfp); //从desktop中获å�–应用图标 QString appNameToIconName(QString appName, QString appIconName); void initSubApplicationWidget(QString str); //å­�应用窗å�£å¸ƒå±€ static gboolean verifyAlsaCard (int cardindex,gboolean *headsetmic,gboolean *headphonemic); static headsetPorts *getHeadsetPorts (const pa_card_info *c); void freePrivPortNames(); void setDeviceButtonState(int row); void addOutputListWidgetItem(QString portName, QString portLabel,QString cardName); //添加output listWidget item void addInputListWidgetItem(QString portName, QString cardName); //添加input listwidget item int findCardIndex(QString cardName, QMap cardMap);//查找声å�¡æŒ‡å®šçš„索引 QString findCardName(int index,QMap cardMap); QString findHighPriorityProfile(int index,QString profile); QString findPortSink(int index,QString portName); QString findPortSource(int index,QString portName); bool outputPortIsNeedDelete(int index,QString name);//port是å�¦éœ€è¦�在outputListWidget删除 bool outputPortIsNeedAdd(int index,QString name);//port是å�¦éœ€è¦�在outputListWidget删除 bool inputPortIsNeedDelete(int index,QString name);//port是å�¦éœ€è¦�在inputListWidget删除 bool inputPortIsNeedAdd(int index,QString name);//port是å�¦éœ€è¦�在inputListWidget删除 int indexOfOutputPortInOutputListWidget(QString portName); int indexOfInputPortInInputListWidget(QString portName); void deleteNotAvailableOutputPort(); //删除ä¸�å�¯ç”¨çš„输出端å�£ void addAvailableOutputPort(); //添加å�¯ç”¨è¾“出端å�£ void deleteNotAvailableInputPort(); //删除ä¸�å�¯ç”¨çš„输入端å�£ void addAvailableInputPort(); //添加å�¯ç”¨è¾“入端å�£ QString findOutputPortName(int index,QString portLabel); //找到outputPortLabel对应的portName QString findInputPortName(int index,QString portLabel); //找到inputPortLabel对应的portName QString findOutputPortLabel(int index,QString portName); //查找å��为portName对应的portLabel QString findInputPortLabel(int index,QString portName); //查找å��为portName对应的portLabel void setCardProfile(QString name,QString profile); //设置声å�¡çš„é…�置文件 void setDefaultOutputPortDevice(QString devName,QString portName); //设置默认的输出端å�£ void setDefaultInputPortDevice(int cardIndex, QString portLabel); //设置默认的输入端å�£ QString findCardActiveProfile(int index); //查找声å�¡çš„active profile QString stringRemoveUnrecignizedChar(QString str);//移除xml文件中ä¸�能识别的字符 void findOutputListWidgetItem(QString cardName,QString portLabel); void findInputListWidgetItem(QString cardName,QString portLabel); QString blueCardName(); //记录è“�牙声å�¡å��ç§° bool inputDeviceContainBluetooth(); QString findFile(const QString path,QString str); void inhibit(); void uninhibit(); void switchModuleEchoCancel(); //加载或å�¸è½½é™�噪模å�— void resetVolumeSliderRange(); //é‡�新设置滑动æ�¡çš„范围 void switchStartupPlayMusic(); //接收到开关按钮的gsettingä¿¡å�· void monitorSessionStatus(); void playAlertSound(QString soundEvent); //播放æ��示音 void showUkuiVolumeControlTray(); private: FixLabel *systemWidgetLabel; FixLabel *appWidgetLabel; QHBoxLayout * m_tabBarLayout = nullptr; UkmediaVolumeControl *m_pVolumeControl; Bluetooth_Dbus *m_pBluetoothDbus; MediaAdaptor *m_pMediaDbus; UkmediaSystemVolumeWidget *systemWidget; QTabWidget *m_pTabWidget; ApplicationVolumeWidget *appWidget; //应用界é�¢çª—å�£ UkmediaOsdDisplayWidget *osdWidget; UkuiMediaSetHeadsetWidget *headsetWidget; //当声å�¡ä¸­æœ‰headsetmic 端å�£æ—¶æ�’å…¥4段å¼�耳机的弹窗 UkmediaOsdDisplayWidget *headset; //需求:输出设备æ�’æ‹”æ��示弹出 Divider *volumeLine; Divider *volumeSettingLine; QTimer *timer; //定时器 QMenu *menu; //å�³é”®è�œå�• QGSettings *m_pSoundSettings; QGSettings *m_pStartUpSetting; QGSettings *m_pThemeSetting; //主题gsettting QGSettings *m_pTransparencySetting; //é€�明度gestting QGSettings *m_pVolumeSetting; // QGSettings *m_pFontSetting; //字体gsetting QGSettings *m_pSoundThemeSetting; QGSettings * m_pTransGsettings; //é€�明度é…�置文件 double m_pTransparency=0.0; //é€�明度 QSystemTrayIcon *soundSystemTrayIcon; //系统托盘 QAction *m_pSoundPreferenceAction; //声音首选项è�œå�•项 QStringList *eventList; //æ��示声音类型列表 QStringList *eventIdNameList; //æ��示声音å��称列表 QMap currentOutputPortLabelMap; QMap currentInputPortLabelMap; int headsetCard; //headset 声å�¡ gboolean hasHeadsetmic; //是å�¦åŒ…å�«headset mic端å�£ gboolean hasHeadphonemic; //是å�¦åŒ…å�«headphone mic端å�£ gboolean headsetPluggedIn; //headpset 是å�¦æ�’å…¥ char *m_pHeadphonesName; //headphoneå��ç§° char *m_pHeadsetmicName; // char *m_pHeadphonemicName; char *m_pInternalspkName; char *m_pInternalmicName; QTimer *m_pTimer = nullptr; bool shortcutMute = false; bool firstEntry = true; QProcess *m_process; QString mThemeName = UKUI_THEME_DEFAULT; bool firstEnterSystem = true; ca_context *caContext; bool firstLoad = true; bool isPlay = false; //用于é�¿å…�è¿�行托盘时第一次å“�èµ·çš„æ��示音 bool sinkInputMute = false; bool kylinVideoMuteSignal = false; bool kylinVideoVolumeSignal = false; bool isAppMuteBtnPress = false; int outputListWidgetRow = -1; QString m_languageEnvStr; QString m_sessionControllerName; QString m_sessionPath; QString m_sessionControllerService ; QString m_sessionControllerPath; QString m_sessionControllerManagerInterface; QString m_sessionControllerSeatInterface ; QString m_sessionControllerSessionInterface ; QString m_sessionControllerActiveProperty ; QString m_sessionControllerPropertiesInterface; QDBusUnixFileDescriptor m_inhibitFileDescriptor; QGSettings *m_panelGSettings = nullptr; int m_panelPosition; int m_panelSize; SystemVersion m_version; int m_enableDeviceCount = 0; }; #endif // UKMEDIAMAINWIDGET_H ukui-media/ukui-volume-control-applet-qt/ukmedia_main_widget.cpp0000664000175000017500000040517315170054730024105 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAINWINDOW_WIDTH 420 #define MAINWINDOW_HEIGHT 476 #define WIDGET_RADIUS 12 #define CONTENTS_MARGINS_WIDTH 0,0,0,0 #define VOLUMELINE_POS 0,140 #define SETTINGLINE_POS 0,424 #define KEYBINDINGS_CUSTOM_SCHEMA "org.ukui.media.sound" #define KEYBINDINGS_CUSTOM_DIR "/org/ukui/sound/keybindings/" #define EVENT_SOUNDS_KEY "event-sounds" #define MAX_CUSTOM_SHORTCUTS 1000 #define FILENAME_KEY "filename" #define NAME_KEY "name" double transparency = 0.8; extern bool isCheckBluetoothInput; UkmediaMainWidget::UkmediaMainWidget(QMainWindow *parent) : QMainWindow(parent), m_languageEnvStr(getenv("LANGUAGE")), m_version(UkmediaCommon::getInstance().getSystemVersion()) { //åˆ�始化系统托盘 m_pVolumeControl = new UkmediaVolumeControl(); //åˆ�始化gsetting initGsettings(); initStrings(); //åˆ�始化界é�¢ initWidget(); initLabelAlignment(); //åˆ�始化托盘图标 initSystemTrayIcon(); //Dbus注册 UkmediaDbusRegister(); //处ç�†æ§½å‡½æ•° dealSlot(); } bool UkmediaMainWidget::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::ActivationChange) { if(QApplication::activeWindow() != this) { this->hide(); } } return QWidget::eventFilter(obj,event); } void UkmediaMainWidget::paintEvent(QPaintEvent *event) { } void UkmediaMainWidget::initSystemTrayIcon() { soundSystemTrayIcon = new QSystemTrayIcon(this); ca_context_create(&caContext); //为系统托盘图标添加è�œå�•é�™éŸ³å’Œå£°éŸ³é¦–选项 soundSystemTrayIcon->setToolTip(tr("Output volume control")); #if (QT_VERSION <= QT_VERSION_CHECK(5,6,1)) m_pSoundPreferenceAction = new QAction(tr("Sound preference"),this); #elif (QT_VERSION > QT_VERSION_CHECK(5,6,1)) m_pSoundPreferenceAction = new QAction(tr("Sound preference")); #endif QString settingsIconStr = "document-page-setup-symbolic"; QIcon settingsIcon = QIcon::fromTheme(settingsIconStr); m_pSoundPreferenceAction->setIcon(settingsIcon); soundSystemTrayIcon->setVisible(true); initPanelGSettings(); int nOutputValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); bool outputStatus = m_pVolumeControl->getSinkMute(); outputVolumeDarkThemeImage(nOutputValue, outputStatus); //åˆ�始化å�³é”®è�œå�• systemTrayMenuInit(); } /* * åˆ�始化å�³é”®è�œå�• */ void UkmediaMainWidget::systemTrayMenuInit() { menu = new QMenu(); menu->setAttribute(Qt::WA_NoMouseReplay); soundSystemTrayIcon->setContextMenu(menu); //设置å�³é”®è�œå�• menu->addAction(m_pSoundPreferenceAction); } /* * åˆ�始化界é�¢ */ void UkmediaMainWidget::initWidget() { QWidget::installEventFilter(this);//为这个窗å�£å®‰è£…过滤器 this->setFixedSize(MAINWINDOW_WIDTH,MAINWINDOW_HEIGHT); this->setAttribute(Qt::WA_TranslucentBackground,true); //é€�明 this->setMouseTracking(true); this->setFocusPolicy(Qt::NoFocus); QString platform = QGuiApplication::platformName(); if(!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ QPainterPath path; auto rect = this->rect(); path.addRoundedRect(rect, WIDGET_RADIUS, WIDGET_RADIUS); // KWindowEffects removed in KF6 // KWindowEffects::enableBlurBehind(this->winId(), true, QRegion(path.toFillPolygon().toPolygon())); // 背景模糊 } osdWidget = new UkmediaOsdDisplayWidget(); headsetWidget = new UkuiMediaSetHeadsetWidget; // osd弹窗 m_pTabWidget = new QTabWidget(this); m_pTabWidget->setFocusPolicy(Qt::StrongFocus); this->setCentralWidget(m_pTabWidget); m_pTabWidget->tabBar()->setFixedWidth(this->width()+1); systemWidget = new UkmediaSystemVolumeWidget(m_pTabWidget); appWidget = new ApplicationVolumeWidget(m_pTabWidget); //需求31268å¾…2501å†�å�ˆå…¥ #if 1 systemWidget->m_pSystemVolumeSlider->setEnabled(false); appWidget->systemVolumeSlider->setEnabled(false); systemWidget->m_pSystemVolumeBtn->setEnabled(false); appWidget->systemVolumeBtn->setEnabled(false); #endif volumeLine = new Divider(this); volumeSettingLine = new Divider(this); volumeLine->move(VOLUMELINE_POS); volumeSettingLine->move(SETTINGLINE_POS); m_pTabWidget->addTab(systemWidget, tr("")); m_pTabWidget->addTab(appWidget,tr("")); m_tabBarLayout = new QHBoxLayout(this); m_tabBarLayout->setContentsMargins(CONTENTS_MARGINS_WIDTH); systemWidgetLabel = new FixLabel(tr("System Volume")); systemWidgetLabel->setAlignment(Qt::AlignCenter); appWidgetLabel = new FixLabel(tr("App Volume")); appWidgetLabel->setAlignment(Qt::AlignCenter); m_tabBarLayout->addWidget(systemWidgetLabel); m_tabBarLayout->addWidget(appWidgetLabel); m_pTabWidget->tabBar()->setLayout(m_tabBarLayout); m_pTabWidget->tabBar()->setProperty("setRadius", WIDGET_RADIUS); // tabbar界é�¢å†…圆角 m_pTabWidget->tabBar()->setProperty("useTabbarSeparateLine",false); // 去掉标签页中间的分隔线 m_pTabWidget->setAttribute(Qt::WA_TranslucentBackground,true); // 背景é€�明 解决切æ�¢é»‘å±�问题 paintWithTrans(); } void UkmediaMainWidget::onTransChanged() { m_pTransparency = m_pTransGsettings->get("transparency").toDouble() + 0.15; m_pTransparency = (m_pTransparency > 1) ? 1 : m_pTransparency; paintWithTrans(); } void UkmediaMainWidget::paintWithTrans() { QPalette pal = m_pTabWidget->palette(); QColor color = qApp->palette().base().color(); color.setAlphaF(m_pTransparency); pal.setColor(QPalette::Base, color); m_pTabWidget->setPalette(pal); QPalette tabPal = m_pTabWidget->tabBar()->palette(); tabPal.setColor(QPalette::Base, color); QColor inactiveColor = qApp->palette().window().color(); inactiveColor.setAlphaF(0.86 *m_pTransparency); tabPal.setColor(QPalette::Window, inactiveColor); m_pTabWidget->tabBar()->setPalette(tabPal); } /* * 添加分隔线 */ void UkmediaMainWidget::myLine(QFrame *volumeLine,QFrame *volumeSettingLine) { volumeLine = new QFrame(this); volumeLine->setFrameShape(QFrame::NoFrame); volumeLine->setFrameStyle(QFrame::HLine); volumeLine->setFixedSize(420,1); volumeLine->setParent(this); QPalette palette = volumeLine->palette(); QColor color = QColor(239,239,239); color.setAlphaF(0.1); palette.setColor(QPalette::WindowText, color); volumeLine->setPalette(palette); volumeSettingLine = new QFrame(this); volumeSettingLine->setFrameShape(QFrame::NoFrame); volumeSettingLine->setFrameStyle(QFrame::HLine); volumeSettingLine->setFixedSize(420,1); volumeSettingLine->setParent(this); palette = volumeSettingLine->palette(); palette.setColor(QPalette::WindowText, color); volumeSettingLine->setPalette(palette); volumeLine->move(0,140); volumeSettingLine->move(0,424); } /* * åˆ�始化é�™éŸ³ç�¯ */ void UkmediaMainWidget::initVolumeLed() { bool outputStatus = m_pVolumeControl->getSinkMute();//获å�–输出设备的é�™éŸ³çжæ€� if(outputStatus) { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemOutputVolumeIsMute"); message << "mute"; QDBusConnection::systemBus().send(message); } else { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemOutputVolumeIsMute"); message << "no"; QDBusConnection::systemBus().send(message); } themeChangeIcons(); } /* * 注册dbus */ void UkmediaMainWidget::UkmediaDbusRegister() { QDBusConnection::sessionBus().unregisterService("org.ukui.media"); m_pMediaDbus = new MediaAdaptor(this); QDBusConnection con=QDBusConnection::sessionBus(); if (!con.registerService("org.ukui.media")) qDebug() << "registerService failed" << con.lastError().message(); if (!con.registerObject("/org/ukui/media", this, QDBusConnection::ExportAllSlots| QDBusConnection::ExportAllSignals)) qDebug() << "registerObject failed" << con.lastError().message(); m_pBluetoothDbus = new Bluetooth_Dbus(); } /** * @brief UkmediaMainWidget::initVolumeSlider * åˆ�始化音é‡�滑动æ�¡å’Œè¾“出设备列表 **/ void UkmediaMainWidget::initVolumeSlider() { resetVolumeSliderRange(); int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); QString percent = QString::number(mediaVolume); appWidget->systemVolumeDisplayLabel->setText(percent + "%"); systemWidget->m_pSystemVolumeSliderLabel->setText(percent + "%"); appWidget->systemVolumeSlider->blockSignals(true); systemWidget->m_pSystemVolumeSlider->blockSignals(true); systemWidget->m_pSystemVolumeSlider->setValue(mediaVolume); appWidget->systemVolumeSlider->setValue(mediaVolume); systemWidget->m_pSystemVolumeSlider->blockSignals(false); appWidget->systemVolumeSlider->blockSignals(false); initOutputListWidgetItem(); initInputListWidgetItem(); themeChangeIcons(); } /* * åˆ�始化output/input list widget的选项 */ void UkmediaMainWidget::initOutputListWidgetItem() { QString outputCardName = findCardName(m_pVolumeControl->defaultOutputCard, m_pVolumeControl->cardMap); QString outputPortLabel = findOutputPortLabel(m_pVolumeControl->defaultOutputCard, m_pVolumeControl->sinkPortName); if (outputCardName == "histen.algo") { outputPortLabel = "HUAWEI Histen"; } findOutputListWidgetItem(outputCardName, outputPortLabel); int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); appWidget->systemVolumeSlider->blockSignals(true); systemWidget->m_pSystemVolumeSlider->blockSignals(true); appWidget->systemVolumeSlider->setValue(mediaVolume); systemWidget->m_pSystemVolumeSlider->setValue(mediaVolume); appWidget->systemVolumeSlider->blockSignals(false); systemWidget->m_pSystemVolumeSlider->blockSignals(false); appWidget->systemVolumeDisplayLabel->setText(QString::number(mediaVolume) + "%"); systemWidget->m_pSystemVolumeSliderLabel->setText(QString::number(mediaVolume) + "%"); qDebug() << "initOutputListWidgetItem" << m_pVolumeControl->defaultOutputCard << outputCardName << m_pVolumeControl->sinkPortName << outputPortLabel; } void UkmediaMainWidget::initInputListWidgetItem() { QString inputCardName = findCardName(m_pVolumeControl->defaultInputCard, m_pVolumeControl->cardMap); QString inputPortLabel = findInputPortLabel(m_pVolumeControl->defaultInputCard, m_pVolumeControl->sourcePortName); findInputListWidgetItem(inputCardName, inputPortLabel); //bug#165600 接入两个å�Šä»¥ä¸Šè¾“入设备时,切æ�¢è¾“入设备切æ�¢ä¸�æˆ�功(切æ�¢ä¹‹å�Žé»˜è®¤ä½¿ç”¨å’ŒéŸ³é‡�值的ä»�是上个设备) //å�Žä¸ºæœºå™¨ï¼Œé™�噪模å�—会将主设备映射在usb设备上 if (inputCardName.contains("usb", Qt::CaseInsensitive)) { m_pVolumeControl->getModuleIndexByName("module-echo-cancel"); QTimer::singleShot(300,this,[=](){ qDebug() << __func__ << "unload module echo cancel" << m_pVolumeControl->findModuleIndex; pa_context_unload_module(m_pVolumeControl->getContext(), m_pVolumeControl->findModuleIndex, nullptr, nullptr); }); } qDebug() << "initInputListWidgetItem" << m_pVolumeControl->defaultInputCard << inputCardName << m_pVolumeControl->sourcePortName << inputPortLabel; } QString UkmediaMainWidget::outputVolumeToIconStr(bool status,int volume) { QString iconStr; if (status) { iconStr = iconNameOutputs[0]; } else if (volume <= 0 && !shortcutMute) { iconStr = iconNameOutputs[0]; } else if(volume <= 0 && shortcutMute){ iconStr = iconNameOutputs[0]; } else if (volume > 0 && volume <= 33) { iconStr = iconNameOutputs[1]; } else if (volume >33 && volume <= 66) { iconStr = iconNameOutputs[2]; } else { iconStr = iconNameOutputs[3]; } return iconStr; } /* * 处ç�†æ§½å‡½æ•° */ void UkmediaMainWidget::dealSlot() { if (nullptr == m_pTimer) { m_pTimer = new QTimer(this); } m_pTimer->setInterval(100); m_pTimer->setSingleShot(true); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout())); QDBusInterface *iface = new QDBusInterface("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus(), this); connect(iface, SIGNAL(PrepareForSleep(bool)), this, SLOT(onPrepareForSleep(bool))); //æ ¹æ�®è®¾å¤‡æ£€æµ‹å�‘æ�¥çš„ä¿¡å�·ï¼Œæ˜¾ç¤ºç›¸åº”çš„æ��示窗 connect(m_pVolumeControl,SIGNAL(device_changed_signal(QString)),this,SLOT(deviceChangedShowSlot(QString))); //声å�¡åŒ…å�«headsetmic 端å�£æ—¶æ�’å…¥4段å¼�mic需è¦�设置对应的port QDBusConnection::sessionBus().connect( QString(), "/", "org.ukui.media", "headsetJack", this, SLOT(setHeadsetPort(QString))); QTimer::singleShot(50, this, SLOT(initVolumeSlider())); connect(m_pVolumeControl,&UkmediaVolumeControl::updateMute,this,[=](bool state) { bool outputStatus = m_pVolumeControl->getSinkMute();//获å�–输出设备的é�™éŸ³çжæ€� if(outputStatus) { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemOutputVolumeIsMute"); message << "mute"; QDBusConnection::systemBus().send(message); } else { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemOutputVolumeIsMute"); message << "no"; QDBusConnection::systemBus().send(message); } themeChangeIcons(); sendUpdateMuteSignal(SoundType::SINK, state); }); connect(m_pVolumeControl,&UkmediaVolumeControl::updateSourceMute,this,[=](bool state) { bool inputStatus = m_pVolumeControl->getSourceMute();//获å�–输入设备的é�™éŸ³çжæ€� if(inputStatus) { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemInputVolumeIsMute"); message << "mute"; QDBusConnection::systemBus().send(message); } else { QDBusMessage message =QDBusMessage::createSignal("/","org.ukui.media","systemInputVolumeIsMute"); message << "no"; QDBusConnection::systemBus().send(message); } themeChangeIcons(); sendUpdateMuteSignal(SoundType::SOURCE, state); }); connect(m_pVolumeControl, &UkmediaVolumeControl::updateVolume, this, [=](int value){ int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); QString percent = QString::number(mediaVolume); appWidget->systemVolumeDisplayLabel->setText(percent + "%"); systemWidget->m_pSystemVolumeSliderLabel->setText(percent + "%"); appWidget->systemVolumeSlider->blockSignals(true); systemWidget->m_pSystemVolumeSlider->blockSignals(true); appWidget->systemVolumeSlider->setValue(mediaVolume); systemWidget->m_pSystemVolumeSlider->setValue(mediaVolume); appWidget->systemVolumeSlider->blockSignals(false); systemWidget->m_pSystemVolumeSlider->blockSignals(false); themeChangeIcons(); sendUpdateVolumeSignal(SoundType::SINK, mediaVolume); /* isPlayé�¿å…�第一次è¿�行å�Œæ­¥éŸ³é‡�æ—¶å“�èµ·æ��示音 * m_pTimerå¿«æ�·é”®ç­‰å…¶ä»–æ–¹å¼�播放æ��示音 */ if (isPlay && m_pTimer) { m_pTimer->start(); } else if (!isPlay && !m_pVolumeControl->defaultSinkName.contains("auto_null")) { isPlay = true; } qDebug() << "UpdateSinkVolume" << value << mediaVolume << m_pVolumeControl->getSinkMute(); }); connect(m_pVolumeControl, &UkmediaVolumeControl::updateSourceVolume, this, [=](int value){ int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); sendUpdateVolumeSignal(SoundType::SOURCE, mediaVolume); themeChangeIcons(); initInputListWidgetItem(); qDebug() << "UpdateSourceVolume" << value << mediaVolume << m_pVolumeControl->getSourceMute(); }); // QDesktopWidget removed in Qt6, using QScreen instead QScreen *screen = QApplication::primaryScreen(); connect(screen,&QScreen::geometryChanged,this,[=](){ if(this->isHidden()) return; else this->hide(); }); // QDesktopWidget removed in Qt6 // No direct replacement for screenCountChanged in Qt6 // Commented out for now /* connect(...,this,[=](){ if(this->isHidden()) return; else this->hide(); }); */ connect(m_pVolumeControl, SIGNAL(addSinkInputSignal(QString, QString, int, int, int)), this, SLOT(addAppToAppwidget(QString, QString, int, int, int))); connect(m_pVolumeControl, SIGNAL(removeSinkInputSignal(QString)), this, SLOT(removeSubAppWidget(QString))); connect(m_pVolumeControl, SIGNAL(sinkInputVolumeChangedSignal(QString, QString, int)), this, SLOT(sinkInputVolumeChangedSlot(QString, QString, int))); connect(m_pVolumeControl,SIGNAL(deviceChangedSignal()),this,SLOT(updateListWidgetItemSlot())); QDBusConnection::sessionBus().connect( QString(), "/", "org.kylin.music", "sinkInputVolumeChanged", this, SLOT(updateAppVolume(QString,int,bool))); QDBusConnection::sessionBus().connect( QString(), "/", "org.kylin.video", "sinkInputVolumeChanged", this, SLOT(updateAppVolume(QString,int,bool))); connect(systemWidget->m_pOutputListWidget,&QListWidget::itemClicked,this,[=](){ if (outputListWidgetRow != systemWidget->m_pOutputListWidget->currentRow()) { outputListWidgetCurrentRowChangedSlot(systemWidget->m_pOutputListWidget->currentRow()); outputListWidgetRow = systemWidget->m_pOutputListWidget->currentRow(); } }); connect(systemWidget->m_pInputListWidget, SIGNAL(currentRowChanged(int)), this, SLOT(inputListWidgetCurrentRowChangedSlot(int))); /* * 完整模å¼�下,应用音é‡�界é�¢ï¼Œå½“滑动æ�¡å€¼æ”¹å�˜æ—¶æ›´æ”¹ç³»ç»ŸéŸ³é‡� */ connect(appWidget->systemVolumeSlider,SIGNAL(valueChanged(int)),this,SLOT(advancedSystemSliderChangedSlot(int))); connect(systemWidget->m_pSystemVolumeSlider,SIGNAL(valueChanged(int)),this,SLOT(systemVolumeSliderChangedSlot(int))); connect(systemWidget->m_pSystemVolumeBtn,SIGNAL(clicked()),this,SLOT(systemVolumeButtonClickedSlot())); connect(appWidget->systemVolumeBtn,SIGNAL(clicked()),this,SLOT(appWidgetMuteButtonCLickedSlot())); connect(soundSystemTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),\ this,SLOT(activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason))); connect(m_pSoundPreferenceAction,SIGNAL(triggered()),this,SLOT(jumpControlPanelSlot())); connect(m_pVolumeControl,SIGNAL(updatePortSignal()),this,SLOT(updateDevicePort())); connect(m_pVolumeControl,SIGNAL(checkDeviceSelectionSianal(const pa_card_info *)),this,SLOT(checkAudioDeviceSelectionNeeded(const pa_card_info *))); connect(m_pVolumeControl,&UkmediaVolumeControl::removeSinkSignal,[=](){ qDebug() << "removre sink signal"; }); connect(appWidget->volumeSettingButton,SIGNAL(clicked()),this,SLOT(jumpControlPanelSlot())); connect(systemWidget->volumeSettingButton,SIGNAL(clicked()),this,SLOT(jumpControlPanelSlot())); monitorSessionStatus(); // connect(m_pVolumeControl, &UkmediaVolumeControl::bluetoothBatteryChanged, this, &UkmediaMainWidget::batteryLevelChanged); // connect(m_pVolumeControl, &UkmediaVolumeControl::initBlueDeviceVolumeSig, this, &UkmediaMainWidget::initBlueDeviceVolume); if(!QDBusConnection::sessionBus().connect("org.ukui.volume.control", "/org/ukui/volume/control", "org.ukui.volume.control", "deviceAdjust", this, SLOT(deviceAdjustSlots(int)))) { qDebug() << "Audio framwork interface error, connect " << "deviceChanged" << "failed!"; qDebug() << QDBusConnection::sessionBus().lastError().message(); } } void UkmediaMainWidget::initGsettings() { //检测系统主题 if (QGSettings::isSchemaInstalled(UKUI_THEME_SETTING)){ m_pThemeSetting = new QGSettings(UKUI_THEME_SETTING); m_pFontSetting = new QGSettings(UKUI_THEME_SETTING); QString fontType; if (m_pThemeSetting->keys().contains("styleName")) { mThemeName = m_pThemeSetting->get(UKUI_THEME_NAME).toString(); } if (m_pFontSetting->keys().contains("systemFont")) { fontType = m_pFontSetting->get("systemFont").toString(); } if (m_pFontSetting->keys().contains("systemFontSize")) { int font = m_pFontSetting->get("system-font-size").toInt(); QFont fontSize(fontType,font); // appWidget->systemVolumeLabel->setFont(fontSize); } connect(m_pFontSetting,SIGNAL(changed(const QString &)),this,SLOT(fontSizeChangedSlot(const QString &))); connect(m_pThemeSetting, SIGNAL(changed(const QString &)),this,SLOT(ukuiThemeChangedSlot(const QString &))); } //获å�–声音gsettings值 if (QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)){ m_pSoundSettings = new QGSettings(KEY_SOUNDS_SCHEMA); // connect(m_pVolumeControl, SIGNAL(paContextReady()), this, SLOT(switchModuleEchoCancel())); // connect(m_pVolumeControl, SIGNAL(paContextReady()), this, SLOT(switchModuleLoopBack())); // connect(m_pVolumeControl, SIGNAL(paContextReady()),this,SLOT(switchMonoAudio())); // connect(m_pSoundSettings, SIGNAL(changed(const QString &)),this,SLOT(soundSettingChanged(const QString &))); } //监å�¬å¼€æœºéŸ³ä¹�的开关键值 if (QGSettings::isSchemaInstalled(UKUI_SWITCH_SETTING)) { m_pStartUpSetting = new QGSettings(UKUI_SWITCH_SETTING); if (m_pStartUpSetting->keys().contains("startupMusic")) { bool state = m_pStartUpSetting->get(UKUI_STARTUP_MUSIC_KEY).toBool();//开机音ä¹� m_pVolumeControl->insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_STRATUP_SOUNDEFFECT_KEY, state); } connect(m_pStartUpSetting, SIGNAL(changed(const QString &)),this,SLOT(soundSettingChanged(const QString &))); } //获å�–é€�明度 if(QGSettings::isSchemaInstalled(TRANSPARENCY_GSETTINGS)) { m_pTransGsettings = new QGSettings(TRANSPARENCY_GSETTINGS); if(m_pTransGsettings->keys().contains(QString("transparency"))) { m_pTransparency=m_pTransGsettings->get("transparency").toDouble() + 0.15; m_pTransparency = (m_pTransparency > 1) ? 1 : m_pTransparency; connect(m_pTransGsettings, SIGNAL(changed(const QString &)), this, SLOT(onTransChanged())); } } if(QGSettings::isSchemaInstalled(UKUI_GLOBALTHEME_SETTINGS)){ m_pSoundThemeSetting = new QGSettings(UKUI_GLOBALTHEME_SETTINGS); if(m_pSoundThemeSetting->keys().contains("globalThemeName")){ QString soundThemestr = m_pSoundThemeSetting->get(GLOBAL_THEME_NAME).toString(); if(m_pSoundSettings->keys().contains("themeName") && soundThemestr != "custom"){ m_pSoundSettings->set(SOUND_THEME_KEY,soundThemestr); } } connect(m_pSoundThemeSetting, SIGNAL(changed(const QString &)),this,SLOT(soundThemeChangedSlot(const QString &))); } } void UkmediaMainWidget::initStrings() { const static QString s_login1Name = QStringLiteral("logind"); const static QString s_login1Service = QStringLiteral("org.freedesktop.login1"); const static QString s_login1Path = QStringLiteral("/org/freedesktop/login1"); const static QString s_login1ManagerInterface = QStringLiteral("org.freedesktop.login1.Manager"); const static QString s_login1SeatInterface = QStringLiteral("org.freedesktop.login1.Seat"); const static QString s_login1SessionInterface = QStringLiteral("org.freedesktop.login1.Session"); const static QString s_login1ActiveProperty = QStringLiteral("Active"); const static QString s_dbusPropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); m_sessionControllerName = s_login1Name; m_sessionControllerService = s_login1Service; m_sessionControllerPath = s_login1Path; m_sessionControllerManagerInterface = s_login1ManagerInterface; m_sessionControllerSeatInterface = s_login1SeatInterface; m_sessionControllerSessionInterface = s_login1SessionInterface; m_sessionControllerActiveProperty = s_login1ActiveProperty; m_sessionControllerPropertiesInterface = s_dbusPropertiesInterface; } void UkmediaMainWidget::initLabelAlignment() { // 哈维柯语言环境下默认å�šäº†labelå�³å¯¹é½�æ–¹å¼�处ç�†ï¼Œå› æ­¤å�ªéœ€è¦�在其他语言环境下对这些labelå�šå·¦å±…中对é½�æ–¹å¼�处ç�†å�³å�¯ if (!UkmediaCommon::getInstance().isHWKLanguageEnv(m_languageEnvStr)) { systemWidget->setLabelAlignment(Qt::AlignRight | Qt::AlignVCenter); appWidget->setLabelAlignment(Qt::AlignRight | Qt::AlignVCenter); } } /* * 当检测到4段å¼�3.5mm耳机æ�’入时(声å�¡åŒ…å�«headsetmic端å�£) */ void UkmediaMainWidget::setHeadsetPort(QString str) { qDebug() << "setHeadsetPort " << str << m_pVolumeControl->sinkIndex; /* *output: headphone *input: intel mic */ if (strcmp(str.toLatin1().data(),"headphone") == 0) { m_pVolumeControl->setSinkPort(m_pVolumeControl->defaultSinkName,m_pHeadphonesName); m_pVolumeControl->setSourcePort(m_pVolumeControl->defaultSourceName,m_pInternalmicName); /* *当需è¦�设置的输入端å�£ä¸�在å�Œä¸€ä¸ªsink上时,需è¦�设置默认的输入设备 */ } /*output: headphone input: headset mic*/ else if (strcmp(str.toLatin1().data(),"headset") == 0) { m_pVolumeControl->setSinkPort(m_pVolumeControl->defaultSinkName,m_pHeadphonesName); m_pVolumeControl->setSourcePort(m_pVolumeControl->defaultSourceName,m_pHeadsetmicName); /* *当需è¦�设置的输入端å�£ä¸�在å�Œä¸€ä¸ªsink上时,需è¦�设置默认的输入设备 */ }/*output: speaker input: headphone mic*/ else if (strcmp(str.toLatin1().data(),"headphone mic") == 0) { m_pVolumeControl->setSinkPort(m_pVolumeControl->defaultSinkName,m_pInternalspkName); m_pVolumeControl->setSourcePort(m_pVolumeControl->defaultSourceName,m_pHeadphonemicName); /* *当需è¦�设置的输入端å�£ä¸�在å�Œä¸€ä¸ªsink上时,需è¦�设置默认的输入设备 */ } } /* * 音é‡�改å�˜æ��示:策略是å�œæ­¢æ»‘动时,播放æ��示声 */ void UkmediaMainWidget::handleTimeout() { playAlertSound("audio-volume-change"); } void UkmediaMainWidget::themeChangeIcons() { int nOutputValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSinkVolume()); int nInputValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(m_pVolumeControl->getSourceVolume()); bool outputStatus = m_pVolumeControl->getSinkMute(); bool inputStatus = m_pVolumeControl->getSourceMute(); inputVolumeDarkThemeImage(nInputValue,inputStatus); outputVolumeDarkThemeImage(nOutputValue,outputStatus); systemWidget->m_pSystemVolumeBtn->repaint(); appWidget->systemVolumeBtn->repaint(); if(outputStatus) soundSystemTrayIcon->setToolTip(tr("Current volume:") + tr("Muted") ); else soundSystemTrayIcon->setToolTip(tr("Current volume:") + QString::number(nOutputValue) + "%"); } /* * éš�è—�窗å�£ */ void UkmediaMainWidget::hideWindow() { this->hide(); } /* * 字体改å�˜éœ€æ›´æ–°å­—体大å°� */ void UkmediaMainWidget::fontSizeChangedSlot(const QString &themeStr) { QString fontType; if (m_pFontSetting->keys().contains("systemFont")) { fontType = m_pFontSetting->get("systemFont").toString(); } if (m_pFontSetting->keys().contains("systemFontSize")) { int font = m_pFontSetting->get("system-font-size").toInt(); QFont fontSize(fontType,font); } } /* * 系统主题改å�˜ */ void UkmediaMainWidget::ukuiThemeChangedSlot(const QString &themeStr) { qDebug() << "ukuiThemeChangedSlot" << mThemeName; if (m_pThemeSetting->keys().contains("styleName")) { mThemeName = m_pThemeSetting->get(UKUI_THEME_NAME).toString(); } themeChangeIcons(); onTransChanged(); Q_EMIT qApp->paletteChanged(qApp->palette()); this->repaint(); } /* * 系统音效主题改å�˜ */ void UkmediaMainWidget::soundThemeChangedSlot(const QString &soundThemeStr) { if(m_pSoundThemeSetting->keys().contains("globalThemeName")){ QString soundstr = m_pSoundThemeSetting->get(GLOBAL_THEME_NAME).toString(); if(m_pSoundSettings->keys().contains("themeName") && soundstr != "custom") m_pSoundSettings->set(SOUND_THEME_KEY,soundstr); } } /* * 滑动æ�¡æŽ§åˆ¶è¾“出音é‡� */ void UkmediaMainWidget::systemVolumeSliderChangedSlot(int value) { QString percent; percent = QString::number(value); appWidget->systemVolumeSlider->blockSignals(true); appWidget->systemVolumeSlider->setValue(value); appWidget->systemVolumeSlider->blockSignals(false); appWidget->systemVolumeDisplayLabel->setText(percent + "%"); systemWidget->m_pSystemVolumeSliderLabel->setText(percent + "%"); int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->getDefaultSinkIndex(); m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex, paVolume); firstEnterSystem = false; } /* * 完整模å¼�下,应用音é‡�选项中系统音é‡�控制输出音é‡�值 */ void UkmediaMainWidget::advancedSystemSliderChangedSlot(int value) { QString percent; percent = QString::number(value); systemWidget->m_pSystemVolumeSlider->blockSignals(true); systemWidget->m_pSystemVolumeSlider->setValue(value); systemWidget->m_pSystemVolumeSlider->blockSignals(false); appWidget->systemVolumeDisplayLabel->setText(percent + "%"); systemWidget->m_pSystemVolumeSliderLabel->setText(percent + "%"); int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->getDefaultSinkIndex(); m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex, paVolume); } void UkmediaMainWidget::systemVolumeButtonClickedSlot() { m_pVolumeControl->setSinkMute(!m_pVolumeControl->sinkMuted); QTimer * time = new QTimer; time->start(100); connect(time,&QTimer::timeout,[=](){ themeChangeIcons(); time->disconnect(); delete time; }); } /* * 完整模å¼�中应用音é‡�çš„é�™éŸ³æŽ§åˆ¶ */ void UkmediaMainWidget::appWidgetMuteButtonCLickedSlot() { m_pVolumeControl->setSinkMute(!m_pVolumeControl->sinkMuted); QTimer * time = new QTimer; time->start(100); connect(time,&QTimer::timeout,[=](){ themeChangeIcons(); time->disconnect(); delete time; }); } /* * 声音托盘的触å�‘事件,包括鼠标左键点击,å�Œå‡»ï¼Œæ»šè½®ï¼Œå�³å‡» */ void UkmediaMainWidget::activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason reason) { QString platform = QGuiApplication::platformName(); if(!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ // KWindowInfo API changed in KF6 // const KWindowInfo info(this->winId(), NET::WMState); // if (!info.hasState(NET::SkipTaskbar) || !info.hasState(NET::SkipPager)) { // KWindowSystem::setState(this->winId(), NET::SkipTaskbar | NET::SkipPager); // } } switch(reason) { //鼠标中间键点击图标 case QSystemTrayIcon::MiddleClick: { if (this->isHidden()) { mouseMeddleClickedTraySlot(); } else { hideWindow(); } break; } //鼠标左键点击图标 case QSystemTrayIcon::Trigger: { if(this->isVisible()){ hideWindow(); break; } showUkuiVolumeControlTray(); break; } //鼠标左键å�Œå‡»å›¾æ ‡ case QSystemTrayIcon::DoubleClick: { hideWindow(); break; } case QSystemTrayIcon::Context:{ if(this ->isHidden()) { menu->popup(QCursor::pos()); } else{ this->hideWindow(); } break; } default: break; } } /* * 鼠标滚轮点击托盘图标,设置输出音é‡�çš„é�™éŸ³çжæ€� */ void UkmediaMainWidget::mouseMeddleClickedTraySlot() { m_pVolumeControl->setSinkMute(!m_pVolumeControl->sinkMuted); QTimer * time = new QTimer; time->start(100); connect(time,&QTimer::timeout,[=](){ themeChangeIcons(); time->disconnect(); delete time; }); } /* * 点击è�œå�•中声音设置跳转到控制é�¢æ�¿çš„声音控制 */ void UkmediaMainWidget::jumpControlPanelSlot() { m_process = new QProcess(0); m_process->start("ukui-control-center", QStringList() << "-m" << "Audio"); m_process->waitForStarted(); this->hide(); return; } void UkmediaMainWidget::drawImagColorFromTheme(UkuiButtonDrawSvg *button, QString iconStr) { button->themeIcon.image = QIcon::fromTheme(iconStr).pixmap(24,24).toImage(); if (mThemeName == UKUI_THEME_LIGHT) button->themeIcon.color = QColor(0,0,0,216); else button->themeIcon.color = QColor(255,255,255,216); } /* 深色主题时输出音é‡�图标 */ void UkmediaMainWidget::outputVolumeDarkThemeImage(int value,bool status) { QString iconStr = outputVolumeToIconStr(status,value); systemWidget->m_pSystemVolumeBtn->setIcon(QIcon::fromTheme(iconStr)); appWidget->systemVolumeBtn->setIcon(QIcon::fromTheme(iconStr)); bool isMute = m_pVolumeControl->getSinkMute(); if(iconStr == "audio-volume-muted-symbolic" && isMute) { systemWidget->m_pSystemVolumeBtn->setChecked(false); appWidget->systemVolumeBtn->setChecked(false); } else { systemWidget->m_pSystemVolumeBtn->setChecked(true); appWidget->systemVolumeBtn->setChecked(true); } soundSystemTrayIcon->setIcon(QIcon::fromTheme(iconStr)); } /* 输入音é‡�图标 */ void UkmediaMainWidget::inputVolumeDarkThemeImage(int value,bool status) { QString inputIconStr; if (status) { inputIconStr = iconNameInputs[0]; } else if (value <= 0) { inputIconStr = iconNameInputs[0]; } else if (value > 0 && value <= 33) { inputIconStr = iconNameInputs[1]; } else if (value >33 && value <= 66) { inputIconStr = iconNameInputs[2]; } else { inputIconStr = iconNameInputs[3]; } } /* * 绘制高亮颜色图标 */ QPixmap UkmediaMainWidget::drawLightColoredPixmap(const QPixmap &source) { QColor gray(255,255,255); QColor standard (0,0,0); QImage img = source.toImage(); for (int x = 0; x < img.width(); x++) { for (int y = 0; y < img.height(); y++) { auto color = img.pixelColor(x, y); if (color.alpha() > 0) { if (qAbs(color.red()-gray.red())<20 && qAbs(color.green()-gray.green())<20 && qAbs(color.blue()-gray.blue())<20) { color.setRed(255); color.setGreen(255); color.setBlue(255); img.setPixelColor(x, y, color); } else { color.setRed(255); color.setGreen(255); color.setBlue(255); img.setPixelColor(x, y, color); } } } } return QPixmap::fromImage(img); } /* * 绘制深色颜色图标 */ QPixmap UkmediaMainWidget::drawDarkColoredPixmap(const QPixmap &source) { QColor gray(255,255,255); QImage img = source.toImage(); for (int x = 0; x < img.width(); x++) { for (int y = 0; y < img.height(); y++) { auto color = img.pixelColor(x, y); if (color.alpha() > 0) { if (qAbs(color.red()-gray.red())<20 && qAbs(color.green()-gray.green())<20 && qAbs(color.blue()-gray.blue())<20) { color.setRed(0); color.setGreen(0); color.setBlue(0); img.setPixelColor(x, y, color); } else { color.setRed(0); color.setGreen(0); color.setBlue(0); img.setPixelColor(x, y, color); } } } } return QPixmap::fromImage(img); } void UkmediaMainWidget::initPanelGSettings() { const QByteArray id(PANEL_SETTINGS); if (QGSettings::isSchemaInstalled(id)) { if (m_panelGSettings == nullptr) { m_panelGSettings = new QGSettings(id); } if (m_panelGSettings->keys().contains(PANEL_POSITION_KEY)) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (m_panelGSettings->keys().contains(PANEL_SIZE_KEY)) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } connect(m_panelGSettings, &QGSettings::changed, this, [&] (const QString &key) { if (key == PANEL_POSITION_KEY) { m_panelPosition = m_panelGSettings->get(PANEL_POSITION_KEY).toInt(); } if (key == PANEL_SIZE_KEY) { m_panelSize = m_panelGSettings->get(PANEL_SIZE_KEY).toInt(); } if (this->isVisible()) { advancedWidgetShow(); } }); } } QRect UkmediaMainWidget::caculatePosition() { QRect availableGeo = QGuiApplication::screenAt(QCursor::pos())->geometry(); int x, y; int margin = 8; switch (m_panelPosition) { case PanelPosition::Top: { if (UkmediaCommon::getInstance().isHWKLanguageEnv(m_languageEnvStr)) { x = margin; y = availableGeo.y() + m_panelSize + margin; } else { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + m_panelSize + margin; } } break; case PanelPosition::Bottom: { if (UkmediaCommon::getInstance().isHWKLanguageEnv(m_languageEnvStr)) { x = margin; y = availableGeo.y() + availableGeo.height() - m_panelSize - this->height() - margin; } else { x = availableGeo.x() + availableGeo.width() - this->width() - margin; y = availableGeo.y() + availableGeo.height() - m_panelSize - this->height() - margin; } } break; case PanelPosition::Left: { x = availableGeo.x() + m_panelSize + margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; case PanelPosition::Right: { x = availableGeo.x() + availableGeo.width() - m_panelSize - this->width() - margin; y = availableGeo.y() + availableGeo.height() - this->height() - margin; } break; } return QRect(x, y, this->width(), this->height()); } /* * 完整模å¼�界é�¢çš„æ˜¾ç¤º */ void UkmediaMainWidget::advancedWidgetShow() { kdk::WindowManager::setSkipSwitcher(this->windowHandle(),true); //start main中å±�蔽setWindowFlags,通过这里去除标题æ � kdk::UkuiStyleHelper::self()->removeHeader(this); //end QRect rect = caculatePosition(); QString platform = QGuiApplication::platformName(); qDebug() << "platform:" << platform; if(!platform.startsWith(QLatin1String("wayland"),Qt::CaseInsensitive)){ this->setGeometry(rect); this->showNormal(); } else { this->show(); kdk::WindowManager::setGeometry(this->windowHandle(), rect); } this->raise(); this->activateWindow(); } QString UkmediaMainWidget::appNameToIconName(QString appName, QString appIconName) { QString iconName = "/usr/share/applications/"; qDebug()<< "appNameToIconName" << appName << appIconName; iconName.append(appIconName); iconName.append(".desktop"); /* Some applications desktop file exist in /etc/xdg/autostart/ path */ QFileInfo file(iconName); if (!file.exists()) { iconName = "/etc/xdg/autostart/"; iconName.append(appIconName); iconName.append(".desktop"); } return iconName; } void UkmediaMainWidget::addAppToAppwidget(QString appName, QString appIconName, int index, int value, int channel) { //设置应用的图标 QString iconName = appNameToIconName(appName,appIconName); QString description = appName; QString pAppName = getAppName(iconName); QString pAppIcon = getAppIcon(iconName); initSubApplicationWidget(pAppIcon); qDebug() << "appName:" << appName << "appIconName:" << appIconName << "pAppIcon:" << pAppIcon << "iconName:" << iconName; appWidget->app_volume_list->append(appIconName); QString appSliderStr = appName; QString appMuteBtnlStr = appName; QString appVolumeLabelStr = appName; QStringList strList; strList<appSlider->setObjectName(appSliderStr); appWidget->appMuteBtn->setObjectName(appIconName); appWidget->appVolumeLabel->setObjectName(appVolumeLabelStr); //åˆ�始化应用音é‡�滑动æ�¡ int sliderValue = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); appWidget->appIconBtn->setCheckable(false); appWidget->appIconBtn->setChecked(false); appWidget->appSlider->blockSignals(true); appWidget->appSlider->setValue(sliderValue); appWidget->appVolumeLabel->setText(QString::number(sliderValue) + "%"); appWidget->appSlider->blockSignals(false); qDebug() << "åˆ�始化应用音é‡�滑动æ�¡:" << appWidget->appSlider->value() << appSliderStr; /*滑动æ�¡æŽ§åˆ¶åº”用音é‡�*/ connect(appWidget->appSlider, &QSlider::valueChanged, [=](int value) { bool isMute = false; int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); QString appName = appSliderStr.split("Slider").at(0); qDebug() << "调节应用音é‡�滑动æ�¡çš„indexå’ŒappName" << index << appName; //因为一个应用å�¯èƒ½äº§ç”Ÿå¤šä¸ªsinkinput,所以è¦�对相å�Œdescription的所有index设置音é‡�,é��历indexmap设置 QMap::iterator it; bool isSinkInput = false; //应用å�¯èƒ½å�Œæ—¶äº§ç”Ÿsinkinputå’Œsource-output,此时需è¦�忽略设置输入音é‡� for(it = m_pVolumeControl->sinkInputIndexMap.begin(); it != m_pVolumeControl->sinkInputIndexMap.end();) { if (it.value() == appName) { isSinkInput = true; m_pVolumeControl->setSinkInputVolume(it.key(), paVolume, channel); } it++; } for(it = m_pVolumeControl->sourceOutputIndexMap.begin(); it != m_pVolumeControl->sourceOutputIndexMap.end();) { if(it.value() == appName && !isSinkInput){ m_pVolumeControl->setSourceOutputVolume(it.key(), paVolume, channel); } it++; } if(kylinVideoVolumeSignal) { kylinVideoVolumeSignal = false; } else { QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "sinkVolumeChanged"); message<findChild (appVolumeLabelStr); if (label == nullptr) return; label->setText(QString::number(value)+"%"); QSlider *slider = appWidget->findChild(appSliderStr); if (slider == nullptr) return; QPushButton *btn = appWidget->findChild(appMuteBtnlStr); if (btn == nullptr) return; QString audioIconStr = outputVolumeToIconStr(isMute,value); QSize iconSize(24,24); if (mThemeName == UKUI_THEME_DEFAULT) { btn->setIcon(QIcon(drawDarkColoredPixmap((QIcon::fromTheme(audioIconStr).pixmap(iconSize))))); } else if (mThemeName == UKUI_THEME_DARK || mThemeName == UKUI_THEME_DEFAULT) { btn->setIcon(QIcon(drawLightColoredPixmap((QIcon::fromTheme(audioIconStr).pixmap(iconSize))))); } }); connect(appWidget->appMuteBtn,&QPushButton::clicked,[=]() { bool isMute = false; int volume = -1; isMute = m_pVolumeControl->getSinkInputMuted(description); qDebug() << "appMuteBtn clicked" << "muted" << isMute << description <setSinkInputMuted(description, !isMute); if (isAppMuteBtnPress) { isAppMuteBtnPress = false; } } else { if(kylinVideoMuteSignal) kylinVideoMuteSignal = false; else{ QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "sinkVolumeChanged"); message<displayAppVolumeWidget->findChild(appName); AudioSlider *slider = appWidget->displayAppVolumeWidget->findChild(appName); if (slider == nullptr || appIconName == nullptr) return; int mediaVolume = UkmediaCommon::getInstance().paVolumeToMediaVolume(value); label->setText(QString::number(mediaVolume) + "%"); slider->blockSignals(true); slider->setValue(mediaVolume); slider->blockSignals(false); qDebug() << "sinkInputVolumeChangedSlot" << appName << appIconName << value << appSliderStr; } void UkmediaMainWidget::switchStartupPlayMusic() { if (m_pStartUpSetting->keys().contains("startupMusic")) { bool state = m_pStartUpSetting->get(UKUI_STARTUP_MUSIC_KEY).toBool(); m_pVolumeControl->insertJson(JsonType::JSON_TYPE_USERINFO, AUDIO_STRATUP_SOUNDEFFECT_KEY, state); qDebug() << "the switch of startup sound effect is changed to " << state; } } void UkmediaMainWidget::soundSettingChanged(const QString &key) { qDebug() << "soundSettingChanged" << key; if (key == "dnsNoiseReduction") switchModuleEchoCancel(); else if(key == "loopback") switchModuleLoopBack(); else if (key == "volumeIncrease") resetVolumeSliderRange(); else if (key == "monoAudio") switchMonoAudio(); else if (key == "startupMusic") switchStartupPlayMusic(); } /* * 获å�–应用å��称,从desktop全路径å��下解æž�出应用å��ç§° */ QString UkmediaMainWidget::getAppName(QString desktopfp) { GError** error=nullptr; GKeyFileFlags flags=G_KEY_FILE_NONE; GKeyFile* keyfile=g_key_file_new (); QByteArray fpbyte=desktopfp.toLocal8Bit(); char* filepath=fpbyte.data(); g_key_file_load_from_file(keyfile,filepath,flags,error); char* name=g_key_file_get_locale_string(keyfile,"Desktop Entry","Name", nullptr, nullptr); QString namestr=QString::fromLocal8Bit(name); g_key_file_free(keyfile); return namestr; } /* * 获å�–应用图标,从desktop全路径å��下解æž�出应用图标 */ QString UkmediaMainWidget::getAppIcon(QString desktopfp) { GError** error=nullptr; GKeyFileFlags flags=G_KEY_FILE_NONE; GKeyFile* keyfile=g_key_file_new (); QByteArray fpbyte=desktopfp.toLocal8Bit(); char* filepath=fpbyte.data(); g_key_file_load_from_file(keyfile,filepath,flags,error); char* name=g_key_file_get_locale_string(keyfile,"Desktop Entry","Icon", nullptr, nullptr); QString namestr=QString::fromLocal8Bit(name); g_key_file_free(keyfile); /* If we can't find the app icon * we need to set a default icon for it */ namestr = (namestr == "") ? "application-x-desktop" : namestr; return namestr; } void UkmediaMainWidget::initSubApplicationWidget(QString pAppIcon) { //widget显示应用音é‡� QWidget *subAppwidget = new QWidget(appWidget->displayAppVolumeWidget); appWidget->appVolumeLabel = new QLabel(subAppwidget); appWidget->appVolumeLabel->setParent(subAppwidget); appWidget->appIconBtn = new QPushButton(subAppwidget); appWidget->appMuteBtn = new QPushButton(subAppwidget); appWidget->appMuteBtn->setVisible(false); appWidget->appSlider = new AudioSlider(subAppwidget); appWidget->appSlider->setOrientation(Qt::Horizontal); appWidget->appSlider->setProperty("needTranslucent", true); // Increase translucent effect appWidget->appIconBtn->setFixedSize(32,32); appWidget->appIconBtn->setFlat(true); appWidget->appIconBtn->setFocusPolicy(Qt::NoFocus); QSize icon_size(32,32); appWidget->appIconBtn->setIconSize(icon_size); appWidget->appIconBtn->setIcon(QIcon::fromTheme(pAppIcon)); appWidget->appIconBtn->setAttribute(Qt::WA_TranslucentBackground); QPalette palete = appWidget->appIconBtn->palette(); palete.setColor(QPalette::Highlight,Qt::transparent); palete.setBrush(QPalette::Button,QBrush(QColor(1,1,1,0))); appWidget->appIconBtn->setPalette(palete); QPalette paleteAppIcon = appWidget->appIconBtn->palette(); paleteAppIcon.setColor(QPalette::Highlight,Qt::transparent); paleteAppIcon.setBrush(QPalette::Button,QBrush(QColor(0,0,0,0))); appWidget->appIconBtn->setPalette(paleteAppIcon); appWidget->appSlider->setMaximum(100); appWidget->appSlider->setFixedSize(286,48); appWidget->appIconBtn->adjustSize(); appWidget->appIconBtn->setProperty("useIconHighlightEffect",true); appWidget->appIconBtn->setProperty("iconHighlightEffectMode",true); appWidget->appIconBtn->setStyleSheet("QPushButton{background:transparent;border:0px;" "padding-left:0px;}" "QPushButton:hover {" "background-color: #00000000;" "color: white;}"); //音é‡�滑动æ�¡ QHBoxLayout *appSliderLayout = new QHBoxLayout(subAppwidget); subAppwidget->setFixedSize(412,48); appWidget->appVolumeLabel->setText("0%"); appWidget->appVolumeLabel->setFixedSize(52,48); if (!UkmediaCommon::getInstance().isHWKLanguageEnv(m_languageEnvStr)) { appWidget->appVolumeLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter); } appSliderLayout->addWidget(appWidget->appIconBtn); appSliderLayout->addSpacing(3); appSliderLayout->addWidget(appWidget->appSlider); appSliderLayout->addSpacing(0); appSliderLayout->addWidget(appWidget->appVolumeLabel); appSliderLayout->setSpacing(0); subAppwidget->setLayout(appSliderLayout); appSliderLayout->setContentsMargins(10,0,30,0); appWidget->m_pVlayout->addWidget(subAppwidget); // //设置布局的垂直间è·�以å�Šè®¾ç½®vlayout四周的间è·� appWidget->displayAppVolumeWidget->resize(412,m_pVolumeControl->sinkInputList.count()*50); appWidget->m_pVlayout->setSpacing(2); appWidget->displayAppVolumeWidget->setLayout(appWidget->m_pVlayout); appWidget->m_pVlayout->update(); } /* * 当播放或录制应用退出时删除在应用音é‡�界é�¢ä¸Šè¯¥åº”用的显示 */ void UkmediaMainWidget::removeSubAppWidget(QString m_pAppName) { g_debug ("Removing application stream %s", m_pAppName); /* We could call bar_set_stream_control here, but that would pointlessly * invalidate the channel bar, so just remove it ourselves */ int index = -1; for (int i=0;isinkInputList.count();i++) { if (m_pVolumeControl->sinkInputList.at(i) == m_pAppName) { index = i; m_pVolumeControl->sinkInputList.removeAt(i); break; } } if (index == -1) return; QLayoutItem *item; if ((item = appWidget->m_pVlayout->takeAt(index)) != 0) { QWidget *wid = item->widget(); appWidget->m_pVlayout->removeWidget(wid); wid->setParent(nullptr); delete wid; delete item; } qDebug() << "removeSubAppWidget" << m_pAppName << m_pVolumeControl->sinkInputList.count(); //设置布局的间è·�以å�Šè®¾ç½®vlayout四周的间è·� appWidget->displayAppVolumeWidget->resize(404,m_pVolumeControl->sinkInputList.count()*50); appWidget->m_pVlayout->setSpacing(2); appWidget->m_pVlayout->setContentsMargins(0,0,0,0); appWidget->m_pVlayout->update(); } /* In PulseAudio without ucm, ports will show up with the following names: Headphones - analog-output-headphones Headset mic - analog-input-headset-mic (was: analog-input-microphone-headset) Jack in mic-in mode - analog-input-headphone-mic (was: analog-input-microphone) However, since regular mics also show up as analog-input-microphone, we need to check for certain controls on alsa mixer level too, to know if we deal with a separate mic jack, or a multi-function jack with a mic-in mode (also called "headphone mic"). We check for the following names: Headphone Mic Jack - indicates headphone and mic-in mode share the same jack, i e, not two separate jacks. Hardware cannot distinguish between a headphone and a mic. Headset Mic Phantom Jack - indicates headset jack where hardware can not distinguish between headphones and headsets Headset Mic Jack - indicates headset jack where hardware can distinguish between headphones and headsets. There is no use popping up a dialog in this case, unless we already need to do this for the mic-in mode. From the PA_PROCOTOL_VERSION=34, The device_port structure adds 2 members availability_group and type, with the help of these 2 members, we could consolidate the port checking and port setting for non-ucm and with-ucm cases. */ #define HEADSET_PORT_SET(dst, src) \ do { \ if (!(dst) || (dst)->priority < (src)->priority) \ dst = src; \ } while (0) #define GET_PORT_NAME(x) (x ? g_strdup (x->name) : NULL) headsetPorts * UkmediaMainWidget::getHeadsetPorts (const pa_card_info *c) { headsetPorts *h; guint i; h = g_new0 (headsetPorts, 1); for (i = 0; i < c->n_ports; i++) { pa_card_port_info *p = c->ports[i]; // if (control->priv->server_protocol_version < 34) { if (g_str_equal (p->name, "analog-output-headphones") || g_str_equal (p->name, "[Out] Headphones1")) h->headphones = p; else if (g_str_equal (p->name, "analog-input-headset-mic") || g_str_equal (p->name, "[In] Headset")) h->headsetmic = p; else if (g_str_equal (p->name, "analog-input-headphone-mic") || g_str_equal (p->name, "[In] Headphones2")) h->headphonemic = p; else if (g_str_equal (p->name, "analog-input-internal-mic") || g_str_equal (p->name, "[In] Mic")) h->internalmic = p; else if (g_str_equal (p->name, "analog-output-speaker") || g_str_equal (p->name, "[Out] Speaker")) h->internalspk = p; // } else { #if (PA_PROTOCOL_VERSION >= 34) /* in the first loop, set only headphones */ /* the microphone ports are assigned in the second loop */ if (p->type == PA_DEVICE_PORT_TYPE_HEADPHONES) { if (p->availability_group) HEADSET_PORT_SET (h->headphones, p); } else if (p->type == PA_DEVICE_PORT_TYPE_SPEAKER) { HEADSET_PORT_SET (h->internalspk, p); } else if (p->type == PA_DEVICE_PORT_TYPE_MIC) { if (!p->availability_group) HEADSET_PORT_SET (h->internalmic, p); } #else // g_warning_once ("libgnome-volume-control running against PulseAudio %u, " // "but compiled against older %d, report a bug to your distribution", // control->priv->server_protocol_version, // PA_PROTOCOL_VERSION); #endif // } } return h; } gboolean UkmediaMainWidget::verifyAlsaCard (int cardindex, gboolean *headsetmic, gboolean *headphonemic) { char *ctlstr; snd_hctl_t *hctl; snd_ctl_elem_id_t *id; int err; *headsetmic = FALSE; *headphonemic = FALSE; ctlstr = g_strdup_printf ("hw:%i", cardindex); if ((err = snd_hctl_open (&hctl, ctlstr, 0)) < 0) { g_warning ("snd_hctl_open failed: %s", snd_strerror(err)); g_free (ctlstr); return FALSE; } g_free (ctlstr); if ((err = snd_hctl_load (hctl)) < 0) { // if (hasNo && !hasOther) g_warning ("snd_hctl_load failed: %s", snd_strerror(err)); snd_hctl_close (hctl); return FALSE; } snd_ctl_elem_id_alloca (&id); snd_ctl_elem_id_clear (id); snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD); snd_ctl_elem_id_set_name (id, "Headphone Mic Jack"); if (snd_hctl_find_elem (hctl, id)) *headphonemic = TRUE; snd_ctl_elem_id_clear (id); snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD); snd_ctl_elem_id_set_name (id, "Headset Mic Phantom Jack"); if (snd_hctl_find_elem (hctl, id)) *headsetmic = TRUE; if (*headphonemic) { snd_ctl_elem_id_clear (id); snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD); snd_ctl_elem_id_set_name (id, "Headset Mic Jack"); if (snd_hctl_find_elem (hctl, id)) *headsetmic = TRUE; } snd_hctl_close (hctl); return *headsetmic || *headphonemic; } void UkmediaMainWidget::checkAudioDeviceSelectionNeeded(const pa_card_info *info) { headsetPorts *h; gboolean start_dialog, stop_dialog; qDebug() << "check_audio_device_selection_needed" <name; start_dialog = FALSE; stop_dialog = FALSE; h = getHeadsetPorts(info); if (!h->headphones || (!h->headsetmic && !h->headphonemic)) { qDebug() << "no headset jack" ; /* Not a headset jack */ goto out; } else { qDebug() << "headset jack" << h->headphonemic << h->headphones; } if (headsetCard != (int) info->index) { int cardindex; gboolean hsmic = TRUE; gboolean hpmic = TRUE; const char *s; s = pa_proplist_gets (info->proplist, "alsa.card"); if (!s) { goto out; } cardindex = strtol(s, NULL, 10); if (cardindex == 0 && strcmp(s, "0") != 0) { goto out; } if (!verifyAlsaCard(cardindex, &hsmic, &hpmic)) { goto out; } headsetCard = info->index; hasHeadsetmic = hsmic && h->headsetmic; hasHeadphonemic = hpmic && h->headphonemic; } else { start_dialog = (h->headphones->available != PA_PORT_AVAILABLE_NO) && !headsetPluggedIn; stop_dialog = (h->headphones->available == PA_PORT_AVAILABLE_NO) && headsetPluggedIn; } headsetPluggedIn = h->headphones->available != PA_PORT_AVAILABLE_NO; m_pHeadphonesName = GET_PORT_NAME(h->headphones); m_pHeadsetmicName = GET_PORT_NAME(h->headsetmic); m_pHeadphonemicName = GET_PORT_NAME(h->headphonemic); m_pInternalspkName = GET_PORT_NAME(h->internalspk); m_pInternalmicName = GET_PORT_NAME(h->internalmic); if (firstLoad) { firstLoad = false; } else { if (headsetPluggedIn) { headsetWidget->showWindow(); } else { if (headsetWidget->isShow) { headsetWidget->hide(); headsetWidget->isShow = false; } } } qDebug() << "check_audio_device_selection_needed" <defaultSinkName); qDebug() << "ctf ----- onPrepareForSleep" << sleep << m_pVolumeControl->defaultSinkName; if(sleep) { cmd.append(" 1"); system(cmd.toLatin1().data()); // pa_context_suspend_sink_by_name(m_pVolumeControl->getContext(),m_pVolumeControl->defaultSinkName,1,nullptr,nullptr); uninhibit(); } else { cmd.append(" 0"); system(cmd.toLatin1().data()); // pa_context_suspend_sink_by_name(m_pVolumeControl->getContext(),m_pVolumeControl->defaultSinkName,0,nullptr,nullptr); inhibit(); } } /* 输出设备æ��示弹窗 */ void UkmediaMainWidget::deviceChangedShowSlot(QString dev_name) { if (SystemVersion::SYSTEM_VERSION_OKNILE == m_version \ || SystemVersion::SYSTEM_VERSION_KYLIN_2501_V11 == m_version) { return; } osdWidget->setIcon(dev_name); osdWidget->dialogShow(); } /* * 更新设备端å�£ */ void UkmediaMainWidget::updateDevicePort() { QMap>::iterator it; QMap::iterator at; QMap temp; currentInputPortLabelMap.clear(); currentOutputPortLabelMap.clear(); if (firstEntry) { for (it = m_pVolumeControl->outputPortMap.begin();it!=m_pVolumeControl->outputPortMap.end();) { temp = it.value(); for (at=temp.begin();at!=temp.end();) { qDebug() << "updateDevicePort" << firstEntry << it.key() << at.value() <cardMap); addOutputListWidgetItem(at.key(),at.value(),cardName); ++at; } ++it; } for (it = m_pVolumeControl->inputPortMap.begin();it!=m_pVolumeControl->inputPortMap.end();) { temp = it.value(); for (at=temp.begin();at!=temp.end();) { qDebug() << "updateDevicePort" << firstEntry << it.key() << at.value(); QString cardName = findCardName(it.key(),m_pVolumeControl->cardMap); addInputListWidgetItem(at.value(),cardName); ++at; } ++it; } } else { //记录上一次output label for (int i=0;im_pOutputListWidget->count();i++) { QMap::iterator at; QListWidgetItem *item = systemWidget->m_pOutputListWidget->item(i); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(item); int index; for (at=m_pVolumeControl->cardMap.begin();at!=m_pVolumeControl->cardMap.end();) { if (wid->deviceLabel->text() == at.value()) { index = at.key(); break; } ++at; } currentOutputPortLabelMap.insert(index,wid->portLabel->fullText); } for (int i=0;im_pInputListWidget->count();i++) { QListWidgetItem *item = systemWidget->m_pInputListWidget->item(i); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(item); int index; int count; QMap::iterator at; for (at=m_pVolumeControl->cardMap.begin();at!=m_pVolumeControl->cardMap.end();) { if (wid->deviceLabel->text() == at.value()) { index = at.key(); break; } ++at; ++count; } currentInputPortLabelMap.insert(index,wid->portLabel->fullText); } systemWidget->m_pInputListWidget->blockSignals(true); deleteNotAvailableOutputPort(); addAvailableOutputPort(); initOutputListWidgetItem(); deleteNotAvailableInputPort(); addAvailableInputPort(); systemWidget->m_pInputListWidget->blockSignals(false); Q_EMIT updateDevSignal(); } if (systemWidget->m_pOutputListWidget->count() > 0 /*|| m_pInputWidget->m_pInputListWidget->count()*/) { //需求31268å¾…2501å†�å�ˆå…¥ #if 1 firstEntry = false; systemWidget->m_pSystemVolumeSlider->setEnabled(true); appWidget->systemVolumeSlider->setEnabled(true); systemWidget->m_pSystemVolumeBtn->setEnabled(true); appWidget->systemVolumeBtn->setEnabled(true); } else { systemWidget->m_pSystemVolumeSlider->setEnabled(false); appWidget->systemVolumeSlider->setEnabled(false); systemWidget->m_pSystemVolumeBtn->setEnabled(false); appWidget->systemVolumeBtn->setEnabled(false); } #elif 0 firstEntry = false; } #endif } void UkmediaMainWidget::updateListWidgetItemSlot() { qDebug() << "updateListWidgetItemSlot---------"; initOutputListWidgetItem(); initInputListWidgetItem(); themeChangeIcons(); switchModuleEchoCancel(); // switchModuleLoopBack(); } /* * output list widget选项改å�˜ï¼Œè®¾ç½®å¯¹åº”的输出设备 */ void UkmediaMainWidget::outputListWidgetCurrentRowChangedSlot(int row) { //当所有å�¯ç”¨çš„输出设备全部移除,å�°å¼�机æ‰�会出现该情况 if (row == -1) return; QListWidgetItem *item = systemWidget->m_pOutputListWidget->item(row); if (item == nullptr) { qDebug() <<"output current item is null"; } UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(item); QListWidgetItem *inputCurrrentItem = systemWidget->m_pInputListWidget->currentItem(); UkuiListWidgetItem *inputWid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(inputCurrrentItem); bool isContainBlue = inputDeviceContainBluetooth(); setDeviceButtonState(row); //当输出设备从è“�牙切æ�¢åˆ°å…¶ä»–设备时,需将è“�牙声å�¡çš„é…�置文件切æ�¢ä¸ºa2dp-sink if (isContainBlue && (strstr(m_pVolumeControl->defaultSourceName,"headset_head_unit") || strstr(m_pVolumeControl->defaultSourceName,"bt_sco_sink"))) { QString cardName = blueCardName(); setCardProfile(cardName,"a2dp_sink"); } QStringList comboboxPortNameList = wid->portLabel->text().split("("); QStringList inputComboboxPortNameList; if (inputWid) { inputComboboxPortNameList = inputWid->portLabel->text().split("("); } QMap>::iterator outputProfileMap; QMap>::iterator inputProfileMap; QMap tempMap; QMap::iterator at; QString endOutputProfile = ""; QString endInputProfile = ""; int currentCardIndex = findCardIndex(wid->deviceLabel->text(),m_pVolumeControl->cardMap); int count,i; for (outputProfileMap=m_pVolumeControl->profileNameMap.begin();outputProfileMap!= m_pVolumeControl->profileNameMap.end();) { if (currentCardIndex == outputProfileMap.key()) { tempMap = outputProfileMap.value(); for (at=tempMap.begin(),i=0;at!= tempMap.end();++i) { if (at.key() == comboboxPortNameList.at(0)) { count = i; endOutputProfile = at.value(); } ++at; } } ++outputProfileMap; } if (inputCurrrentItem != nullptr) { QMap ::iterator it; QMap temp; int index = findCardIndex(inputWid->deviceLabel->text(),m_pVolumeControl->cardMap); for (inputProfileMap=m_pVolumeControl->inputPortProfileNameMap.begin(),count=0;inputProfileMap!= m_pVolumeControl->inputPortProfileNameMap.end();count++) { if (inputProfileMap.key() == index) { temp = inputProfileMap.value(); for (it=temp.begin();it!=temp.end();) { if (it.key() == inputComboboxPortNameList.at(0)) { endInputProfile = it.value(); } ++it; } } ++inputProfileMap; } } qDebug() << "outputListWidgetCurrentRowChangedSlot" << row << wid->deviceLabel->text() << endOutputProfile <deviceLabel->text() == inputWid->deviceLabel->text()) || \ wid->deviceLabel->text() == "alsa_card.platform-sound_DA_combine_v5" && inputWid->deviceLabel->text() == "3a.algo") { QString setProfile = endOutputProfile; if (!endOutputProfile.contains("input:analog-stereo") || !endOutputProfile.contains("HiFi")) { setProfile += "+"; setProfile +=endInputProfile; } if (endOutputProfile.contains("a2dp-sink") && endInputProfile.contains("headset-head-unit")) { setProfile = endOutputProfile; } setCardProfile(wid->deviceLabel->text(),setProfile); setDefaultOutputPortDevice(wid->deviceLabel->text(),wid->portLabel->fullText); } //如果选择的输入输出设备ä¸�是å�Œä¸€å�—声å�¡ï¼Œéœ€è¦�设置一个优先级高的é…�置文件 else { int index = findCardIndex(wid->deviceLabel->text(),m_pVolumeControl->cardMap); QMap >::iterator it; QString profileName; for (it=m_pVolumeControl->cardProfileMap.begin();it!=m_pVolumeControl->cardProfileMap.end();) { if (it.key() == index) { if (strstr(endOutputProfile.toLatin1().data(),"headset_head_unit")) { endOutputProfile = "a2dp_sink"; } profileName = findHighPriorityProfile(index,endOutputProfile); } ++it; } QString setProfile = profileName; setCardProfile(wid->deviceLabel->text(),setProfile); setDefaultOutputPortDevice(wid->deviceLabel->text(),wid->portLabel->fullText); } qDebug() << "active output port:" << wid->portLabel->fullText << wid->deviceLabel->text(); } /* * input list widget选项改å�˜ï¼Œè®¾ç½®å¯¹åº”的输入设备 */ void UkmediaMainWidget::inputListWidgetCurrentRowChangedSlot(int row) { if (row == -1) { return; } QListWidgetItem *currentOutputItem = systemWidget->m_pOutputListWidget->currentItem(); UkuiListWidgetItem *currentOutputItemWidget = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(currentOutputItem); QString currentOutputCardName = currentOutputItemWidget->deviceLabel->text(); QString currentOutputPortLabel = currentOutputItemWidget->portLabel->text().split("(").at(0); QListWidgetItem *destInputItem = systemWidget->m_pInputListWidget->item(row); UkuiListWidgetItem *destInputItemWidget = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(destInputItem); QString destInputCardName = destInputItemWidget->deviceLabel->text(); QString destInputPortLabel = destInputItemWidget->portLabel->text().split("(").at(0); qDebug() << __func__ << row << "destPortLabel" << destInputPortLabel << "destCardName" << destInputCardName << "defaultSourceName" << m_pVolumeControl->defaultSourceName; if (inputDeviceContainBluetooth()) { if (strstr(m_pVolumeControl->defaultSinkName, HEADSET_HEAD_UNIT) || strstr(m_pVolumeControl->defaultSourceName, HUAWEI_BTO_SOURCE)) { qDebug() << "To switch Input to a non-Bluetooth device, need to change Bluetooth card profile to 'a2dp'"; setCardProfile(blueCardName(), "a2dp_sink"); } } isCheckBluetoothInput = destInputCardName.contains("bluez_card") ? true : false; QString endInputProfile = ""; QString endOutputProfile = ""; QMap tempMap; QMap::iterator at; QMap>::iterator inputProfileMap; int destInputCardIndex = findCardIndex(destInputCardName, m_pVolumeControl->cardMap); for (inputProfileMap = m_pVolumeControl->inputPortProfileNameMap.begin(); inputProfileMap != m_pVolumeControl->inputPortProfileNameMap.end();) { if (inputProfileMap.key() == destInputCardIndex) { tempMap = inputProfileMap.value(); for (at = tempMap.begin();at != tempMap.end();) { if (at.key() == destInputPortLabel) { endInputProfile = at.value(); } ++at; } } ++inputProfileMap; } if (nullptr != currentOutputItem) { QMap tempMap; QMap ::iterator it; QMap>::iterator outputProfileMap; int OutputCardIndex = findCardIndex(currentOutputItemWidget->deviceLabel->text(), m_pVolumeControl->cardMap); for (outputProfileMap = m_pVolumeControl->profileNameMap.begin(); outputProfileMap != m_pVolumeControl->profileNameMap.end();) { if (outputProfileMap.key() == OutputCardIndex) { tempMap = outputProfileMap.value(); for(it = tempMap.begin(); it != tempMap.end();){ if(it.key() == currentOutputPortLabel) { endOutputProfile = it.value(); } ++it; } } ++outputProfileMap; } } //如果选择的输入输出设备为å�Œä¸€ä¸ªå£°å�¡ï¼Œåˆ™è¿½åŠ æŒ‡å®šè¾“å…¥è¾“å‡ºç«¯å�£å±žäºŽçš„é…�置文件 QString setProfile = ""; if (currentOutputItem != nullptr && destInputCardName == currentOutputCardName) { //有些声å�¡çš„é…�置文件默认å�ªæœ‰è¾“å…¥/输出设备或者é…�置文件包å�«äº†è¾“出输入设备,因此å�ªéœ€è¦�å�–其中一个é…�置文件å�³å�¯ if (endOutputProfile == "a2dp-sink" || endInputProfile == "headset_head_unit" || endOutputProfile == "HiFi") { setProfile += endInputProfile; } else { setProfile += endOutputProfile; setProfile += "+"; setProfile += endInputProfile; } } //如果选择的输入输出设备ä¸�是å�Œä¸€å�—声å�¡ï¼Œéœ€è¦�设置一个优先级高的é…�置文件 else { QMap >::iterator it; for(it = m_pVolumeControl->cardProfileMap.begin(); it != m_pVolumeControl->cardProfileMap.end();) { if (it.key() == destInputCardIndex) { QStringList list= it.value(); setProfile = findHighPriorityProfile(destInputCardIndex, endInputProfile); if (list.contains(endOutputProfile)) { } } ++it; } } setCardProfile(destInputCardName, setProfile); setDefaultInputPortDevice(destInputCardIndex, destInputItemWidget->portLabel->fullText); } void UkmediaMainWidget::updateAppVolume(QString str, int value, bool state) { qDebug() << __func__ << str << value <findChild(str); if (slider == nullptr) { found = false; } if (found) { kylinVideoVolumeSignal = true; if(slider->value() == value) { kylinVideoVolumeSignal = false; } slider->setValue(value); } else { value = -1; } qDebug() << "found app slider, set value ----" << value; QPushButton *btn = appWidget->findChild(str); if (btn == nullptr) { found = false; } else { qDebug() << "founded app mute button ------------" << str << state; isAppMuteBtnPress = true; sinkInputMute = state; kylinVideoMuteSignal = true; btn->setChecked(true); btn->click(); } QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "sinkVolumeChanged"); message<m_pOutputListWidget->count();i++) { QListWidgetItem *item = systemWidget->m_pOutputListWidget->item(i); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(item); if (i == row) { if (!wid->deviceButton->isChecked()) { wid->deviceButton->setChecked(true); } continue; } wid->deviceButton->setChecked(false); } } /* * 添加output port到output list widget */ void UkmediaMainWidget::addOutputListWidgetItem(QString portName, QString portLabel, QString cardName) { UkuiListWidgetItem *itemW = new UkuiListWidgetItem(this); int i = systemWidget->m_pOutputListWidget->count(); QListWidgetItem * item = new QListWidgetItem(systemWidget->m_pOutputListWidget); item->setSizeHint(QSize(200,48)); itemW->setButtonIcon(portName); itemW->setLabelText(portLabel,cardName); systemWidget->m_pOutputListWidget->blockSignals(true); systemWidget->m_pOutputListWidget->setItemWidget(item, itemW); systemWidget->m_pOutputListWidget->insertItem(i,item); systemWidget->m_pOutputListWidget->blockSignals(false); connect(itemW->deviceButton, &QPushButton::clicked, this, [=](){ int idx = indexOfOutputPortInOutputListWidget(itemW->portLabel->fullText); systemWidget->m_pOutputListWidget->setCurrentRow(idx); outputListWidgetCurrentRowChangedSlot(idx); outputListWidgetRow = idx; }); } /* * 添加input port到input list widget */ void UkmediaMainWidget::addInputListWidgetItem(QString portName, QString cardName) { UkuiListWidgetItem *itemW = new UkuiListWidgetItem(this); int i = systemWidget->m_pInputListWidget->count(); QListWidgetItem * item = new QListWidgetItem(systemWidget->m_pInputListWidget); item->setSizeHint(QSize(200,48)); //QSize(120, 40) spacing: 12px; systemWidget->m_pInputListWidget->blockSignals(true); systemWidget->m_pInputListWidget->setItemWidget(item, itemW); systemWidget->m_pInputListWidget->blockSignals(false); itemW->setLabelText(portName,cardName); itemW->setButtonIcon(portName); systemWidget->m_pInputListWidget->blockSignals(true); systemWidget->m_pInputListWidget->insertItem(i,item); systemWidget->m_pInputListWidget->blockSignals(false); } int UkmediaMainWidget::indexOfOutputPortInOutputListWidget(QString portName) { for (int row=0;rowm_pOutputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pOutputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(item); if (wid->portLabel->fullText == portName) { return row; } } return -1; } int UkmediaMainWidget::indexOfInputPortInInputListWidget(QString portName) { for (int row=0;rowm_pInputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pInputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(item); if (wid->portLabel->fullText == portName) { return row; } } return -1; } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该在output list widget上删除 */ bool UkmediaMainWidget::outputPortIsNeedDelete(int index, QString name) { QMap>::iterator it; QMap::iterator at; QMap portMap; // qDebug() << "outputPortIsNeedDelete" << index << name; for(it = m_pVolumeControl->outputPortMap.begin();it!=m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (at=portMap.begin();at!=portMap.end();) { if (name == at.value()) { return false; } ++at; } } ++it; } return true; } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该添加到output list widget上 */ bool UkmediaMainWidget::outputPortIsNeedAdd(int index, QString name) { QMap::iterator it; for(it=currentOutputPortLabelMap.begin();it!=currentOutputPortLabelMap.end();) { if ( index == it.key() && name == it.value()) { return false; } ++it; } return true; } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该在input list widget上删除 */ bool UkmediaMainWidget::inputPortIsNeedDelete(int index, QString name) { QMap>::iterator it; QMap::iterator at; QMap portMap; for(it = m_pVolumeControl->inputPortMap.begin();it!=m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (at=portMap.begin();at!=portMap.end();) { if (name == at.value()) { return false; } ++at; } } ++it; } return true; } /* * 当å‰�的输出端å�£æ˜¯å�¦åº”该添加到input list widget上 */ bool UkmediaMainWidget::inputPortIsNeedAdd(int index, QString name) { QMap::iterator it; for(it=currentInputPortLabelMap.begin();it!=currentInputPortLabelMap.end();) { if ( index == it.key() && name == it.value()) { return false; } ++it; } return true; } /* * 移除output list widget上ä¸�å�¯ç”¨çš„输出端å�£ */ void UkmediaMainWidget::deleteNotAvailableOutputPort() { qDebug() << "deleteNotAvailableOutputPort"; QMap::iterator it; for (it=currentOutputPortLabelMap.begin();it!=currentOutputPortLabelMap.end();) { if (outputPortIsNeedDelete(it.key(),it.value())) { qDebug() << "outputPortIsNeedDelete" << it.key() << it.value(); int index = indexOfOutputPortInOutputListWidget(it.value()); if (index == -1) { return; } systemWidget->m_pOutputListWidget->blockSignals(true); QListWidgetItem *item = systemWidget->m_pOutputListWidget->takeItem(index); systemWidget->m_pOutputListWidget->removeItemWidget(item); systemWidget->m_pOutputListWidget->blockSignals(false); it = currentOutputPortLabelMap.erase(it); continue; } ++it; } } /* * 添加å�¯ç”¨çš„输出端å�£åˆ°output list widget */ void UkmediaMainWidget::addAvailableOutputPort() { QMap>::iterator at; QMap::iterator it; QMap tempMap; //增加端å�£ for(at=m_pVolumeControl->outputPortMap.begin();at!=m_pVolumeControl->outputPortMap.end();) { tempMap = at.value(); for (it=tempMap.begin();it!=tempMap.end();) { if (outputPortIsNeedAdd(at.key(),it.value())) { qDebug() << "add output list widget" << at.key()<< it.value() << it.key(); addOutputListWidgetItem(it.key(),it.value(),findCardName(at.key(),m_pVolumeControl->cardMap)); currentOutputPortLabelMap.insert(at.key(),it.value()); } ++it; } ++at; } } /* * 在input list widget删除ä¸�å�¯ç”¨çš„端å�£ */ void UkmediaMainWidget::deleteNotAvailableInputPort() { //删除ä¸�å�¯ç”¨çš„输入端å�£ QMap::iterator it; for (it=currentInputPortLabelMap.begin();it!=currentInputPortLabelMap.end();) { //没找到,需è¦�删除 if (inputPortIsNeedDelete(it.key(),it.value())) { int index = indexOfInputPortInInputListWidget(it.value()); if (index == -1) return; systemWidget->m_pInputListWidget->blockSignals(true); QListWidgetItem *item = systemWidget->m_pInputListWidget->takeItem(index); systemWidget->m_pInputListWidget->removeItemWidget(item); systemWidget->m_pInputListWidget->blockSignals(false); it = currentInputPortLabelMap.erase(it); continue; } ++it; } // m_pVolumeControl->removeInputProfile(); } /* * 添加å�¯ç”¨çš„输入端å�£åˆ°input list widget */ void UkmediaMainWidget::addAvailableInputPort() { QMap>::iterator at; QMap::iterator it; QMap tempMap; int i = systemWidget->m_pInputListWidget->count(); //增加端å�£ for (at=m_pVolumeControl->inputPortMap.begin();at!=m_pVolumeControl->inputPortMap.end();) { tempMap = at.value(); for (it=tempMap.begin();it!=tempMap.end();) { //需添加到list widget if (inputPortIsNeedAdd(at.key(),it.value())) { UkuiListWidgetItem *itemW = new UkuiListWidgetItem(this); QListWidgetItem * item = new QListWidgetItem(systemWidget->m_pInputListWidget); item->setSizeHint(QSize(200,48)); //QSize(120, 40) spacing: 12px; systemWidget->m_pInputListWidget->blockSignals(true); systemWidget->m_pInputListWidget->setItemWidget(item, itemW); systemWidget->m_pInputListWidget->blockSignals(false); itemW->setLabelText(it.value(),findCardName(at.key(),m_pVolumeControl->cardMap)); currentInputPortLabelMap.insert(at.key(),it.value()); systemWidget->m_pInputListWidget->blockSignals(true); systemWidget->m_pInputListWidget->insertItem(i,item); systemWidget->m_pInputListWidget->blockSignals(false); } ++it; } ++at; } } //查找指定声å�¡å��的索引 int UkmediaMainWidget::findCardIndex(QString cardName, QMap cardMap) { QMap::iterator it; for(it=cardMap.begin();it!=cardMap.end();) { if (it.value() == cardName) { return it.key(); } ++it; } return -1; } /* * æ ¹æ�®å£°å�¡ç´¢å¼•查找声å�¡å�� */ QString UkmediaMainWidget::findCardName(int index,QMap cardMap) { QMap::iterator it; for(it=cardMap.begin();it!=cardMap.end();) { if (it.key() == index) { return it.value(); } ++it; } return ""; } QString UkmediaMainWidget::findHighPriorityProfile(int index, QString profile) { int priority = 0; QString profileName = ""; QMap profileNameMap; QMap::iterator tempMap; QMap>::iterator it; QString profileStr = findCardActiveProfile(index); QStringList list = profileStr.split("+"); QString includeProfile = ""; if (list.count() > 1) { if (profile.contains("output")) includeProfile = list.at(1); else if (profile.contains("input")) includeProfile = list.at(0); } else includeProfile = list.at(0); for (it = m_pVolumeControl->cardProfilePriorityMap.begin(); it != m_pVolumeControl->cardProfilePriorityMap.end(); ++it) { if (index == it.key()) { profileNameMap = it.value(); for (tempMap = profileNameMap.begin(); tempMap != profileNameMap.end(); ++tempMap) { if (!includeProfile.isEmpty() && tempMap.key().contains(includeProfile) && tempMap.key().contains(profile) && !tempMap.key().contains(includeProfile + "-") && !tempMap.key().contains(profile + "-")) { priority = tempMap.value(); profileName = tempMap.key(); qDebug() << "Status1: Find profileName" << profileName << "priority" << priority; } else if (tempMap.key().contains(profile) && tempMap.value() > priority) { priority = tempMap.value(); profileName = tempMap.key(); qDebug() << "Status2: Find profileName" << profileName << "priority" << priority; } } } } qInfo() << __func__ << "Select profile is" << profileName << "index" << index << "includeProfile" << includeProfile; return profileName; } /* * Find the corresponding sink according to the port name */ QString UkmediaMainWidget::findPortSink(int index,QString portName) { QMap>::iterator it; QMap portNameMap; QMap::iterator tempMap; QString sinkStr = ""; for (it=m_pVolumeControl->sinkPortMap.begin();it!=m_pVolumeControl->sinkPortMap.end();) { if(it.key() == index) { portNameMap = it.value(); for (tempMap=portNameMap.begin();tempMap!=portNameMap.end();) { if (tempMap.value() == portName) { sinkStr = tempMap.key(); // qDebug() <<"find port sink" << tempMap.value() << portName << tempMap.key() < portNameMap; QMap::iterator tempMap; QMap>::iterator it; for (it = m_pVolumeControl->sourcePortMap.begin(); it != m_pVolumeControl->sourcePortMap.end(); ++it) { if(it.key() == index) { portNameMap = it.value(); for (tempMap = portNameMap.begin(); tempMap != portNameMap.end(); ++tempMap) { if (tempMap.value() == portName) { sourceName = tempMap.key(); break; } } } } if (sourceName.isEmpty()) qDebug() << __func__ << "Can not find Source by index" << index << portName; return sourceName; } /* 查找å��称为PortLbael çš„portName */ QString UkmediaMainWidget::findOutputPortName(int index,QString portLabel) { QMap>::iterator it; QMapportMap; QMap::iterator tempMap; QString portName = ""; for (it = m_pVolumeControl->outputPortMap.begin();it != m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.value() == portLabel) { portName = tempMap.key(); break; } ++tempMap; } } ++it; } return portName; } /* 查找å��称为PortName çš„portLabel */ QString UkmediaMainWidget::findOutputPortLabel(int index,QString portName) { QMap>::iterator it; QMapportMap; QMap::iterator tempMap; QString portLabel = ""; for (it = m_pVolumeControl->outputPortMap.begin();it != m_pVolumeControl->outputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { // qDebug() <<"findOutputPortLabel" <>::iterator it; QMapportMap; QMap::iterator tempMap; QString portName = ""; for (it = m_pVolumeControl->inputPortMap.begin();it != m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.value() == portLabel) { portName = tempMap.key(); break; } ++tempMap; } } ++it; } return portName; } /* 查找å��称为PortName çš„portLabel */ QString UkmediaMainWidget::findInputPortLabel(int index,QString portName) { QMap>::iterator it; QMapportMap; QMap::iterator tempMap; QString portLabel = ""; for (it = m_pVolumeControl->inputPortMap.begin();it != m_pVolumeControl->inputPortMap.end();) { if (it.key() == index) { portMap = it.value(); for (tempMap = portMap.begin();tempMap!=portMap.end();) { if (tempMap.key() == portName) { portLabel = tempMap.value(); break; } ++tempMap; } } ++it; } return portLabel; } /* * 设置声å�¡çš„é…�置文件 */ void UkmediaMainWidget::setCardProfile(QString name, QString profile) { int index = findCardIndex(name, m_pVolumeControl->cardMap); m_pVolumeControl->setCardProfile(index, profile.toLatin1().data()); qDebug() << "set profile" << name << profile << index ; } /* * 设置默认的输出设备端å�£ */ void UkmediaMainWidget::setDefaultOutputPortDevice(QString devName, QString portName) { int cardIndex = findCardIndex(devName,m_pVolumeControl->cardMap); QString portStr = findOutputPortName(cardIndex,portName); qDebug() << "setDefaultOutputPortDevice" << cardIndex << portStr; QTimer *timer = new QTimer; timer->start(300); connect(timer,&QTimer::timeout,[=](){ QString sinkStr = findPortSink(cardIndex,portStr); qDebug() << "setDefaultOutputPortDevice" << sinkStr; /*默认的stream 和设置的stream相å�Œ 需è¦�更新端å�£*/ if (strcmp(sinkStr.toLatin1().data(),m_pVolumeControl->defaultSinkName) == 0) { m_pVolumeControl->setSinkPort(sinkStr.toLatin1().data(),portStr.toLatin1().data()); } else { m_pVolumeControl->setDefaultSink(sinkStr.toLatin1().data()); m_pVolumeControl->setSinkPort(sinkStr.toLatin1().data(),portStr.toLatin1().data()); } delete timer; }); } /* * 设置默认的输入设备端å�£ */ void UkmediaMainWidget::setDefaultInputPortDevice(int cardIndex, QString portLabel) { QString portName = findInputPortName(cardIndex, portLabel); QTimer *timer = new QTimer; timer->start(100); connect(timer, &QTimer::timeout, [=]() { QString sourceName = findPortSource(cardIndex, portName); /* 默认stream相å�Œï¼Œä»…更新端å�£å�³å�¯ */ if (UKMedia_Equal(sourceName.toLatin1().data(), m_pVolumeControl->defaultSourceName)) { m_pVolumeControl->setSourcePort(sourceName.toLatin1().data(), portName.toLatin1().data()); } /* 默认streamä¸�å�Œï¼Œå…ˆè®¾ç½®streamå†�设置端å�£ */ else { m_pVolumeControl->setDefaultSource(sourceName.toLatin1().data()); m_pVolumeControl->setSourcePort(sourceName.toLatin1().data(), portName.toLatin1().data()); } qDebug() << __func__ << "card" << cardIndex << "source" << sourceName << "port" << portName; delete timer; }); } /* * 查找指定索引声å�¡çš„active profile */ QString UkmediaMainWidget::findCardActiveProfile(int index) { QString activeProfileName = ""; QMap::iterator it; for (it=m_pVolumeControl->cardActiveProfileMap.begin();it!=m_pVolumeControl->cardActiveProfileMap.end();) { if (it.key() == index) { activeProfileName = it.value(); break; } ++it; } return activeProfileName; } void UkmediaMainWidget::findOutputListWidgetItem(QString cardName,QString portLabel) { for (int row=0;rowm_pOutputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pOutputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pOutputListWidget->itemWidget(item); qDebug() << "findOutputListWidgetItem" << "cardName:" << cardName << wid->deviceLabel->text() << "portName:" << portLabel << wid->portLabel->fullText; if (wid->deviceLabel->text() == cardName && portLabel == wid->portLabel->fullText) { systemWidget->m_pOutputListWidget->blockSignals(true); systemWidget->m_pOutputListWidget->setCurrentRow(row); setDeviceButtonState(row); systemWidget->m_pOutputListWidget->blockSignals(false); wid->deviceButton->repaint(); break; } else if (wid->deviceLabel->text() == cardName && (wid->portLabel->fullText.compare("HUAWEI Histen") == 0)) { systemWidget->m_pOutputListWidget->blockSignals(true); systemWidget->m_pOutputListWidget->setCurrentRow(row); setDeviceButtonState(row); systemWidget->m_pOutputListWidget->blockSignals(false); wid->deviceButton->repaint(); break; } } outputListWidgetRow = systemWidget->m_pOutputListWidget->currentRow(); } void UkmediaMainWidget::findInputListWidgetItem(QString cardName,QString portLabel) { for (int row=0;rowm_pInputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pInputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(item); qDebug() << "findInputListWidgetItem" << "card name:" << cardName << "deviceLabel:" << wid->deviceLabel->text() << "portname" << portLabel << "portLabel:" << wid->portLabel->fullText; if (wid->deviceLabel->text() == cardName && wid->portLabel->fullText == portLabel) { systemWidget->m_pInputListWidget->blockSignals(true); systemWidget->m_pInputListWidget->setCurrentRow(row); systemWidget->m_pInputListWidget->blockSignals(false); if (wid->deviceLabel->text().contains("bluez_card")) { isCheckBluetoothInput = true; } qDebug() << "set input list widget" << row; break; } } } /* * 输入设备中是å�¦åŒ…å�«è“�牙设备 */ bool UkmediaMainWidget::inputDeviceContainBluetooth() { for (int row=0;rowm_pInputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pInputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(item); if (wid->deviceLabel->text().contains("bluez")) { return true; } } return false; } /* * 移除xml文件中ä¸�能识别的字符 */ QString UkmediaMainWidget::stringRemoveUnrecignizedChar(QString str) { str.remove(" "); str.remove("/"); str.remove("("); str.remove(")"); str.remove("["); str.remove("]"); return str; } QString UkmediaMainWidget::blueCardName() { for (int row=0;rowm_pInputListWidget->count();row++) { QListWidgetItem *item = systemWidget->m_pInputListWidget->item(row); UkuiListWidgetItem *wid = (UkuiListWidgetItem *)systemWidget->m_pInputListWidget->itemWidget(item); if (wid->deviceLabel->text().contains("bluez")) { return wid->deviceLabel->text(); } } return ""; } /** * @brief MainWindow::keyPressEvent 按esc键关闭主界é�¢ * @param event */ void UkmediaMainWidget::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Escape) { hideWindow(); } return QWidget::keyPressEvent(event); } /* *在path路径下找包å�«str字段的文件å��(暂时用æ�¥å¯»æ‰¾wine微信) */ QString UkmediaMainWidget::findFile(const QString path,QString str) { QDir dir(path); QString filename = ""; if(!dir.exists()) { return ""; } //获å�–filePath下所有文件夹和文件 dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);//文件夹|文件|ä¸�包å�«./å’Œ../ //排åº�文件夹优先 dir.setSorting(QDir::DirsFirst); QStringList filer; QStringList list= dir.entryList(filer, QDir::Files | QDir::NoDotAndDotDot); if(list.size() == 0) { return ""; } for(int i = 0; i < list.size(); i++) { QFileInfo fileInfo(list.at(i)); if(fileInfo.isDir())//判断是å�¦ä¸ºæ–‡ä»¶å¤¹ { findFile(fileInfo.filePath(),str);//递归开始 } else { if(fileInfo.fileName().contains(str) && !fileInfo.fileName().contains("ä¼�业微信") && !fileInfo.fileName().contains("å�¸è½½å¾®ä¿¡"))//设定å�Žç¼€ { filename = fileInfo.fileName(); qDebug() << "在/usr/share/applications/找到文件" << filename; break; } } } return filename; } void UkmediaMainWidget::inhibit() { if (m_inhibitFileDescriptor.isValid()) { return; } QDBusMessage message = QDBusMessage::createMethodCall("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QStringLiteral("Inhibit")); message.setArguments(QVariantList({QStringLiteral("sleep"), "Screen Locker", "Ensuring that the screen gets locked before going to sleep", QStringLiteral("delay")})); QDBusPendingReply reply = QDBusConnection::systemBus().call(message); if (!reply.isValid()) { return; } reply.value().swap(m_inhibitFileDescriptor); } void UkmediaMainWidget::uninhibit() { if (!m_inhibitFileDescriptor.isValid()) { return; } m_inhibitFileDescriptor = QDBusUnixFileDescriptor(); } void UkmediaMainWidget::switchModuleEchoCancel() { if (UkmediaCommon::getInstance().isHuaweiPlatform()) return; bool switchState = false; if (m_pSoundSettings->keys().contains("dnsNoiseReduction")) switchState = m_pSoundSettings->get(DNS_NOISE_REDUCTION).toBool(); const QString sourceName = QString::fromUtf8(m_pVolumeControl->defaultSourceName); const bool isPciInput = sourceName.startsWith("alsa_input") && !sourceName.contains("input.usb"); const bool isAlreadyLoaded = (sourceName == "noiseReduceSource"); if (switchState) { if (isAlreadyLoaded) { qDebug() << "module-echo-cancel is already loaded"; } else if (isPciInput) { const char* args = "use_master_format=1 aec_method=webrtc " "aec_args=analog_gain_control=0 source_name=noiseReduceSource"; qDebug() << "Load module-echo-cancel"; pa_context_load_module(m_pVolumeControl->getContext(), "module-echo-cancel", args, nullptr, nullptr); } else { m_pVolumeControl->getModuleIndexByName("module-echo-cancel"); QTimer::singleShot(300, this, [=]() { qDebug() << "Unload module-echo-cancel, case1: switch to a non-PCI device" << m_pVolumeControl->findModuleIndex; pa_context_unload_module(m_pVolumeControl->getContext(), m_pVolumeControl->findModuleIndex, nullptr, nullptr); }); } } else { m_pVolumeControl->getModuleIndexByName("module-echo-cancel"); QTimer::singleShot(300, this, [=]() { qDebug() << "Unload module-echo-cancel, case2: Func is disable" << m_pVolumeControl->findModuleIndex; pa_context_unload_module(m_pVolumeControl->getContext(), m_pVolumeControl->findModuleIndex, nullptr, nullptr); }); } } void UkmediaMainWidget::switchModuleLoopBack() { bool loopbackState = false; if (m_pSoundSettings->keys().contains(LOOP_BACK)) { loopbackState = m_pSoundSettings->get(LOOP_BACK).toBool(); } if (loopbackState && !m_pVolumeControl->sourceOutputIndexMap.values().contains("Loopback")) { pa_operation *o; qDebug() << "load module loopback"; if (!(o=pa_context_load_module(m_pVolumeControl->getContext(),"module-loopback",nullptr,nullptr,nullptr))) { m_pVolumeControl->showError(QObject::tr("pa_context_load_module() failed").toUtf8().constData()); } m_pVolumeControl->isLoadLoopback = true; } else if (!loopbackState){ m_pVolumeControl->getModuleIndexByName("module-loopback"); QTimer::singleShot(300,this,[=](){ qDebug() << "unload module loopback" << m_pVolumeControl->findModuleIndex; pa_context_unload_module(m_pVolumeControl->getContext(),m_pVolumeControl->findModuleIndex,nullptr,nullptr); }); m_pVolumeControl->isLoadLoopback = false; } } /** * @brief UkmediaMainWidget::resetVolumeSliderRange * é‡�置系统音é‡�滑动æ�¡èŒƒå›´(音é‡�增强) * gsetting keys: volume-increase, volume-increase-value * volume-increase: 音é‡�增强开关 * volume-increase: 音é‡�增强最大值 **/ void UkmediaMainWidget::resetVolumeSliderRange() { if (!QGSettings::isSchemaInstalled(KEY_SOUNDS_SCHEMA)) return; bool status = m_pSoundSettings->get(VOLUME_INCREASE).toBool(); appWidget->setVolumeSliderRange(status); systemWidget->setVolumeSliderRange(status); if (!status) { QMap::iterator it; for (it = m_pVolumeControl->sinkMap.begin(); it != m_pVolumeControl->sinkMap.end(); ++it) { sinkInfo info = it.value(); int volume = (info.volume.channels >= 2) ? MAX(info.volume.values[0], info.volume.values[1]) : info.volume.values[0]; if (volume > PA_VOLUME_NORMAL) m_pVolumeControl->setSinkVolume(info.index, PA_VOLUME_NORMAL); } } } void UkmediaMainWidget::switchMonoAudio() { bool monoAudioState = false; if (m_pSoundSettings->keys().contains("monoAudio")) monoAudioState = m_pSoundSettings->get(MONO_AUDIO).toBool(); // pactl load-module module-remap-sink sink_name=mono channels=2 channel_map=mono,monomonoAudioState = false; m_pVolumeControl->getModuleIndexByName("module-remap-sink"); if(monoAudioState) { pa_operation *o; if (!(o=pa_context_load_module(m_pVolumeControl->getContext(),"module-remap-sink",\ "sink_name=mono channels=1 channel_map=mono",nullptr,nullptr))) { m_pVolumeControl->showError(QObject::tr("pa_context_load_module() failed").toUtf8().constData()); qDebug() << "load module-remap-sink module error" << monoAudioState << m_pVolumeControl->findModuleIndex; } // m_pVolumeControl->setDefaultSink("mono"); qDebug() << "1 monoAudioState " << monoAudioState; } else { if(m_pVolumeControl->masterSinkDev!="") m_pVolumeControl->setDefaultSink(m_pVolumeControl->masterSinkDev.toLatin1().data()); QTimer::singleShot(300,this,[=](){ qDebug() << "unload module-remap-sink" << m_pVolumeControl->findModuleIndex; pa_context_unload_module(m_pVolumeControl->getContext(),m_pVolumeControl->findModuleIndex,nullptr,nullptr); }); qDebug() << "0 monoAudioState " << monoAudioState<< "unload module-remap-sink" << m_pVolumeControl->findModuleIndex; } } void UkmediaMainWidget::monitorSessionStatus() { //get session path // m_sessionActiveBus = QDBusConnection::systemBus(); QString methodName; QVariantList args; methodName = QStringLiteral("GetSessionByPID"); args << (quint32) QCoreApplication::applicationPid(); QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionControllerPath, m_sessionControllerManagerInterface, methodName); message.setArguments(args); QDBusPendingReply session = QDBusConnection::systemBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(session, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { QDBusPendingReply reply = *self; self->deleteLater(); if (!reply.isValid()) { qDebug()<< "The session is not registered with " << m_sessionControllerName << " " << reply.error().message(); return; } m_sessionPath = reply.value().path(); qDebug() << "Session path:" << m_sessionPath; //get sessionactive QDBusConnection::systemBus().connect(m_sessionControllerService, m_sessionPath, m_sessionControllerPropertiesInterface, QStringLiteral("PropertiesChanged"), this, SLOT(getSessionActive())); }); } void UkmediaMainWidget::getSessionActive() { const static QString s_dbusPropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); QDBusMessage message = QDBusMessage::createMethodCall(m_sessionControllerService, m_sessionPath, s_dbusPropertiesInterface, QStringLiteral("Get")); message.setArguments(QVariantList({m_sessionControllerSessionInterface, m_sessionControllerActiveProperty})); QDBusPendingReply reply = QDBusConnection::systemBus().asyncCall(message); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher *self) { QDBusPendingReply reply = *self; self->deleteLater(); if (!reply.isValid()) { qDebug() << "Failed to get Active Property of " << m_sessionControllerName << " session:" << reply.error().message(); return; } const bool active = reply.value().toBool(); onPrepareForSleep(!active); qDebug() << "active -----" <defaultSinkName == ""){ return "NULL"; } return m_pVolumeControl->defaultSinkName; } QString UkmediaMainWidget::getDefaultInputDevice() { if(m_pVolumeControl->defaultSourceName == ""){ return "NULL"; } return m_pVolumeControl->defaultSourceName; } bool UkmediaMainWidget::isNoneOutputDevice() { bool ret = true; QMap::iterator it; for (it=m_pVolumeControl->sinkMap.begin();it!=m_pVolumeControl->sinkMap.end();++it) { if((it.value().name != "") && (!it.value().name.contains("auto_null"))){ ret = false; } } return ret; } bool UkmediaMainWidget::isNoneInputDevice() { bool ret = true; QMap::iterator it; for (it=m_pVolumeControl->sourceMap.begin();it!=m_pVolumeControl->sourceMap.end();++it) { if((it.value().name != "") && (!it.value().name.contains(".monitor"))){ ret = false; } } return ret; } QStringList UkmediaMainWidget::getAllOutputDevices() { QMap::iterator it; QStringList devicesList; for (it=m_pVolumeControl->sinkMap.begin();it!=m_pVolumeControl->sinkMap.end();) { devicesList.append(it.value().name); ++it; } return devicesList; } QStringList UkmediaMainWidget::getAllInputDevices() { QMap::iterator it; QStringList devicesList; for (it=m_pVolumeControl->sourceMap.begin();it!=m_pVolumeControl->sourceMap.end();) { devicesList.append(it.value().name); ++it; } return devicesList; } int UkmediaMainWidget::getDefaultOutputVolume() { int value = m_pVolumeControl->sinkVolume; if (m_pSoundSettings->keys().contains("volumeIncrease")) { if(m_pSoundSettings->get("volume-increase").toBool()) value = (m_pVolumeControl->sinkVolume) +0.5; } return UkmediaCommon::getInstance().paVolumeToMediaVolume(value); } int UkmediaMainWidget::getDefaultInputVolume() { int volume = m_pVolumeControl->sourceVolume; return UkmediaCommon::getInstance().paVolumeToMediaVolume(volume); } bool UkmediaMainWidget::getDefaultOutputMuteState() { return m_pVolumeControl->sinkMuted; } bool UkmediaMainWidget::getDefaultInputMuteState() { return m_pVolumeControl->sourceMuted; } bool UkmediaMainWidget::setDefaultOutputVolume(int value) { if (value < 0 || value > 125) { qDebug() << "setDefaultOutputVolume value is invalid !"; return false; } if (m_pSoundSettings->keys().contains("volumeIncrease")) { if (!m_pSoundSettings->get("volume-increase").toBool() && value == 100) value = 100; } int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->setSinkVolume(m_pVolumeControl->sinkIndex, paVolume); return true; } bool UkmediaMainWidget::setDefaultInputVolume(int value) { if(value < 0 || value > 100) { qDebug() << "setDefaultOutputVolume value is invalid!"; return false; } int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->setSourceVolume(m_pVolumeControl->sourceIndex, paVolume); return true; } bool UkmediaMainWidget::setDefaultOutputMuteState(bool mute) { if(mute == m_pVolumeControl->sinkMuted) return false; m_pVolumeControl->setSinkMute(mute); return true; } bool UkmediaMainWidget::setDefaultInputMuteState(bool mute) { if(mute == m_pVolumeControl->sourceMuted) return false; m_pVolumeControl->setSourceMute(mute); return true; } bool UkmediaMainWidget::setDefaultOutputDevice(QString deviceName) { QMap>::iterator it; QMap portNameMap; bool isSucceed = false; for (it=m_pVolumeControl->sinkPortMap.begin();it!=m_pVolumeControl->sinkPortMap.end();) { portNameMap = it.value(); if(portNameMap.keys().contains(deviceName)){ isSucceed = m_pVolumeControl->setDefaultSink(deviceName.toLatin1().data()); return isSucceed; } ++it; } return isSucceed; } bool UkmediaMainWidget::setDefaultInputDevice(QString deviceName) { QMap>::iterator it; QMap portNameMap; bool isSucceed = false; for (it=m_pVolumeControl->sourcePortMap.begin();it!=m_pVolumeControl->sourcePortMap.end();) { portNameMap = it.value(); if(portNameMap.keys().contains(deviceName)){ isSucceed = m_pVolumeControl->setDefaultSource(deviceName.toLatin1().data()); return isSucceed; } ++it; } return isSucceed; } void UkmediaMainWidget::sendUpdateVolumeSignal(int soundType, int value) { switch (soundType) { case SoundType::SINK: Q_EMIT updateVolume(value); break; case SoundType::SOURCE: Q_EMIT updateSourceVolume(value); break; default: return; } } void UkmediaMainWidget::sendUpdateMuteSignal(int soundType, bool isMute) { switch (soundType) { case SoundType::SINK: Q_EMIT updateMute(isMute); break; case SoundType::SOURCE: Q_EMIT updateSourceMute(isMute); break; default: return; } } void UkmediaMainWidget::batteryLevelChanged(QString macAddr, int battery) { qDebug() << "batteryLevelChanged" << macAddr << battery; m_pBluetoothDbus->batteryLevel = battery; m_pBluetoothDbus->macAddress = macAddr; m_pBluetoothDbus->sendBatteryChangedSignal(macAddr, battery); } /** * @brief UkmediaMainWidget::initBlueDeviceVolume * è“�牙耳机åˆ�始化音é‡�(针对硬件音é‡�å��馈延迟处ç�†) * signal: initBlueDeviceVolumeSig **/ void UkmediaMainWidget::initBlueDeviceVolume(int index, QString name) { QTimer *m_timer = new QTimer(); m_timer->start(200); connect(m_timer, &QTimer::timeout, this, [=]() { m_pVolumeControl->setSinkVolume(index, OUTPUT_VOLUME); m_pVolumeControl->customSoundFile->addXmlNode(name,false); m_timer->stop(); }); qDebug() << "Initialize the volume of the Bluetooth device " << index << name; } void UkmediaMainWidget::deviceAdjustSlots(int type) { qDebug() << "deviceAdjustSlots enter type:" << type; switch ((type)) { case 1: { QDBusInterface mediaInterface("org.ukui.volume.control","/org/ukui/volume/control","org.ukui.volume.control"); QDBusMessage reply = mediaInterface.call("getAvailablePortList", 1); if (reply.arguments().isEmpty()) { qDebug() << __func__ << "arguments is nullptr..."; return; } QString cardName; // 声å�¡å��ç§° QString cardDesc; // 声å�¡æ��è¿° QString portName; // 设备端å�£å��ç§° QString portLabel; // 设备端å�£æ��è¿° uint32_t priority; // 端å�£ä¼˜å…ˆçº§ uint32_t direction; // 端å�£æ–¹å�‘ input or output uint32_t available; // 端å�£å�¯ç”¨çжæ€� bool enabled = true; // 端å�£æ˜¯å�¦å�¯ç”¨ int32_t type; // 端å�£çš„类型 const QDBusArgument& dbusArgs = reply.arguments().at(0).value(); dbusArgs.beginArray(); while (!dbusArgs.atEnd()) { dbusArgs.beginStructure(); dbusArgs >> cardName; dbusArgs >> cardDesc; dbusArgs >> portName; dbusArgs >> portLabel; dbusArgs >> priority; dbusArgs >> direction; dbusArgs >> available; dbusArgs >> enabled; if (enabled) { ++m_enableDeviceCount; } // dbusArgs >> type; dbusArgs.endStructure(); } dbusArgs.endArray(); } break; default: break; } qDebug() << "deviceAdjustSlots m_enableDeviceCount:" << m_enableDeviceCount; if (m_enableDeviceCount == 0) { bool isMute = m_pVolumeControl->getSinkMute(); outputVolumeDarkThemeImage(0, isMute); if(isMute) soundSystemTrayIcon->setToolTip(tr("Current volume:") + tr("Muted") ); else soundSystemTrayIcon->setToolTip(tr("Current volume:") + QString::number(0)); } else { themeChangeIcons(); } m_enableDeviceCount = 0;//reset } void UkmediaMainWidget::playAlertSound(QString soundEvent) { QDBusInterface interface("org.ukui.sound.theme.player","/org/ukui/sound/theme/player","org.ukui.sound.theme.player",QDBusConnection::sessionBus()); if(!interface.isValid()){ qDebug() << qPrintable(QDBusConnection::sessionBus().lastError().message()); return; } QDBusReply reply = interface.call("playAlertSound", soundEvent); if(reply.isValid()){ bool value = reply.value(); qDebug() << QString("Method Client playAlertSound = %1").arg(value); } else qDebug() << "playAlertSound Method call failed !"; } // 获å�–系统默认输出设备 QString UkmediaMainWidget::getSystemOutputDevice() { return findOutputPortLabel(m_pVolumeControl->defaultOutputCard,m_pVolumeControl->sinkPortName); } // 获å�–系统默认输入设备 QString UkmediaMainWidget::getSystemInputDevice() { return findInputPortLabel(m_pVolumeControl->defaultInputCard,m_pVolumeControl->sourcePortName); } // 获å�–appå��å�• QStringList UkmediaMainWidget::getAppList() { return m_pVolumeControl->sinkInputList; } QList UkmediaMainWidget::getPlaybackAppInfo() { qDBusRegisterMetaType(); QList infoList; QMap::iterator it; for(it = m_pVolumeControl->sinkInputMap.begin(); it != m_pVolumeControl->sinkInputMap.end(); it++) { QVariant info; info.setValue(it.value()); infoList.append(info); } return infoList; } QList UkmediaMainWidget::getRecordAppInfo() { qDBusRegisterMetaType(); QList infoList; QMap::iterator it; for(it = m_pVolumeControl->sourceOutputMap.begin(); it != m_pVolumeControl->sourceOutputMap.end(); it++) { QVariant info; info.setValue(it.value()); infoList.append(info); } return infoList; } // 获å�–应用音é‡� int UkmediaMainWidget::getAppVolume(QString appName) { int volume = m_pVolumeControl->getSinkInputVolume(appName.toLatin1().data()); return UkmediaCommon::getInstance().paVolumeToMediaVolume(volume); } // 获å�–应用é�™éŸ³çжæ€� bool UkmediaMainWidget::getAppMuteState(QString appName) { bool state = false; QMap::iterator it; for (it = m_pVolumeControl->sinkInputMuteMap.begin(); it != m_pVolumeControl->sinkInputMuteMap.end(); it++) { if (appName == it.key()) { state = it.value(); break; } } return state; } // 获å�–应用对应的输出设备 QString UkmediaMainWidget::getAppOutputDevice(QString appName) { int cardIndex = -1; int sinkIndex = -1; QString portName = ""; QString portLabel = ""; QMap::iterator it; QMap::iterator at; // 1. 获å�–应用对应sink name for(it = m_pVolumeControl->sinkInputMap.begin(); it != m_pVolumeControl->sinkInputMap.end(); it++) { appInfo info = it.value(); if (appName == info.name) { sinkIndex = info.masterIndex; break; } } // 2.获å�–端å�£ cardIndex = m_pVolumeControl->sinkMap.value(sinkIndex).card; portName = m_pVolumeControl->sinkMap.value(sinkIndex).active_port_description; for (at = currentOutputPortLabelMap.begin(); at != currentOutputPortLabelMap.end(); at++) { if (cardIndex == at.key() && at.value().contains(portName)) { portLabel = at.value(); break; } } if (portLabel.isEmpty()) { QString masterDevName = m_pVolumeControl->sinkMap.value(sinkIndex).master_device; int cardIndex = m_pVolumeControl->findMasterDeviceCardIndex(masterDevName); for (at = currentOutputPortLabelMap.begin(); at != currentOutputPortLabelMap.end(); at++) { if (cardIndex == at.key()) { portLabel = at.value(); break; } } } portLabel = (portLabel != "") ? portLabel : getSystemOutputDevice(); return portLabel; } // 获å�–应用对应的输入设备 QString UkmediaMainWidget::getAppInputDevice(QString appName) { int cardIndex = -1; int sourceIndex = -1; QString portName = ""; QString portLabel = ""; QMap::iterator it; QMap::iterator at; for(it = m_pVolumeControl->sourceOutputMap.begin(); it != m_pVolumeControl->sourceOutputMap.end(); it++) { appInfo info = it.value(); if (appName == info.name) { sourceIndex = info.masterIndex; break; } } cardIndex = m_pVolumeControl->sourceMap.value(sourceIndex).card; portName = m_pVolumeControl->sourceMap.value(sourceIndex).active_port_description; if (sourceIndex == -1 && portName == "") return getSystemInputDevice(); for (at = currentInputPortLabelMap.begin(); at != currentInputPortLabelMap.end(); at++) { if (cardIndex == at.key() && at.value().contains(portName)) { portLabel = at.value(); break; } } portLabel = (portLabel != "") ? portLabel : getSystemInputDevice(); return portLabel; } // 设置应用é�™éŸ³ bool UkmediaMainWidget::setAppMuteState(QString appName, bool state) { bool n_SinkInputStatus = m_pVolumeControl->setSinkInputMuted(appName, state); bool n_SourceOutputStatus = m_pVolumeControl->setSourceOutputMuted(appName, state); return (n_SinkInputStatus || n_SourceOutputStatus) ? true : false; } // 设置应用音é‡� bool UkmediaMainWidget::setAppVolume(QString appName, int value) { int appIndex = -1; QMap::iterator it; for(it = m_pVolumeControl->sinkInputMap.begin(); it != m_pVolumeControl->sinkInputMap.end(); it++) { appInfo info = it.value(); if (appName == info.name) { int paVolume = UkmediaCommon::getInstance().mediaVolumeToPaVolume(value); m_pVolumeControl->setSinkInputVolume(info.index, paVolume, info.channel); } } if (appName == "kylin-music" || appName == "kylin-video") { QDBusMessage message =QDBusMessage::createSignal("/", "org.ukui.media", "sinkVolumeChanged"); message<< appName << value << getAppMuteState(appName); QDBusConnection::sessionBus().send(message); qDebug() << "Send SIGNAL: sinkVolumeChanged. Case: Synchronous volume status" << appName; } return (appIndex != -1) ? true : false; } // 设置系统默认输出设备 bool UkmediaMainWidget::setSystemOutputDevice(QString portLabel) { int index = indexOfOutputPortInOutputListWidget(portLabel); if (index >= 0) { systemWidget->m_pOutputListWidget->setCurrentRow(index); outputListWidgetCurrentRowChangedSlot(index); outputListWidgetRow = index; return true; } return false; } // 设置系统默认输入设备 bool UkmediaMainWidget::setSystemInputDevice(QString portLabel) { int index = indexOfInputPortInInputListWidget(portLabel); if (index >= 0) { systemWidget->m_pInputListWidget->setCurrentRow(index); return true; } return false; } // 设置应用默认输出设备 bool UkmediaMainWidget::setAppOutputDevice(QString appName, int cardIndex, QString sinkPortName) { if (cardIndex == -1) return false; QString sinkStr = findPortSink(cardIndex, sinkPortName); if (sinkStr == "") return false; m_pVolumeControl->moveSinkInput(appName, sinkStr.toLatin1().data()); return true; } // 设置应用默认输入设备 bool UkmediaMainWidget::setAppInputDevice(QString appName, int cardIndex, QString sourcePortName) { if (cardIndex == -1) return false; QString sourceStr = findPortSource(cardIndex, sourcePortName); if (sourceStr == "") return false; m_pVolumeControl->moveSoureOutput(appName, sourceStr.toLatin1().data()); return true; } /** * @brief UkmediaMainWidget::isPortHidingNeeded * UKCC应用音é‡�UI是å�¦éœ€è¦�éš�è—�æŸ�端å�£ * soundType: 输入 or 输出 * cardIndex: 声å�¡idx * portLabel: 端å�£æ��è¿°å�� * return: Trueéš�è—�,False无需éš�è—� **/ bool UkmediaMainWidget::isPortHidingNeeded(int soundType, int cardIndex, QString portLabel) { if (cardIndex < 0 || portLabel.isEmpty()) return true; portLabel = portLabel.split("(").at(0); if (soundType == SoundType::SINK) { QMap::iterator itor; for (itor = m_pVolumeControl->sinkMap.begin(); itor != m_pVolumeControl->sinkMap.end(); ++itor) { sinkInfo outInfo = itor.value(); QString active_port = outInfo.active_port_description; QList list; for (int i = 0; i < outInfo.sink_port_list.size(); ++i) list.append(outInfo.sink_port_list.at(i).description); // 确认对应sink,如果为活跃端å�£åˆ™æ˜¾ç¤º if (cardIndex == outInfo.card && list.contains(portLabel)) return (portLabel == active_port) ? false : true; } return true; } else if (soundType == SoundType::SOURCE) { QMap::iterator itor; for (itor = m_pVolumeControl->sourceMap.begin(); itor != m_pVolumeControl->sourceMap.end(); ++itor) { sourceInfo inInfo = itor.value(); QString active_port = inInfo.active_port_description; QList list; for (int i = 0; i < inInfo.source_port_list.size(); ++i) list.append(inInfo.source_port_list.at(i).description); if (cardIndex == inInfo.card && list.contains(portLabel)) return (portLabel == active_port) ? false : true; } return true; } return false; } void UkmediaMainWidget::showUkuiVolumeControlTray() { // v11 2603 pre ä¸�å†�使用原æ�¥æ‰˜ç›˜ï¼Œè€Œæ˜¯è°ƒç”¨æŽ¥å�£å”¤èµ·qml声音æ�’ä»¶ QDBusInterface interface("org.ukui.Sidebar", "/org/ukui/Sidebar", "org.ukui.Sidebar", QDBusConnection::sessionBus()); if (!interface.isValid()) { qDebug() << "DBus interface is not valid:" << qPrintable(interface.lastError().message()); return; } QDBusReply reply = interface.call("shortcutWidgetActive", "org.ukui.shortcut.audio", false); if (reply.isValid()) { bool result = reply.value(); qDebug() << "Call succeeded. Result:" << result; } else { qDebug() << "Call failed:" << qPrintable(reply.error().message()); } } UkmediaMainWidget::~UkmediaMainWidget() { if (m_panelGSettings) { delete m_panelGSettings; m_panelGSettings = nullptr; } if (soundSystemTrayIcon) { delete soundSystemTrayIcon; soundSystemTrayIcon = nullptr; } } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/0000775000175000017500000000000015170054730023313 5ustar fengfengukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlocalpeer.h0000664000175000017500000000520515170052044025775 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 QTLOCALPEER_H #define QTLOCALPEER_H #include #include #include #include "qtlockedfile.h" class QtLocalPeer : public QObject { Q_OBJECT public: QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); protected Q_SLOTS: void receiveConnection(); protected: QString id; QString socketName; QLocalServer* server; QtLP_Private::QtLockedFile lockFile; private: static const char* ack; }; #endif // QTLOCALPEER_H ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsingleapplication.pri0000664000175000017500000000106115170052044030073 0ustar fengfengINCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT *= network greaterThan(QT_MAJOR_VERSION, 4): QT *= widgets qtsingleapplication-uselib:!qtsingleapplication-buildlib { LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME } else { SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h } win32 { contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlockedfile.cpp0000664000175000017500000001374215170052044026470 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 "qtlockedfile.h" /*! \class QtLockedFile \brief The QtLockedFile class extends QFile with advisory locking functions. A file may be locked in read or write mode. Multiple instances of \e QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file. The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost. The lock provided by an instance of \e QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called. */ /*! \enum QtLockedFile::LockMode This enum describes the available lock modes. \value ReadLock A read lock. \value WriteLock A write lock. \value NoLock Neither a read lock nor a write lock. */ /*! Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way as \e QFile::QFile(). \sa QFile::QFile() */ QtLockedFile::QtLockedFile() : QFile() { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in the same way as \e QFile::QFile(const QString&). \sa QFile::QFile() */ QtLockedFile::QtLockedFile(const QString &name) : QFile(name) { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Opens the file in OpenMode \a mode. This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock. Returns true if successful; otherwise false. \sa QFile::open(), QFile::resize() */ bool QtLockedFile::open(OpenMode mode) { if (mode & QIODevice::Truncate) { qWarning("QtLockedFile::open(): Truncate mode not allowed."); return false; } return QFile::open(mode); } /*! Returns \e true if this object has a in read or write lock; otherwise returns \e false. \sa lockMode() */ bool QtLockedFile::isLocked() const { return m_lock_mode != NoLock; } /*! Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. \sa isLocked() */ QtLockedFile::LockMode QtLockedFile::lockMode() const { return m_lock_mode; } /*! \fn bool QtLockedFile::lock(LockMode mode, bool block = true) Obtains a lock of type \a mode. The file must be opened before it can be locked. If \a block is true, this function will block until the lock is aquired. If \a block is false, this function returns \e false immediately if the lock cannot be aquired. If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock is first released and then a new lock is obtained. This function returns \e true if, after it executes, the file is locked by this object, and \e false otherwise. \sa unlock(), isLocked(), lockMode() */ /*! \fn bool QtLockedFile::unlock() Releases a lock. If the object has no lock, this function returns immediately. This function returns \e true if, after it executes, the file is not locked by this object, and \e false otherwise. \sa lock(), isLocked(), lockMode() */ /*! \fn QtLockedFile::~QtLockedFile() Destroys the \e QtLockedFile object. If any locks were held, they are released. */ ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlockedfile.h0000664000175000017500000000630715170052044026134 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 QTLOCKEDFILE_H #define QTLOCKEDFILE_H #include #ifdef Q_OS_WIN #include #endif #if defined(Q_OS_WIN) # if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) # define QT_QTLOCKEDFILE_EXPORT # elif defined(QT_QTLOCKEDFILE_IMPORT) # if defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # endif # define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) # elif defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) # endif #else # define QT_QTLOCKEDFILE_EXPORT #endif namespace QtLP_Private { class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile { public: enum LockMode { NoLock = 0, ReadLock, WriteLock }; QtLockedFile(); QtLockedFile(const QString &name); ~QtLockedFile(); bool open(OpenMode mode); bool lock(LockMode mode, bool block = true); bool unlock(); bool isLocked() const; LockMode lockMode() const; private: #ifdef Q_OS_WIN Qt::HANDLE wmutex; Qt::HANDLE rmutex; QVector rmutexes; QString mutexname; Qt::HANDLE getMutexHandle(int idx, bool doCreate); bool waitMutex(Qt::HANDLE mutex, bool doBlock); #endif LockMode m_lock_mode; }; } #endif ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsinglecoreapplication.h0000664000175000017500000000502515170052044030405 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 QTSINGLECOREAPPLICATION_H #define QTSINGLECOREAPPLICATION_H #include class QtLocalPeer; class QtSingleCoreApplication : public QCoreApplication { Q_OBJECT public: QtSingleCoreApplication(int &argc, char **argv); QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); QString id() const; public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); private: QtLocalPeer* peer; }; #endif // QTSINGLECOREAPPLICATION_H ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/QtLockedFile0000664000175000017500000000003215170052044025533 0ustar fengfeng#include "qtlockedfile.h" ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlockedfile_unix.cpp0000664000175000017500000000661415170052044027533 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 #include #include #include "qtlockedfile.h" bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; int cmd = block ? F_SETLKW : F_SETLK; int ret = fcntl(handle(), cmd, &fl); if (ret == -1) { if (errno != EINTR && errno != EAGAIN) qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = F_UNLCK; int ret = fcntl(handle(), F_SETLKW, &fl); if (ret == -1) { qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsingleapplication.cpp0000664000175000017500000002704615170052044030076 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 "qtsingleapplication.h" #include "qtlocalpeer.h" #include /*! \class QtSingleApplication qtsingleapplication.h \brief The QtSingleApplication class provides an API to detect and communicate with running instances of an application. This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server. By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead. The application should create the QtSingleApplication object early in the startup phase, and call isRunning() to find out if another instance of this application is already running. If isRunning() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. In this case, the application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the running application receives messages from another instance of the same application. When a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot. If isRunning() returns true, another instance is already running. It may be alerted to the fact that another instance has started by using the sendMessage() function. Also data such as startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance with this function. Then, the application should terminate (or enter client mode). If isRunning() returns true, but sendMessage() fails, that is an indication that the running instance is frozen. Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that). \code // Original int main(int argc, char **argv) { QApplication app(argc, argv); MyMainWidget mmw; mmw.show(); return app.exec(); } // Single instance int main(int argc, char **argv) { QtSingleApplication app(argc, argv); if (app.isRunning()) return !app.sendMessage(someDataString); MyMainWidget mmw; app.setActivationWindow(&mmw); mmw.show(); return app.exec(); } \endcode Once this QtSingleApplication instance is destroyed (normally when the process exits or crashes), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance. For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library. \sa QtSingleCoreApplication */ void QtSingleApplication::sysInit(const QString &appId) { actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a GUIenabled are passed on to the QAppliation constructor. If you are creating a console application (i.e. setting \a GUIenabled to false), you may consider using QtSingleCoreApplication instead. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) { sysInit(); } /*! Creates a QtSingleApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) : QApplication(argc, argv) { sysInit(appId); } #if QT_VERSION < 0x050000 /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a type are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) : QApplication(argc, argv, type) { sysInit(); } # if defined(Q_WS_X11) /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be \a appId. \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(appId); } # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleApplication::id() const { return peer->applicationId(); } /*! Sets the activation window of this application to \a aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window. If \a activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted. \sa activateWindow(), messageReceived() */ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; if (activateOnMessage) connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); else disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); } /*! Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0. \sa setActivationWindow() */ QWidget* QtSingleApplication::activationWindow() const { return actWin; } /*! De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set. This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance. This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set. \sa setActivationWindow(), messageReceived(), initialize() */ void QtSingleApplication::activateWindow() { if (actWin) { actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->showNormal(); actWin->activateWindow(); } } /*! \fn void QtSingleApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage(), setActivationWindow(), activateWindow() */ /*! \fn void QtSingleApplication::initialize(bool dummy = true) \obsolete */ ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlocalpeer.cpp0000664000175000017500000001562015170054730026336 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 "qtlocalpeer.h" #include #include #include #include #if defined(Q_OS_WIN) #include #include typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); static PProcessIdToSessionId pProcessIdToSessionId = 0; #endif #if defined(Q_OS_UNIX) #include #include #include #endif namespace QtLP_Private { #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif } const char* QtLocalPeer::ack = "ack"; QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) : QObject(parent), id(appId) { QString prefix = id; if (id.isEmpty()) { id = QCoreApplication::applicationFilePath(); #if defined(Q_OS_WIN) id = id.toLower(); #endif prefix = id.section(QLatin1Char('/'), -1); } // QRegExp removed in Qt6, use QRegularExpression instead QRegularExpression re("[^a-zA-Z]"); prefix.remove(re); prefix.truncate(6); QByteArray idc = id.toUtf8(); quint16 idNum = qChecksum(idc.constData(), idc.size()); socketName = QLatin1String("qtsingleapp-") + prefix + QLatin1Char('-') + QString::number(idNum, 16); #if defined(Q_OS_WIN) if (!pProcessIdToSessionId) { QLibrary lib("kernel32"); pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); } if (pProcessIdToSessionId) { DWORD sessionId = 0; pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); socketName += QLatin1Char('-') + QString::number(sessionId, 16); } #else socketName += QLatin1Char('-') + QString::number(::getuid(), 16); #endif server = new QLocalServer(this); QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); lockFile.setFileName(lockName); lockFile.open(QIODevice::ReadWrite); } bool QtLocalPeer::isClient() { if (lockFile.isLocked()) return false; if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) // ### Workaround if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); res = server->listen(socketName); } #endif if (!res) qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); return false; } bool QtLocalPeer::sendMessage(const QString &message, int timeout) { if (!isClient()) return false; QLocalSocket socket; bool connOk = false; for(int i = 0; i < 2; i++) { // Try twice, in case the other instance is just starting up socket.connectToServer(socketName); connOk = socket.waitForConnected(timeout/2); if (connOk || i) break; int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } if (!connOk) return false; QByteArray uMsg(message.toUtf8()); QDataStream ds(&socket); ds.writeBytes(uMsg.constData(), uMsg.size()); bool res = socket.waitForBytesWritten(timeout); if (res) { res &= socket.waitForReadyRead(timeout); // wait for ack if (res) res &= (socket.read(qstrlen(ack)) == ack); } return res; } void QtLocalPeer::receiveConnection() { QLocalSocket* socket = server->nextPendingConnection(); if (!socket) return; while (true) { if (socket->state() == QLocalSocket::UnconnectedState) { qWarning("QtLocalPeer: Peer disconnected"); delete socket; return; } if (socket->bytesAvailable() >= qint64(sizeof(quint32))) break; socket->waitForReadyRead(); } QDataStream ds(socket); QByteArray uMsg; quint32 remaining; ds >> remaining; uMsg.resize(remaining); int got = 0; char* uMsgBuf = uMsg.data(); do { got = ds.readRawData(uMsgBuf, remaining); remaining -= got; uMsgBuf += got; } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); if (got < 0) { qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); delete socket; return; } QString message(QString::fromUtf8(uMsg)); socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); socket->waitForDisconnected(1000); // make sure client reads ack delete socket; Q_EMIT messageReceived(message); //### (might take a long time to return) } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsingleapplication.h0000664000175000017500000000761715170052044027545 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 QTSINGLEAPPLICATION_H #define QTSINGLEAPPLICATION_H #include class QtLocalPeer; #if defined(Q_OS_WIN) # if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) # define QT_QTSINGLEAPPLICATION_EXPORT # elif defined(QT_QTSINGLEAPPLICATION_IMPORT) # if defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # endif # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) # elif defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) # endif #else # define QT_QTSINGLEAPPLICATION_EXPORT #endif class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication { Q_OBJECT public: QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); QtSingleApplication(const QString &id, int &argc, char **argv); #if QT_VERSION < 0x050000 QtSingleApplication(int &argc, char **argv, Type type); # if defined(Q_WS_X11) QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 bool isRunning(); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); QWidget* activationWindow() const; // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); private: void sysInit(const QString &appId = QString()); QtLocalPeer *peer; QWidget *actWin; }; #endif // QTSINGLEAPPLICATION_H ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtlockedfile_win.cpp0000664000175000017500000001466115170052044027346 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 "qtlockedfile.h" #include #include #define MUTEX_PREFIX "QtLockedFile mutex " // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS #define MAX_READERS MAXIMUM_WAIT_OBJECTS #if QT_VERSION >= 0x050000 #define QT_WA(unicode, ansi) unicode #endif Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) { if (mutexname.isEmpty()) { QFileInfo fi(*this); mutexname = QString::fromLatin1(MUTEX_PREFIX) + fi.absoluteFilePath().toLower(); } QString mname(mutexname); if (idx >= 0) mname += QString::number(idx); Qt::HANDLE mutex; if (doCreate) { QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); return 0; } } else { QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); return 0; } } return mutex; } bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) { Q_ASSERT(mutex); DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); switch (res) { case WAIT_OBJECT_0: case WAIT_ABANDONED: return true; break; case WAIT_TIMEOUT: break; default: qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); } return false; } bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); if (!wmutex && !(wmutex = getMutexHandle(-1, true))) return false; if (!waitMutex(wmutex, block)) return false; if (mode == ReadLock) { int idx = 0; for (; idx < MAX_READERS; idx++) { rmutex = getMutexHandle(idx, false); if (!rmutex || waitMutex(rmutex, false)) break; CloseHandle(rmutex); } bool ok = true; if (idx >= MAX_READERS) { qWarning("QtLockedFile::lock(): too many readers"); rmutex = 0; ok = false; } else if (!rmutex) { rmutex = getMutexHandle(idx, true); if (!rmutex || !waitMutex(rmutex, false)) ok = false; } if (!ok && rmutex) { CloseHandle(rmutex); rmutex = 0; } ReleaseMutex(wmutex); if (!ok) return false; } else { Q_ASSERT(rmutexes.isEmpty()); for (int i = 0; i < MAX_READERS; i++) { Qt::HANDLE mutex = getMutexHandle(i, false); if (mutex) rmutexes.append(mutex); } if (rmutexes.size()) { DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0); if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { if (res != WAIT_TIMEOUT) qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky unlock(); return false; } } } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; if (m_lock_mode == ReadLock) { ReleaseMutex(rmutex); CloseHandle(rmutex); rmutex = 0; } else { foreach(Qt::HANDLE mutex, rmutexes) { ReleaseMutex(mutex); CloseHandle(mutex); } rmutexes.clear(); ReleaseMutex(wmutex); } m_lock_mode = QtLockedFile::NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); if (wmutex) CloseHandle(wmutex); } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsinglecoreapplication.pri0000664000175000017500000000050415170052044030745 0ustar fengfengINCLUDEPATH += $$PWD DEPENDPATH += $$PWD HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp QT *= network win32:contains(TEMPLATE, lib):contains(CONFIG, shared) { DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport) } ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/qtsinglecoreapplication.cpp0000664000175000017500000001235515170052044030744 0ustar fengfeng/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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 "qtsinglecoreapplication.h" #include "qtlocalpeer.h" /*! \class QtSingleCoreApplication qtsinglecoreapplication.h \brief A variant of the QtSingleApplication class for non-GUI applications. This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library. The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage. A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application. \sa QtSingleApplication */ /*! Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleCoreApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleCoreApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleCoreApplication::id() const { return peer->applicationId(); } /*! \fn void QtSingleCoreApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage() */ ukui-media/ukui-volume-control-applet-qt/QtSingleApplication/QtSingleApplication0000664000175000017500000000004115170052044027137 0ustar fengfeng#include "qtsingleapplication.h" ukui-media/ukui-volume-control-applet-qt/custom_sound.h0000664000175000017500000000222415170054730022274 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include #include #include class CustomSound { public: CustomSound(); ~CustomSound(); bool createAudioFile(); bool isExist(QString nodeName); int addXmlNode(QString nodeNane, bool initState); bool isFirstRun(); private: QDomDocument *doc; QString audioPath; }; #endif // CUSTOMSOUND_H ukui-media/ukui-volume-control-applet-qt/data/0000775000175000017500000000000015170054730020312 5ustar fengfengukui-media/ukui-volume-control-applet-qt/data/sounds/0000775000175000017500000000000015170054730021625 5ustar fengfengukui-media/ukui-volume-control-applet-qt/data/sounds/xunguang.xml0000664000175000017500000000245215170052044024202 0ustar fengfeng genericnotification specialnotification dialogcomplete dialogwarning dialogerror devconnectionsucceeded devconnectionfailed devconnectionbreak powerconnected lowpower volumechange copyormovesucceed recyclebinclear operationnotsupported photo screen ukui-media/ukui-volume-control-applet-qt/data/sounds/shutdown.ogg0000664000175000017500000075772215170054730024222 0ustar fengfengOggSLm¨`‰îñ<vorbis€»m ¸OggSLm¨`¦S‹#RÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSvorbis,Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)ENCODER=libsndfilevorbis+BCV1L Å€Ð�U`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€Ð�U €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNPRT>’ "š™9Ž��‘’“”•@@OggS@Lm¨`_rÀ Áš–œŒ‹ŒŽ™ÿÿÿš­¦ª¤£©¹Á»ºÿÿÿÿA¼>§�¯A˜ÏZëO«<0öáÅa9Bqø²š±ªeÃjZ ë`)­ƒ¥ô±kcûÖÖíí[[·Gn•�á¾ñ0otwïrÏ�k97®ÇËuXÊǰ”ó0•û+¿«+¿Ë³~,Oiå¢ ®¦³ø•fÇY…®,ƒZe®:År€×Ã_ˆ°Ý•ÖË MÇþùå;cƒW³‰O”ð[&añÓʽEÿ1³q9©ÚîôÑÑØîQ'}@Ùw)ÿ¦WyK ´K%+”íþÛÍc¶Y]N±a»‡ÓÍ©R^lUŽŸÏåýz½jEcµ6¬õ³\'µ½�«’Úr‘GÃ/45Ï-ˆgq[NjÕB«{® x d+d ­’`Kçm�J¼EòƒY3~ê…ýÄzgJ]œz”že}œºG¹ßÿ”å­=Y¬Ï0òzüè§Dßïä¸û¤O½ªÁ²[Ĺw,í¾›î€Æ¥ÝwseÖpûk•ãP(W¼ Oˆ µœø«W�ûѓ׮…sÕªD]¸Ö —Ü�gÙ8PZk.‡C<¹]_è\Àís…°;êåDbóÃö¥–�ð8Ç�?½FïßÇ¢0¹®ðÂp%ƾà›NîúŸ·ÇrssÝKeýô£¡�ü3×yy.­ÿ©±›¯'cI[>füðžº#ÿg÷Ô}ÎÀÀ ·à)ß®’pÙ’ãÓx„nZeµ_ÈP8ûTƒ«#�nDf'÷½pžZA3Q¤ùçåš°D¯ìZ— ñž'_üÀÛá=u/€?xÛÅ÷¦ÈöÖ¥—v‚æl0A6½Ÿ3¤ô‘¯¦»‰úÐ=�Oãpú8æçNô§‡Ú@ã~¦4VÄ…÷€À}*t�V›Ÿ¸‡{Èû…ÊF'¬Æ'9Mm÷M �=¹?ð-WaVký»Ò-†Žf|ŒÍI¼?À¡ê¿à¹a­êqäøž†‚⛇ ƒÀïG¼g±b©s;T"–�§P÷_÷#gvЮ�ÂêG<öÒ«6ûïs?œýøÕÊ÷¢8†´þŽ(§Þ^ô@ÚT¼_~µÔ¤¼�¸h&8¼jéôÊúˆPƒšÒ²êgÿµ.¨$E]™'óÇ ™“…û¶ú¶ú(±¿æ¤Þã=[î!"®”†aˆ0#šç›FyåŽæœ™-usõ±˜;˜í|UÅÓ ªªù›¤ÏÜ3•Éœ‡ Õ ôø¢¸gxN¨‡ô¨+@�©®Ydæž×ñó¸ï3èžú˜§.ºI†›™KªBfv~îr€V²€fÂÒÌǼ¢Úóï?e€*ÛW\*5xGÀ%©ÀU�˜´ÕyÎ=z=UUM?©ÚÂLw°P™MyÞñ�aÚhr-¨Ø‹7Ý�‘‡AFÝÁ%ú¬(}ŤQ,¯�æ:#ˆÉ~TÍävx¦ð5SUŸ/=k›Ø Îî3ªª±‚’D’ì±;5¤.¤†S§y#"ôLÅÇLÇ ªTÏ»# B™ÜnZôO‹ð!ŒUt'Ð-�#bÎðUô«S‚V±û'IZ•‹Ý‚zÙè«8ûµrÕÃNùõ ´¼j;5[7øÎ`[œYU*Ò炳¾çøúÁs¡ð óo'Ä}ÌrΗ�€ÛCÈ�hÒbr¾û›HòyGk\uÏÀòÛßß=['amÎ$ŒËÇÀË&d{&»Ÿr!»Øÿ:ŒÞ‹»ôj‘7‚-S(•¥ƒ-Ž_™k˜Â;ÿdÉ®3µ€ŠZŠIÎ6[W.ב¬é±`ñ|m ƒCágâ¾D¾š¬ËD^Ÿw(JM/›ëÅùÍ©–Þæ{hgœóÅ(Ðéþm®Îb´Å¶Ž�™ÔÖ—ÂüÛãj»Ý’&½ÏcÝùbß�ÍÓ°-Ÿ÷´èö—Wž¹y©àYï<Üva½\lž�ñ'›ÏDz�¥‡…7æ~Ì/Îþ‰äï|r$±4Vštnɸ m‘c,7@ gdPâ i“õ5nr„µMséBŽ^�¯ëÑ'_Ÿª;zµ/V·-Á£1ØÃ÷*OsÓOÆŽ(zØ¡=‘Áܲž:+ü¶��ݲ—§â=æÑ”7‰ìšñ#§ZvW9lcy ®R×âRÚ<–ºo¥T_­u-øÙ÷{|UûW�ÍËÌÇ¢›A ìtö¹›$§0°Uø5Xî9Q¶ÅóuÞ`“Š­…”Í÷±ùP*ïå§yKoùŸô÷jšÒâ‹…Ígh†_Û³á‹çzÏëOâ/V $8?–.w> ù–UhÜ|{çA¾±èdøG7oXÆ)�§v=êuó}CN¹xö�åþÄ ×Zßq>²Ö%ŽaŠ�‘R/Κ§}��W‚˜ÄIwÏ Ñª¸×Å»«ó:øx)n¿Ö}±ô¬åüÄ$Ô�¥„øÑSêe¨“ßéÔðLå´üoµ þ·ýþi®ñ¾¿BÞõ¥å¨UwvXfëÿÝíýõýÚØýóûÙÝŽKòX¯Wµ>k 4¼øì n…¦Ÿ[d2+?X´ø_nÄ Ý…ŸZo{Úǽ^�Ï,:֩꺠§Y×ã[¶¢Q9#­,(¯DˆCQ1—ùC"xzŸ½{0»Å:ÕÖ.h¼œª¦n¨†žçÆÅ]·QJ.&.…ù1a:jÝx¼¿ÍÙœ|ÝÇ×´è¬K½H¿_„s#›bÙ"ÚLty¢b«½�IxnLZûlè–ãá—QöWàùæÕ=¢~uO=>wZä§•jöÿ®§³UÖ×…±•¹ä0×ý>h çåú‡‡>éÅpëýùù9Ÿ7iHI5ö(yD–쇺ø­/æ«B|¿êNj'>ú€�ݦU³ï7ð>|—$ü!dÅrAî{ÁìöêÚ:EšžÊæ;[?ðÛµ¤‡ãGH1<´¤ë»;¦¾:ò­>dÉwæ¼vjý…÷ ^<ËàM�}ß˼ÄLùö³i°êÖù“ïÒutArû�=nQ��rcºÐл4ÊþÌSþö_Ý`1²šî’ÛÓðŽ(¸¢÷â±ä*â]$ñ2W¼º Å�Å©Õcž;CÀàü‚&t¹³óD¸23C¦P8’HÿÍe�·"I+ÚÛˆúQ;aµâ˜„PSÎßÕ¿ׄÕQ¯‰+.gE¥˜ŽìÜ­zJe�`:±�[FÝÙn/LùÖH"^¼g¯ò- 茭 ö‹�|+»º wSÙ(Ý9Å}”Áü£.ñ^o’»¼~0¯¦heÞî’w¹�uj\wA êR'gBläuÃ@f¾Š·®Bϰ1¸·J0Q'ù6-…Ë1­°þõ-+Éz½6I ¹ mØS¯ ŸZí9xŠ€E±Pë°œéÈîrË +_ïÃ7Áp¨h¢ —œ2½ö¯wy*Œù޽[Vü+\qÌ·nŽ_Lý5§žÑ{Ž5oÇeò÷õò¢§x²O׋Á{–®>f=úÙõ}^‡{‘99—í,Ë\É>åz "ºÂTQ›Ǽb`ÐgWM?Û„N)Ÿ´õ Ï•ŸÒ8ÍËyWYCâê¾{Vác¯{2mLgUZwáIê ওÙÄ`´K%ºL䘤p×£Ôz=¤Ö¹oùôMÁ"‡'kÿ!{+¹¤ùî›UóîYáNe¾·Ä±\üaÕ]ö`ŸÎfãÙão™?_Þ�ß-ëÆµœë‚ñHžö·?î¯ßÿðÏÿ ø®Ý{®{áî?Dˆ æ^a;ß‹ýØò®ýü½C¬XœOõ}ËU\ ÁÄWÄa*yqåÝÀ‡(=š§xˆ{*Ë´ �ò� Z�ÂÁæõû»?³Ü¨Y¼í¬8fU÷0ÞΫéú‡®–7´ùòfÛë² ¾ñ�‡aPgýIÃþåÅþ1¿þnøä÷¿ž-ÿ³Ÿú×Ó:Ï�½\4K™†îúÅuÝoî>î‰Õó=¤õ¨ÏÕáXßúÂLÙ¹ÞOm93¡æÎu^×÷0•ØUàr°Ñ¼–RäéÝ¿·X!YÀE¸ë2sn},lÓ5ëšúzóÆ8 ýë 4ÍÚ|ñ°k€|TÚ7)±¯glØØ®jÿÌ3{¡-_ïnb ò¡Ï^<óŸöö®éÌ·”úÓçw–÷ q¨µøM¦z]ý¯ˆéN­À$éEqÍNn4“ñ”³²woo.7.žž¨«±·ƒvUúèøcúé¼üšGÉ_³ÿØ—ªb�P“Źd{gO'‹©ç|¦X�Æ5OúsÝÆ �jnúÔ¿¸æÿQ®¾�"öÿïqHîõRåm.6Ÿî Úæcü5¶ û?‹ÚaÛ�fž©Q°hÿž”'YÏûwnB�¾×ÂMÿ³ÿéóÓÚ«vzèBddÜ@ц‹ ñ.¯][ç륢<à¼õÖëµéìîÓz8éÍ‘\ûéËãï³Ç½Õ�K �î¬7^?{aºØIdQüŒgUª8�þ稨€5IG…JÝŒ®]K?ž×öbxê­¯ÇOnúúÚì„¢"p@@HR¦ÂU2Rü¶€ó³DpØ=Ãr’"{¡R¦”'ñ‡q9ì°"âx€(rɬ]ÓI-˜^Y¡°Ã4÷qÆÚÏX²*�E Ç#rœü*ÇAeŸÎ»ƒ9Î×  $À²crö='Äîu3Á;à»ÆÜüíî7ߺÝg¡åB€¯îž–�g“WØý±¸.<m’Ö©¯lk,ï>›y“3#½5šž‚��[Kf�{qÀ+™ˆªŠª:dkÁ~�&ï¶ÝþSŸ;m¾Ä15Ï÷pÈÓe|ELØè+ÏÆ-W;wóû»õÑá¤C9W]ÓÞ¯eš\}Ì»,ß�I¿,Qê¢�LZ+Ïg×-Û&2¹¬NGu9nŽºÞßí+ÍX¾Ru¿<ëD•´yÔžðãL» ¹ÄövçL ·ƒKóëšçëÆLòwdÜ@G7tüÂùèãNLåÿö�9;vƒ¼¦vìP—]1 e¹+ ¾»cµHK󸔝íûY¾UÎø€lŸ’vFùý3'—Ž'B×ý¶n×°1r~mYÕn|¬¿ÿ Ëëô¹[ï3¿a�¨âågW�ô«YW–×b¡”,f¦¥ó0òîì9<} dzg{N±ß0,ɪÉënÖp*/˜æ"!â�ßxúó›…6åœðj¼˜qœ‚wGimƵMkÜ@Ô^Ì;n~”¶8}ÍÁöLêâL÷"¦OÝrÛÿ$É¿~…1�§ ÃÔHu‘},|dzOÐÉŽ�Ö?¶ã9GÀÄ8P©/Äib�ù•¾Ï(sɨJ�ê­^ÿ³ÇÁq}¶–K�s±³“Ù³]6꺬äx̃+¼~¯ß}ù“’Î~ÊN®Úî´®œUËømcþÕ‰1Pòò»�ÁQp A#qX½öãú´y<÷îœÊü÷ë¾6—Sµ]ç]¹øöÍn¿y{úLzüŠ6Cm£é² «öjŠÿ²¼+×7Ëö½rÛÔ>~u·_÷îíû³Ù»4[KRÂ'zLÕpÝ$÷_Vö§×á´È¥ûùùÛøÿÙgßcù:]#/Ú ÇÏ+¹ìçW3d–^'˜¾‡ç½S‚çá ²i—ÃëHé9£ïÀÀëkO×P‘LOggS@#Lm¨`ºl¨SÿÿÿÖÿÿÿÐÿÿÿ¹ÿÿÿÁÿÿÿמ¨«èš‚àQmX8¬Ê;$¦1ž7¥ÄõtxصÆüyÓàw³/@ n50Ý.Èõ;ÀM�?âë m~ä,€gâ ®?þ¹qìõ½å40¹*Ü�€ç£”~×\ÿᨀ¢:ÿ”‚‚)׃wNŠ� |ºn€$¢ÎòŸäT€á\¸'8Pu}¢yþªH|�sVæåÄG€iàø%¯ÀC¥<èÔŠˆTØz¸ ¨ÀÎ}¯M 6@= ¨•z@*ÔJ=+ôzöãùì4�~0pu×V`Àaà õ*€&ysuësX©5¿F¸ÇœA(ºö¤À÷=tóxÎcœŒ[% Ñ @hxžŠ§  ù2û5Ø7àú.øÊfvœŸ¶ñ“äzõjÕs®9@pÁãT÷‡©;¨ÿšÅäLøT‡lTx‚D.Ñ]O™8s ö™]0³™qÁ›bÖã�º1ñÂ9-=g|N ñ¾‹±r&¦3®#JGþ=«ÛÔòò�ðØÞlßQH[ý,’†6̺þqHXѳ¿´õ{­K´WñÚP–Ñ�,Á¯‡ƒæLß/áÌgÞèã¸ë@òCDÓ"=˜Øã€õ ‡Ž«:·»¦+&Uà{Zóìn>˜f—¡(v¼E9ãÊ4A�ÊÇÄ4ÊW‘÷þXsŒ O. @NžËFNÏÑŒŠóÃÊÑRºëØ—ƒÿÛ\Ÿ¬÷�)]\²—•�^†’Ë\(ÇFr˜Âô6J”2¢Ë"·ú<´‘;eW¿úëÙþü½c+º]ñ#KlÅÕSÆU{Ä)ö÷„r+Pý�­%ƒd„¬]¥%mßÎpYïà…×á¶ñkºÍÈ(¿šš!5m\˜®7û\ùýßoáé‰ÔwÆ^7!¨ð¼rßáSîm/AؼœÉk謮F¸ÁæE|Ò´¥|ý‹Ù×úñnŒ6v)�iï‚§²2Õ„�ÔÑW©¶¸“j â"è+³1„>†G·õ+{šËéßëÖõª¶5õ± ¯9†�—`¿j�?_zåyð ¶�ÇEàÚ2V0˜#óÅB€±B”t{Œ47üèGƒ�5þô`€ÿwðŸu™ÅIæ:ÞÕÇÃóf4vNˬHÓ¶H͹ÜE™ Yì#[u§]0i;y8 VLðFLÈO|öribECd|^ôÅ/ÿ6Ï[¹Ÿkƒ©ã”_}8WåAå÷Ÿ›É¸½ÁTÏÚ‹)?¾¢žÈëà+ƒä�´vdOX2÷°eáý¥šPo@h€ÏÿõTÄãúÓ¼¾p œY¡€×ýÇj†�ÇÀeö€é×kË‚’qöÁJæ“i8–ÈÁMày6¨…‰�|ÎÿYiâö Ð……¼B¹2ËJP†hN­ð UöZÀ ÀC×Úg¹)( à:T¨µ `¯ 0ÒÇýqÿëi]W?ÿ]‘^—¦PqN©@°&.ýý—½ dì‹¡ŸàÅ'ŒÞó‰�0"ô LÏÃó„.º¼öuó'*¢�Kç*Fˆk*>N&²†u¯·RDˆîº}ùK¼5¢sߺø¸� LÞ9ÀÓ­žâæ¤Û¸=]j™vi ¾• xô€=™Ö¤ãÓ¶·±Iáj�lHÜvwî±Ã§­¹îžAMN\Ò§êp9ËòðÕ=ûH1<± Íö�¸49œ“וÓuÓŠF†k­oõ اI°;Îi�]wo±/©6€ èõãZ…Õ �XAH>ndÇbxæ~ž §0ï€âoX@¢ÍõœÕ”˜`°¯wo¸n²”pM›%‹ÄOôº¢Ãa~½Wa9+ ª4²zý,=�a¿Uë˜jÈääè÷âÖÕ�«kØ—M^Ûrgw;”ýß¶ÜÑa «ï“žQWDh d““sù�WAË^% íH•©ñ”º ßÝù×ûöE0m “øÖ£gE¥ÎÙLÄá§6¢6,ÿ%‰U¿t¡Z›˜F— ¿nYõ†D+ÌŠ#³—Ê|ÃdkêáF­ÿ„x«þ�*ε!ÖJ}lN7W±†Ï÷àZÚF×ùu^šFš ×‹P¹xƒùß±íýó×MùøãFs»ßÃeÃ’".çÈ5Óõ5»Š×±Ú“ßZÖ`T´›ÎqríÙ€UFå¬l#X÷h4Æ£Ó]!B‰Æú‹Ÿ|s¾íêdM/`:=uŒ1�°ÝN|4’§fe±ß±Ž/o;£ D® Ã:>ëaX?6Ks°KÕwÛó÷øÚŽEÅÖDIž™°}çÃ/–®H­uyY~ÚDzÙv!Ž5ï§²Š·÷pöcývÖDι"œnŸ{|–¹®�õ!ë,)—ñ2ï§ã²6ï'8Œ‰2•P¿N›·ý¯¾óººê¸å[%Pӽ㓳С¨ÕƒÂžèÉ?Á_ĵacpåo‰‘AúþÃkíq ´!Vo£G™\®òËó¿·¸~½Ú§€›sk¾Sþäã+p^ñ\õ?{Ôþ]þîêyò'û0Pˆn\1µ»Û)À¿@z]–¬ÜA€kûëÿü|p à˜¼û]/ Î 4ß”k}~À‹m(€¨ÊS8ÐBÖœA´RMVw…— u©S›«‡·(³èk%o/d7Ýð €î ßhÍçÝ4twËÞÔZœÛTVH£Üº¿"Pÿš¾*À¡²×®8ˆ¤HÂ�Ïa†Ç¹h¨ÍS*<Õž�ãã7žy¥ 8H‡ 0@öþxö+Ü3]éËë\Ó�>ž(ã{zôP8² ÐBäëŸhz�gîì Eh¸a²Êï¬ü»£`&‘>p @Sb–è{ZHñùPW7‘œà–^»ö nÛ†£E…ä0"è UÑBj†Pë³8¯èÙ—õ@¡é_%ã=HÎÅk»ñT›;læOãâ ¿Þ=Ýõ,“ÍXŠw‘£öþ'3Ö6bú_Ôw<¸xû‰a¾a…|�äI VbãÆë~pùï gu°Ô¡I[r67TßþIt²jZÔÖ4Z~Þ�K4Ê«‡²bŽþ­Z‘à ñ†›@R‰b”ö—›_µa«‹Ÿµx£4'¾¸’òŸÔVÂ#f"G¤å; Iü�¬?ßÿ?g®�V=|(vâ¬M¼‰ÙŠ}ꬤŸ€ÒDè }ÍìÈa0ÝñJëµ`}@ô ›î–kÙïx/Æ£%I�–©´´yXE!�Z¯}ƒ£á¸)¿w%ÅUkº´ZÆîM,GcÎ`¶ë¨zGR»h2Ünt7‰r´Îœý*Äa^5móT(wE:}ÓÕ†s ÿQ�œÔáSíʨĮ¶–i¼ Êx´ºª?Ôî Ç&‘ ÞHª yèLI^±Å‚l/µNaM¯¤æ9 ´ÆÕD?|ý‰^··ùµ]IƒÈ ˜óH€x{•QBÎ]Ú|_v¡çGùôR}Žo1…“1?Ô¥uô¹tcŠãŒú“¾æ€µ[Ìõ5åì×Þû-»ÆŒ½ˆþ¤+FG£óú¶ƒ#Ä@™T›ßñÑÍ&wy.¿cQÓyÝ­^ïoë/çó®YûXQ�"5I4tíažþscfóž ™‘œßh[ü–‚…®ù+«&‡¡ùHûËjœK~5` x~éÛá¯Ì@h;„š12¸’¯� ´¼‰-¦º^¤½¥,+â9ºÀ�Xßn€^6àÁ3W±øôó·ßLHëê–ðù[7˜ò·ÉMxËàæãÆD´?×pÜÞ¡ƒ¿ÿñ¯ý¦´PÉÍ.­yÕþX´p`U¨0¿Íÿ=¿Î£ï÷ y×2ç‚  «ªÒgo7�è¯d~ýQ©Ž\8ÏWm…Ê�h�Ô¨H¥‰ÞÿRk7(¹“ò?êø‹çÇßd<ÛoÒõ�¡òÒëß P w λHu yº£6‡¦JUp ÙPÝúÄxÀˆ4µR¹ œūւA¾6ª‚’ÓÏ_‚ßãP š¬t=~Ö:Ú2ý·ÓÅ6Ëc1?›Ç,£ýìˆA)¤¨@e~sz)ž¢Ï¾;ƒ™~^ZoLëôR“;Ÿ¢Ïj›úV˜ €musy�Þõå�(T ¹‚?$%( <{ZŽ7~§Œ›�h+¿w�E>s¢?˜H(ÿékpãücµûÓc>�/q'éú{}™8ügä"šôµ�”¸OàF4‘TìÌcƒýŒ :üìßkW6ÄåÓÒÇ´ßný¡Dï?ôIm¼…¡êÝýãY6ª‰¿€Ð›Þ­¡a/@¾õÂåc�ó¥ð‚*ý­ëD(›_¨�n"¹u‹é ^o jTÐjJ)­†=`a8T—Y£2;KI'H}²À ¶éo"oÎȸ%/ìî?纮ÛK?*>Ùxswï™çÌ>×Ëèýü¤�oå9?cѤ¾äw9öÈ‘9{fjo©¤Aœ»Æ«V¿ûl¸žrdÒûJÇGÀ"¡¨Íã¿ÆK¨€¨UªÚýAï�Ï�ÃÈì+-ÊÌíÞÙ ”¿¸�ý#›³V×X•‹tœ§z[o­©Õ÷þþ´©#¿‹š„ Xâ.{AÃMöuñ¶Ä«ï�tŸÚÆ2u¯Ñ»¢çUüå}(ûr!ã=O,b³7Viw�Ë6¹Vònæ ,�ùÅhþãît£Ñö»«¼+u?›¿{\Ê C滜9˜t£9'å´æö€~¤,¯®Ñ³ÁòÓ ö�¦!’éÏuÈaäv_,'®ô àS÷£c¥Ô×~Ú%?üM¬•�3X7(rw-ÜÃr�ªSY1ë>¢ÇWüµÝæ+P³î‚íŸ_³ÝWË3±Áâ�µjçæÎcÙâjù¶¬¾¯HWOØ5û‚«ý„]Ee}]U® žè­_©†(EP3™ü�Ü+H†Úd®‡’¬¾õ²ÏZS?¸+;Sð|…÷p�<þzï£nQ¶.€\ÿr«TÐúûŸo }ÿÝ[¦tcú<âÀ´EràñÕšoTê§ÛOÿïÜP•bø@@=æìæšnò¿[ÀÊjQá‹h\ü|y P¹úÿ¿¨õ×ÿ&Œ¨@¨}Icìyøõ*E&Š,�Üÿü¨<î±ø8@PÐòÑãÖKÿB_uú·ÿJ„¹Ø™€vDYãÑŽÏ3P»!¤(ªòúN‡#�òÒuëy6*еv ;µBÏÖé›Z<RÓBínº ÂWè®ÝPôJSénàp:©OVhj—ZÏt€fo œæÉ«V©8t­»P¤"ÕI="4WúñH^¬�ù)öÅãSª€ÖJÀó㹤²Ý’óG!Í?òW¶®f€r  ÈÇ!b^sM‚VÔ [¶¬ð™0޲-¾¸U{nšìëWV)Bh‰½Åô¾_âøO(ègã‘}Q™Ëª÷.õÙZϧ;vzËs\«Íƒ[8ð |înïÛ4.ÿPHmk¢Ú¡…Ã2­¡²Gøp¿<ÛåaòÌ;ˆ�g4Z¹�hÜàìõðïË\öFìñÏíþùcëOÈßé#c<E¼`N6‰Óò´¥Çåœ,:k°s=w ré0½\‹»!ĺ.X2ê#Э ¢@EuçZy¦êóO“¶MÏÉTàݹ²W²ÒÿqŽÑ8Žm�óo ñÄ65+Užâ ÷>´Þá w¦«êWá?ÒÝîb©c�þwcJôù;hÑÑh!éê“Ý9ŒhP'Õû4×Úþ霶��\ UE¯§¹;(°üHçuè9š›YÛ!Ý N2›Ñd2Ž¡ÄFᎾ¾w§©úãÜ0ò{®Eço-®TåÜ•xR3lqÞ_ñ)A¦Çc_ Ï9ªv£Xs²Ë’U¯|ÍšüÈñ¬ü¾QÚ<ý]§¿ƒâ¯U\ébTebîºxóüÐîžF-™J Û[`\«ÚØ×ˆê¤½.™x_n5’1§.ºìr≖¥Õ!®bBÄ®çuÈÆ—&üoF…xér’R ñŸè.Œ¹¸š1˜]ùÝ(÷zÆkå1ûcâ�#z–¶`Š)Å?óìwæÑ}—ìÔîéõN3W/eÙèc¾í[’£æà4½XâE3 )£¬¸ÅG—û©1¾ëƪ°�M�çjÙnª\a=ÜþÞ6Xÿ¼½ª �zÜË@X¨Äãj�D¥ø\€OggS@7Lm¨`ñ.bVÿÿÿÖÿÿÿÑÿÿÿäÿÿÿèÿÿÿ;Ür³7…ÐdÒw’ÏÓÔÔJ.jöÇ{ˆ+!›¸qüö G–1\€ ®ÓÌ:ü²6pc�øðÙã–"äõC ®àu?õ[[kƒÁm¦æ© Å5í2j¨U€ßµôº>Ü%ÀžOÚyöãyõñ_þî$;…:„€£µBUÌ©ùz[ƒê¡©L�Ô�p"  ¬@h¥q„exl2#Í�æGo�æ)Ð¥£€�Ф*@×fúÞñ è‚Ï «4 O']wj¥¨-yu=¨¢EW�wqp`B8çìî>µBã$¢B…ˆ¨õk\ø½àTýkQ˜cÖRÐtÕ�DO �ª)§ìÏ�ÈI@W :ÙŽ$+zŠdAU²:Áá$‰G¦Ó{§Ö8h³‰çà֓Р™Ää�ÐÔdSŠ86‘8%E½))±ä“å;Èô,x�<9`�/âgZ³.½‹™á«Í£ ¨Ÿ}ᯯ R{Ç ÁË[“éÜËz΃”«ÿ[yË€²h˜�MÁŸ&~&à9×íb{÷*m‹û<°‚¤BDÐUœ±Ü–³ËD¬¤;ÖŸØÚv€ÕzäÚ“µ®}ßëŽÈ'7Â]ŽvK�êå_xo4Ý­ë@\ô¦YK°Ýo~Õç)úÙôžÓ9ckѪ´Þ³L³yÿßñþöÒ2ótö0SçøLæRmþ7É,üz½e=˜júC(ôÔÝÃÓ.‡û7š¸íáÂØ @ðGè]Ÿ®¹KÜoYCà7&?Uµ™Q00hΛ0ЪÁl2ç»w°š„býovë–EÅ{ÊáFíÎɘ~¥s\ãtØþ®ê'fï{®©ÛhbÒáõ܉2¹å‡õzsvÙþ¨Óé¶ X/ÊMl°ºÃ“úØôs¹k/º¸k&ßè˜?i-ðrÒŽª×«Yàr §­Š:͵4²‡ÁHσlºÂK«Žuø¯L§Sxãð»t]E鯒Ý_¨ÏϨ¾v™—Þ||"-RÛÙÒ˜™Ðê©Óé@G¯ÞÆz3 ”>ù'PˆÍ¢û°z�™²ãe,FþîØUó½GòÃ�ÅLNü5üpÉüWøWi#önçÞýªòqb™Åìm¯ÒTy9a>~©Ý¿G¯L˜œAW½¯“§y@»_$"F“®®vw‹¨LÈ^cZUå8Ü¿Ûú$& Á956dsø?‹þ�¶câUÇjZšcr˜O¿ûq}M§w{òÅš,;—¹zfY=ÊDL8~/cðbZ‚�)Ø÷¨ë©mMW$ý¢DR½{tœÖ(>9\•?Më�[%A“Lß©|šž" µáxúÿ¦YéœËhÉÖOpƒÏN@\§„ó_ž&¤³O oiÍ%ì?}µönˆ°¥Ÿø¢ä�'ûC ’>û¶èÞ�ʧ[Æò“óŠªRþ" ÂÝ�Íuªýã 0_t^_Î!¶?ýÓG¥J£zŽ7Àþ|�è?n€ à8B£'‚õìïǧgr´öc}kÄTQ¨áŧ’Yí¿B#¨D*¡k|ãH±ˆì)@t©€Åw—Ï–,*BRÀõ©£’ |pt•î*’Ô¢‹ GfÕTÈUÏ©—tû¹í�b¦i²8ƒ*�Ç¡•J�’™,u}ýÜ[t„®�d„“µ8º•®³$RÔPíEÝóÚÅ)È�É%ÉNj,ã!{|[U™ñ^ñẏ.:²5©Sì§Ç>j¼?ºGÑ´ìâé‘}�˜FF ÷p$#™Î@·< IUáN,ÅáùK2;Ëøu;’ƒì"nþ}SÇ„u¨¹c÷ºþrÅØæF¦ª€½[ðþgÍÖ�}ì– rlÑÛ?xv]ðÀO†ø²Î”ºJgOûŠK”ñÏÞ3ôöÊæÕÁa|¾bo9Ž1RØŽŠ^(d,¾þ§È1[÷:0+7Üijè�“ ÒhzBqê"÷qö­�kºÅcj½‹–˜nðéãÒM)ú†òa‚º®/™†·VA§9»ÆP+¿*B¡”™Í%ÚÛ®V½U#£Ïþã{Ï9R*ÎDóÖðø{ZŒÒ¥Rå¸"žbÃù5ɈOfµ'Qúâ/hˆc%Y¹åƒ~Ë�¼\wUPLX>5¶¹Q säýJ¥ {@îßÁħ ØÌ«æ*åh4Eãà—S�|ÈzT~L}êNÀ[*!œùþ·ù¦~ü�_Ê>sù'b¾“ágÒ½œË¹—‰ÕôÔ$/¸Þ%JÓîÓ´€WÏ{VâÞ&£=¿Ånµµñøs„*Y“oŠÿùß6ùºU$pîI¯ üÄÇŒit>WCÓ|ÄKÚü¥­}öÜ\Íž[î%%_‡vŘÜ&¡÷íƒI…ñC͹ §Å2æ_ò¡3o’*l»a.þí­Ø‡� )õßž�ø™HqM_ÜÁÝ®GòIAY\~LWùžÚV±ø…ÔÉ>êÑtµôÜÿ"ØýŒÉ‘¦­¼6×Å&€'µ½RÝØ‹å�sý7xC€}�¨Ä‹æ»©58‚^¶ç“?þ ô8.¿Xã©Î”Çs%™Þ9<ˆÿ`®$ÿ¡I¨ïΧið_�´Vr…Yäñ=ð†iTuJiŽ�þÈ�÷ùÆ p Ÿ¬67‰³ ˜Þý›óâÇ7-]åi&Ä=­3úØôåQAÖŽªq—ƒ?æ†àú êhö£âåÿxܲ±Ðæ¿H×oæÇб� jÖ_þüESƒ[î�?îÚ©TºŠ:DWè5ëÉ®¤[•·T–ßZš–cÁôÛa‹C^Y§Bì·ˆšmk¾{fÈZ]5�!µmñ2×)”GŽIšÎ8$%P*úÄSU/aq£›HopãoG´èuªõT*±¨d.ÐKáv­÷þ¼–ƒÑÊ!Öq™aýçf¼<>ºÝž:RIͪ•¡¢N×Ð!ú”£”жPµ÷ˆ—å¥�ަT:�v÷%#RB*‹g}ï�ëüG¤ªcq 4ªÒPéÂ|ÈQ¿ž^ù)qŒPÝt5m{<�Ј~ƒH²ÊIIF«Éð`Ä«Sõñ«Î}rk0Æ»Úoxƒ'=پȿ¦îÒŠºÅåmËWiUžfß `<ÕŸõÅÛþÕ¾([¯ßê®�Ø<ïë¹´üųë\¡þƒÇRçÝ”$Ù”Mœ´Sã ™\[Ý»�—çò�OÆÖOn¼äÝ÷·ªi0 Ðhå±ù‚5Sö.Èþ9ÜÂÍÁûÏDùM2}§ú“Vø�Úá b­Y[9 Mo¹ž»¶âŸ³ Hý¯™4ÞáJl‡Ä,Ûê¨Cný÷½�zÑnxQ.?":"¿G§¡õ‡F¾\ûW'!ÑÊ÷*dž5ú[óÿ˜+8¡—~Ýä?Pªclÿg hüTUwÀi¨³þìÞrbð�ÏŠÐ5UŠ*ÈÜ5[â9ïB�®Žò2ŸšIm¤ÊžYÉÊ× rN-TŽìfªAl7¬?Ÿ?{æB—ˆ’îZJ¨fYº;U÷¯O�?ªpoè&%ç.;ÞM1Â+Y•ZM9œIU­Ž!¬ ¼ƒ©ˆ»‚T`÷”C¥j¢µòh]âÐ*¹ïP•WGE¯™$4 •"ár—–¿¬Å„¨yÊ<Û�yÈæå1fQ˱?‘�ƒ¸'Æ¡ZªÏs‹ãÈcGî–"¢º¡‹@žLG£YˆˆH "�ÚEÄÇ)1yP¥+M2☾ a#W_À Cáä‰ÝÒ½£ÅÖôþÒú³7Ä…ß”o#MS3]—´“ �ÕöL}n¨ÆÛ±WL8C¾ hé}µî$øê_Õj7·¿NfrÕÞuét¯32ŠG1“e²æ)d÷ó#èÛÒó-òç5ÿƒÃRœ:š¦÷ ÎÇÝ{[éY‹Áµ^;¿ýqYk¸²2ùÓw®϶q<-¥2¢üÊ¥&Ž‚í.Îw§B·¿ñ�‘‰¼;ÎúSÙ�ä„Ë­ù�oáÛ>ÁlÞ;´^¥}?cÙ˜¯ÐÎŹªðVÔ®ï*$¡F¿?Ö��[«CsÔ¡�ö qmXbg$P¡þŽ÷»nü ±oU™ͼÖSa-¸a;ýÏyy¯ “¹ó•°%? ™Tæ£ÒôÙQ=�±Éâü´ÅV˜»¤gÝ�6Ee�ö<ßWDg¶þ8Ü´ZdÓk þ¾—<‰Os ²ØJ}{ºÃÌ0Ž�r‰[¾à õŸèóã#ãG›Ž?õ³jÁËwÉyHðï«:ª„QáqŸ C/ú˜½�8‘rýÛjrù�ë)Ùæ“¿æÑ·>¡‘& yÐ kÕQ¯3ÁÜ6]ül4#dÛ s)¹Íìcù…ßèÝ÷ÞÈŸLÀ)ËYcIdßïÍ“„w¼¦qý°«ÅZoŽt�þéïóè;Âv¾$!]\‹qs{êßµabM«{°oä#z/o²>p͇iëWÀZ “—×mc‚F¶?E¯²öf(“ÆmÞž^Ù+µÔ~ÓÉ©twqÊæÂ9Œ­¿@÷ѽ˜­PI½(f]ÅÈÈ ¾9œù¯Ä!h¹j&¡¾¼ãK™˜?‚°›ø@oK\ÃSºúÿh#»L͇ï/ uKQêÔçõO$"¤'Ÿhö¯ÊëÈèŸ~Im 5$Â{f¢÷¿ÅséÝÈq4¨ùx)Pdò—s¢|©³DÄ¥0W’ëô/*Dlö^ݰ¶T uóB(_—©6™ÿ_né)HP«¤ë�êv-Ïý ©±Ñ×�«“�Óv4µíÔ”—:߯šü{¡=¼ãÕ\n•)B(¨3~_çëRI>¿J~þ©üt�Ýÿ•ð¬ëgVÐ"¥Qí )pï8¹ÏСe^!Ã#PUÎ7Ìxõ…æ¥ x>ãòãë$µ"¼Ý·¼#gFk;êAü|$€"d-ÓP‚Tç‘y/ª(€J¨pig@‚'©5RˆB¯¨'Ÿ¢ŸQDÑnÑ×á0âžFʇ>ó³: òÖFUó>»›UÄÄ ²û!‘«%2»Ù¥>/Ê ªÀH’H@*yH9x.Ke|¯›ŸãUZ‹G1°ÈõtÌï-vMiÜ0·å{Á»ú$íºdÓZì1–ïýAt?:Ä×MW&çÇgsz=ú†/¤þß%½ÃU§{CL~K›âYûXœ�|Ö|ÅK£a,ñƒQ?ÿfÁðloõ™WÚ½†�“Œ¶vÑØ¥µâü]{Y š~oHÎ=ɯªãI2Zõ…¹IQ^­"ŒÇJ_ç´ÿEã™(ò³L¬úqñ a§ˆn]ß^Ñ.-.v§ÆÛ®ÎeP£ô—M0¦nšýÌói¤©ÛÞV›op9@‰x�Uc›õl(çjãT¡¬5Œ“%ÃÒcÿ­SNÆÝÔ4ýæïñO~Þž¶µ£‡“\¾5¤uÔ'RYÂ}'Ÿ»ÛðÿŠ�âd<©ÓáÀ'´FoÔ‚ë}xåÊ6�¶3p½”; +-`ç¯ks>&yå2ã¬+¶O@*¤ÓÙÙó÷éêÎøÑùrr£ÍÜâöÌ‹’2g­fïM_'cOV^¾++òµú÷{2Û‚ÙÙå]¤uãó:?Žw’¸};�è.ü¯L4בaP2þÝím@Í+ã¸ïw?"Ê 4�>¦ùø“F…‰wu¦þà2‹ÄøeJ"V<£ã ÔºWL3\ƒ¿áä´XÆb»èw¹ye�+kÒï?ooÈ馔Ûð½8 Ý,®ÄUf|ºž3ç8<ß“�½u|ïî>t}G)"ÿ„EG°y´L¯À¾ié%æñXq8ðuš�ÔK”žÖæp8;ˆÇPÀú6 OggS@KLm¨` ?H ÿÿÿßÿÿÿÈÿÿÿªÿÿÿ§ÿÿÿ©^9\•�0 äùŸµVúÛ‚Ï0ð»‰7ðfì=ë=e¶«}f°;ùaF]~%ï E}~�žÈ?<óIøÈ­_Ü| y>£Å×íÍó‡<˜÷å8‘BäíÏ4Ûó_8ärüÇCòÚ¤§(¦‚d8Û6«èº©ì€:®vS-øèï쨓׷k:2©â5øóYhñùÛ{G¢€D6*rR�b0Н�CôœRé¯/A§»G´NÖÖ4ýÃðK©­'ý :äóç¬)âÈwõ(QmÈ@¸Ð $�šñ½¨ã…뻦0l®Œîþ©“îW¦(Э@çð:%‘€ ÀB®ŒÏ hÝ0Y8^�¢D:N’_eM€ ’(Ó·µ+‘€"ñ‘ÇKR)(p´ßsBF'AqX'M7c;œîh¡à E@9H€ Øô=NŽG™œ"ôÒ>(G9øÁ·þi D•™m@qÈ$U‚L`)¦¸ªÃ®+,ð™æ}üo¶íI´k›ÙÍ:dÁ5É…­‰ý5Ÿ[ÐÜE,莣0y×US(!´Ÿ0z2¿›g';¨o [fÔC¯¶·™òÜÏ݉‘ ËþŠ2‰ø iP,#p­e®ŠËo«qú¹À¤G«móH`œÀßüMS /tÎwË#„bïcô>Mï\¢J릃DÇÞIï³óq=w2¿Qš7üŸ_‡GùñW¸<©]Sʉ܇८§THâ�ë…¬¹°§ÔñO‹=®[Ü·34 EÂã}h� —³­ƒÄwùáÒ™¸ ù¶à™ö-Èà#3Þîbb­ß_Åöz.~%êß|j§_ê•®ž$Óòç–/£ìâ‹ú¦øPôû”ÒÖḖ§õ¹&“MíÀðG¾þáíÑùû߀ßjSžðuÜ•O‹¥Öü(ÖŽ~nÉû{ý~lc{Õ#{™N¹d‰Þ×™ƒê’ý/ב±¥ }²é矖ÿâ§3Wí’.–!DÔ›xAf ýà¥;³mø� ÿ¹“ï©“uºEZËvꯦŸýÉîÈ9?ƒÌ„y~´.X` ÷ÇRvù‚~b„[âÍ®*ZÛߦÙöŠ3mò mµùvÎï´¯¿Ú(žTÔàî¤åûöÿ™…õLøX/ý½ÝðÑjú�1¯-r:W™!I½Zö7žzèYÅPéÖâïàg¿ çënï‰ìp†7+ê}ò1ùën^¿¡¼9¿vœë�V)I%Rçi²òCü‹¤\E_ÿÌB%ûßvzûíܯ<@�†x îè£ÁQÀ/[KjZg³! ^IìÜw;w¦h¸ÓB•I¦p·~¥Ú?œk%[`ÀþYÜÖßn–¥þs|.ëí�N¸™«møþÒíyF EÑ5Ro¿úÛM`"ZÕ_5r/ vôÛ[½}‘†Ïo­ÄÜo:Pÿ£:1ëm™Ä|¶ˆP~xBjwÑó÷Çýi%@yûÏ€<þ¬S ð¿¾Wi­Ý¸jÎÀ�×ò,´éåƒ�'РS÷†ÚD� jh|­RÉ5x»ùþ²ÅíØ‡Œèfæc_z8Ä—/–’,Ø qh¥«V¦óËX¾ŠféM¥.ѧºÇþöpÆÍû3a‰3 «¬ˆ£Ä�œpj8N‰»åp0/÷³XøùH TW�IZ� Ðf}˜Õñ¬ùÈ8?¥ÛàŠn©D�<ç×Ð'4ØÏ«[khP<•«;­‘8kǵf†“!ð…’3ÂN�IDt/ 4¤jNôS/’ýï’ðꃈL"9û'G¸Š*d Pµ–Äæ ÔNéþ®ƒý­õ¢ÇþúœŽÁú¾VÒÛó C&À Êž/�[·{Ì7t8dµÿÚX;ÉPt¨½zW¬0¶fPnÐM~¥Yg{<·�zíµ“Ø¼&.Íoq“•y¼ßÿ¾öÁÙwoÌ÷Ž_]¤„}õ…gnP+tâÒÛ3!_ˆÑ@a1*±ãΦó9:Ò¹ÃÏ4žsUN•eä¼Àµ|¾L8óHöáìÜÄ�òhPOäáÇ>î¹°±ÿ$1+ÿ^nWƒ´ PJI{½Òoÿ·U{r•7“ÚÞڦ˽‘¼J›^&Iæ5ý î™ÒtÀ�·Ì AýUäBÍë¯×캘™®‡®¹Ic¢šÍvŽ^Øò¸+¿ÌS<+ƒ[qOµN~]t½õÍõÌé üçd•>/±Þi ¬Yæ–{1{Ÿ9•P‡ªMWÏG}yÓþ“Aûk�XŸo{ê4hú»Ž¾·Þðµ3¤M)¥·ñ+'+ñ8‹)²ŠÁÇm¼’I»ªúAµ\¿_ŸÎq‚±b×r®µäÅ7Æ Vã ×8Ñ‹…ƒb0JZó85‚x·ñÍ0A%yF]ôôPìÝt"Æ7^�0›0¤BO§d @¶Ð�ù,•ºýý¤gV«tª7¢G«´ê¿�Ô߯ª×…úxØZ_}Únq¶ñ±e�µýÙ‚ïD¹e²Ø^ Ͻ3š‘õ-ò¤)^]íé:Á/¯W�U+ZÕÞR $Eû)@ÈHöÇñˆìû—á¥-\F´žÉá4H;°‰½‚žÁn~iœÕ¿™;B17)%ÞÑOš€PÓ¡ñ ·f/·CòM›mäf“Ðò㞃Xn’öŸtͪqéÿo¦§†¯÷ 5u»~úñ6NÀÑÒ×ùEc&‘µÿX³àŒ;κü°QŽ_%t ÈœpÂöæÿ=•ª=èϦJ%þÒòÝ)F*tÑZÕ…F�þÿ£¢N�ïç·— ÀžÙ õŠùà¯qgÌOuW£VGN•ª·¢%D4©ÚÎ’ž�çÿúÁôó¹_¡P!º£ò 5+¸óP;UH£Š#'टUâ¶[v«( (ï¥_BQ @K75 �|>ô± ±»û„�Bº+€HNâÖIßéêÏ"úË{í( ÝC!*µƒ5 _ûRSf�Ìk¥©èZ—zñrOEA² ¥¸ú7ÝCwÓÈÉÚ‘%=- Çþèlí&„¿ <}øL���”€Î.sõ“'¡&¯[r¨½OÌð»½FCzƼ«s £‡i¨|„¢%*)¥QôXòÜt‚±;ÿ sŒRç^EaFCù·9W\iœÖ+0cÐŒü›JÌÏ8×–ÑQ”õlðÇ>ùVœÌ}÷BõaLõ÷bÕ•×é^>yŒN sݬò*åÁ!%$zn³ôoÈÙ!'¾!O.)?ËwúÀïT¸•¹'îzz6(«wdGS㼽͕¼@ ‚S×Û¹Èæ~ñó#û)§âZâZöãÝ[7»X.ÿ�‡šë=“ªaíl´Ó‰¯ìã(ª¿Ø;’K0½÷?§¹Cìë¦ÊÖk5ÏÄC=w&\^W)‰×| “�‡0¯YÚµ¸&­þ½ lÏÞ«üÙeÜ›j‚Í?ÿ}¯ï–ÁÙñïû»uG‹‚ëà➊��sþG«ƒùzKˆ¥_.^ýl,fµ?¯Úö§ùÁ=7ùOÒ¥Z¸Ï\€õ¡öD–¤S ¸Râ`†û¥§%€*™ÚôúþçsJ¤3HÒb칋¸wPœír—²úe¼Æ HŸ®u»¨dëbT™ÎˆŒ=L•²tóv9qÄG|¥k@±»$Inn·}"÷èì ;��7Ýë[ÑÕ�Úg9°µ³…Ø�ܾ†¢æEð#ÚÛüþò>dYØ&m»5™îôÒ�ò«ÿ}dDÞé[iË¿í¡½VÃsç.>¼œŠ_BùÜ„œÌO^j¼‚߉ ¡š˜›„¯Ü¯Ð A“+ÄÎì†MzÓ×1DgtÍÿ_*Õÿ&�°>ß«†ñßö"éGïnÀ$ý¹2»Æã”-ÿj[îù\ÕqtãIÆ�TèŸ÷)�ü¿<¨é|äRC¬{:„±‹ÈÃ¥ÙúåMê£�cœƒNŤþº¶ ø ª«H>ó¶§N÷üö:˜Ï¨‡0ãwuÈe¾¾þ3^‡èu�3óUe]B¤Â‚¤È¨áaªùKìѵ“riq°ò€ü>㇒ç²|;±¦¨"Йç'èŽVaÖÎt”|Ÿ�²¨JrÒy´:8JV­á¦Ždq9“ç |ó’�ÌM™±]=)¨ Ÿ{+Y‰Ç©;�8Nf7ÐKÏj=}ŒßÉÖcŽÃ÷ qj¯xK&Ž*� á®A�“G=~JÆThM^sØkÑ @è“Æ¦JJŒÄ�¹�D€H4õÇÐx§å 3G5sì¬\øäôžüÉußb‡J¾=úŽ›¨A£…!£g1nqtY¹º¹eQR±ÉÔ×7æ¾»ó½d²o…çU_ïb…‰“d3Èÿ‹A’ïŒOoðUƒpoX‡�éæ÷3¸¦< æÛ/Š—l³÷Û·yøY#S#ßöâ¯4¼³¹™•³©ìÁêÕHýµsª—¾ÎìYrßm’‘“¼Œì‹„ŒÁ[jí•m_�=O}P¤Ã§ß®™èyÌ>—L-¸ÂVþõogÖ~b|›£•tòl¨ü�ÇÿXÁ«¨XƒÌûPóÚìÞ5Å�œƒvWjÄ�ßC^ìE¿6%½’ íì·^Ý¡8<Ï õqbŽ�e†Û�!ë{Áç�íëS€‘zípœr¡æÎäÖ¬þŒ¹Ò!Ù¶Ç×�ÔXlŽéµÊÏŠÏ¥_Ò© +1¤ö­Ï»Õ× ,_ýRËU7¦mÌ߯÷øû*u�\Þz¹ÜÉoÃiŸ„€e5Kàâ605кsOÿÉ—°Åèìþ¯7ˆw‹a6åÿŽióŸä’ß8 ­ÿ.Öã”ø¾–¯ÉÇsÍþ9kAZ²]¹Üx¶<íüª›}h¿'Þ:¡  o¼NcB´hUJHâßêÔáˆñMé®§ùd»­šh,mqxælâ•Ll-%xÇ3(îý·PÙ©@�+Rÿ%�|Õz$9ÖÂyÒçN¥çC2e¯ äV»½á²i3îÕ||²°.¯M�$À£ z¼¢Í�þþC“MâÖúÑ~(„&WÈ=µ™2ºÛq×h.ãhÝJ0‰ü¢ISaX˜È¤=z~3¡&òàsÍÑ ÞiµÒ_lOoÚ �¸nøò²}ÿÜ%LÙ®¾«·;öq€ûÃÌÖ&òBÄþ/6~Œ�;ˆ´£õK/Uµÿ%�П§ê#4Õ q]%‰�u¿H!‘ÜŸÏ�*dA7h…Ò! ôú¹19íÖÕcF©Å½›XÂ�"Df}ŒoƒÁi©¹:µög7f &¢éêÈÒ‰M²8ä…Žb.Ú9¢Åaíþ¯]‰�ŠD¿ÐÐêh×êÝ$îâFT¤z5Ó8ÑAAÌéd­!©Wÿ¶¸µydüýiøÐÆý2ï—šÄüØ�¿ óø˜,Üä¼î^5�;KG;¹¨ŠRg7×Ô *®ê}\YüÍy��gÂrátæxGGÙ3®úÁÞ¿uke–éã+¬©±¸ÂJ;iãÓ¶UÝžÁEôMP£Ì½«ðó«©!÷“•»È½oêì´')0Þ›—Š®/¸±†®ÉæwñâËø¦~»ÕצÖÀ™¡è×¼[¬ˆX;Z0}ù£äFú�6ê¨Dí~¼/¶Ë’éßó�¼§NX%fx¨s—ZjéÓ×ÝO·ülû®·^½ û½z½‘šØ<^œŒ½g¤½bzÚ“[™[N†Ç‡÷IXRãê*.9óÔ¾¦�ýråË…Ù�ÃM3¼a]Ø–¡_ÏÎÛý‰ÃµPûÅ]?°¥ï÷!ªž϶$4< Ej8Ùk2ëW/©0(üƒš’+l±Ó)"ú¾é…Æ’->cnƒœ¦?àòçÿÿ�jߨ_ï-àìüøà}5ä‡ÿ‘¿Ø ªôñcàêG4ÞuP—¿¾wÕÆó‘貊ŽSÔÙj›åwóëÝ)k€HoŒKju”‚ßj¡ïvŒ#t:àµD%î‡+@2ÝþGŸPQ:æÑ P)ä”ÖòóñÖ$ "2Ô¾zÚk)]µa† ÷ù|FÝ_7'áÉK}´êÙeã³³{%½A‚ÄáK“Nš +÷økéùd�‡€Ó] 2‘Õòüc¶ü(ž…ÿ¨Oé…5nÇ<“SøïWý!§z’¦Y|Õ¿¬5CŽy¥Ÿúµìœƒ®]‘ÒñصÒ)D~~~R…¢V'vIñ–hI*Ù¹ ŸGj8%©¢IWIsï”HGç˜ÜD?�:Kž„N8ReYéZ9{…S ™Ù’±¿&Ÿì[ç”\‡V}fü>i0ÈQå0Rªª I 'Ð-zg9’8™k6§J‚ì¡ý�¨ÂHSd4ùlø$%'Üqµº.¹#OŒ9æ’üÕP|-àEV�}ü„æ& 1Žü]ÄèÒ9?zk’$ì©þg2r|ܸ«†OS<,å]Ú`�~FÖSÕ¯žå#ü× V4Ó‡ÛûÞMÜÿ†éÐÖY‹92éüU%ˆÒ•EƒöºEóîË•5rª*ï�ÖfÖ6¢îë|Å—P¯Õ�@¬}o¬~X‹-w~„‰>N„õ™½èû*~ÿÙD%Óælp•ŽÙóÇOÄ¢-…¦ë )"»zs‰ŠÚ‡×ßžÌ{s™g[Ö¯fõ¿–Y|ãôÝÔ¢¿¹òÏÊÛ„Ì.f‹F¹÷v�©y-úºšÿž…•Ýèu—ºc÷ËCVOô¾ŠÇö8™Úô·¥ìirM4s˜Äµbú¹×±êw¨þW‚"Weán ~¿-t1zy ïç^`ö°ÍmíÉ~ö�Ð Ý»�›Éê"Y?ªy+Ÿ°Ýǰ‹ýbTlöDì?óþXÂJCÖÂ�ãÍ ¾øE°X˜ ËaßtñÖœâÛÝXü9Oþ‘¢ªý‹o%”¡Q!Óð�]Ø›¹ÍÕB4Øinº·wÅГ}ï'F )WCÌ1İeMaŸŽ£Ê3õYè®Ê\ýþK�jLãkÉøÕ?×@îú¹U =ñ�½2‚àÁwIò*½?Ò⛓u!vQóêêöÚoNâ©V!Zoë2DÝ<”…u^ý­�òx4g§íÀußöB•áž³ørG6iׂÚé½3~ög«†k»;qß±<óÙö~Ô9.ï(OóãŸ)¥„~ΚKôýí•_§¢û1Kƒ8äÇr«ŒŸ¬OÕùÁ1P.°@€ÔÄq””C=­2—l2o¿·irÞÉ4j²Td�ã·‹ùzô|-mvÈ (y) ™IžL*<á˜j¿¥Qüƒšbéð~ƒÐðjŠ[@Ä ¹WŸ:vöþK ©ã8qðm-é�fauØ÷nQÓ‘×Ä£GpìØ¡*L×m2ô?®ïm]¢=•¶£†÷É÷ÿ4Ô[¼þ³-Ú¨ µé¯cž^rZ~P}Üd©P§E ‘¦ ¼¾¦„³;Ê Ýw­ý# ä~¦9Q�ÌŠpT9Œktj¾ÈJÄSbejGõž2»Rq¤i­G(8’’ yüËã¿ÃüýšûáË’¯U¥C¤NS�µ�‚$RÐs?4zôѹ‡£•ŠS‘÷�f~B†§NKD¡‡Òè¶ÞE£Þ3\ÑbÏ$r]êƒî ¡‡�Ýĵ°Ç�F᪕³Ñ€½ˆDZD¿C2 ‰Ì4§ ½Š�5•ó´ˆÛ©@=fB»ä³åú­K}SÿÌáñ§�ZáH„š�µ*14„rœŒ–:!‡-ÊöÈÃ߈oéL\zCÖT"¤AÔ ã†EIy®Ò¸(�-èuÃò{Swg8÷;üÙùSÓ0ÒòÙßÑŸpÜQÈÆv¿¬+o:?I§*ÚÞµyÍý9ïùs7·ËšqhWæÜBá LÝhÙeH�œ…Ìá^úŠaÜÅ�7œ~³®¹Ðù"¼%˜\š,–½黃Æöã“î´±j‰]¸å£O]EÆæ²86t¸WÉ®òÔƒìï �§KÉïûK…ð­ìîàd–èõ³èQ^;¯x=0\óäePÛâ‰à”Lô?¯uÁob��pœGê ;R¾ü?ì¿§¨ãª¥=ǵ\ÿëÙ[R ÀÜ?jsíö–�êá³£‡3 ÷<Þ_üÝê‰hö‰ÕÆÍ/¯M¬ÿª.DË~…0� ½f<ÙD4£UWOkQ'o,œ7å]òíM›�¦ß½óxªõ¦;dâŠÊª|ˆa÷üYîÕ{”óëuÖËyòñØWofí×=úþùÊüÉñQuÙõ" óµêþ3äW�xml†µñÿ‡/N®ÄQLbÃ[5»·^‹­ñ0õV£ïnå ¿ìн2Üý:êOëüñnyIêRôëü¸U!Q&çÓ¬¢Œ;Š?—cG—á# *ÈÊŸˆŸŒ_�σ³‚çÓ7@káNßhŸ>W�¶“]�¿«_®æ³„j·¶ö:Û¢s¹¹»îH®(ÎßË56�0ï;oÃû_EíE3º'Œeü²8ùts <)ž»ë‘m¿;p§Ì>Ç{�¤g¶h¾‘¦µSä–í¬-ùm‚%4Õû«É5{¡ž&Þ9\‰¿Ñ‘kHZš|Wî'½!Øûµ’+èì5¸ÍƒñB‡Sg<ÐçÊÖ@CC¤ß.«:þân×’Öú•Xkˆ/ÉÔ8"�J‡"®1þ/í€Îr•ÝéDÝû¿Ér_&'$Ÿ'‘ÚMͬNSPd¾ÅŽâ”/E]3;Ó¡HüÑ|©J‹Tõ²_x Ò)-&NôCT�ÐJmœåZ€ˆPJG©‡®HQ_œŠÇrr»œ�S9ª�IÄ<¿üØã—*»¹�¸?ÕýœŸ«fçê½Îpœ6£k­qöõóÈt h¡[Š)HR«+óMÇ}¼d‰Üî÷ÛÜ;ªfÖ’äÝ)º›•˜¿9ú?ûÀ'â~èç£Sæž }G¨ï@kÑR žB=I˜šz@GqR˜s�åî†{™Ã3þàq�|V!‘(Q]!“ÈB 9qÈü캓H¯2ñ¹¹¥&WÝùåŸ~¦Ÿ-.DSÜ1ÄÍÇÏìxJ5D¨«º¯I @Q$÷d’Q Ÿö²ÝøÒe‚�³ï<’°©J·ñæš±>ZÒ«?cKÚŽ ÅîÅ·ðq²Û³™ßE(͵â õ†9ÙÍ­òç$ß)CG¾äföõPAò«_…ä‰�ª¼òìì5ì›U†gæ?š[Ò`w^Ðw=�Ÿ Ò+þ¼f²b®²'xh_ÙÞ›SL!uèÞß:_õSýÛÚ›á½_ü¾]eødëµÕí¾ÿ_Ü˽™n¨ßuæ\5nì<.tÎå€×yÓX¶I,ÇSÞx¯Öl¥AÆÒ�8Z—–ÒŸlßú'ñ4$.�kvO5�Õúø¼ÿMÛ£\ã'¡ üÕ‹äÌ�—¼v‚²N§.Æþ»nr�³æy̵žìCÚ{Ç5_….NúOï¥øtª��ñäUû­Wâ· 3„ˆ/G(õg~ó›=}�D®mÊüˆº '{þ=yá;E[VE{*·Ë ”»õF™tz£#kþmßö:³½ø jö=‹{mï¹y½—„¥w5Û�½¨ø÷å Þ¼•pO|“ý[ì2îßA„I0¹í¼ëŠ#ÝÖ™÷Oq¢ðÛ4ÄzÕþœ9øÐ°Y•->ÏâqC° hUBáÿ©ãI}_nÄÛasÚšr A|önmò«±ÆƒjÒ½æƒætÑ(Ëï¸rhâ8®áŸÈ'Î%¶ÞfÛíÊ_ÄKÙ¤×Òõê@$í7Ìñ ³ôÓþòožx7ÐN B?µ”CÏØQpʬ¾¨FfEºãù©Ê €ÙOggS@sLm¨`‹n €ÿÿÿÚÿÿÿÍÿÿÿÈÿÿÿÔÿÿÿƾ9\•_M›MÓMT�lwî;ówmä!sÌ‚s¹uƒ±ž—ãéžÂð`äH�¾èŸëÀÕºùSpÿÒÇçS†ƒ}ˆöõz  å7]˜å·r~ê@ë_ÝxátUê„(—?Ê´W)€aþJÄcRÅéÔŠ,TØgI’ýÏ�ü5�Ѩ=W}yI¤’ÈËþB¥£Š„âäYq©Lä)Ö–ªkV­­CòòEzQvgÿ'Ì}òg@Q8 Œ•Àq‚8àeýø_æH¹+pùü ¡ "G‚ÎÏn:�€ü~L£ÐÊ-žO )3°ª’8ŠªU{';û+$AÍqÀaÖ‚®Ž¢Z¥_ÞÚÒxh#oÍêàÕ$“”oÕBžzt´ºíˆ ° h÷Ù�tº‹£Ý£jåzœÐ� „üèOѳ#ºÔ'ú÷°ýø4J ½ÿ>–Ñç>¿nΡ�pdWU�"ë‰ØŠyPà– PžTUv€X•P€SÀäüÒ07מ|ž/R kr¤oÓŠ³M÷¤Í(­>Z³¨™M¥~ ënµàwÆW°>´€aÌNrÊ_9×{¯yUaxËêc"Ñ1GG­8t ¾[û2)܆#©_˜ ŽèZ½ØWáü“ ˜ç«> Ÿ÷Ç·åbdÛýuÊ“¨æBØ­a)Ð�¸Ç›ž’ŒOvmö“/–«ñ‚þ×ÿDÜ|?Ÿa%UZeï\«Í‰%³éÞP¨zxD1>ã|¨±õCÿhS$àÌäSÏ·¿Ã¬ÎØÓá‡Ã’¦ëÁõ8X¯ -/©Ó´Éhùÿ¾ ‹Þž˜¹p‘NVÿn/›6Ǫ®ï ¾]VÞñ»\ôÔ…3Gp¬ÚuÔ1‘qb‚Ãnoíx‡åÛ4ÿ§Ò¿®)í+m„›¨�{ ·°ì™�À±dm¸a6çø}L€)«ÄË!ð6dÎt¯vÇcƶËËO€äýç’Ÿ±‚r×uŠ-¿þó ¤'õ}½¯N/ºÂ÷ZsÀ{ZŽ�¹Í{Üøa±~¡÷¥Öû Ãâ¡Óµd—ÞN’ŸÈ3×g9¼7å{€ÜŠÿi†fÚ[ ‡dþ!¬"Ñb¤ck5$e÷3ùu¾>.ªõ67‘ÛœfÛ.Ù}ùÎd÷d÷\6Ÿc±ŸÍç"û«„™ä Þ9Üù¿muHRCÐäSxå~B@À?¨•<°ÒÃé�éoš>å¥> DÝ\ ­7 áñ‹ÛÛMü¾_A??]íüƒšì5¬mé{Gö„ŽA‘ë¢ùáÖ$£ºÕ¼ÕRÿ@dåõGsiæ U$mò ªð Ü�<ȵþíR¬gH0¹3µÈþç~8‰RtUE_FÔ„zh¬?Ç €‚®ƒJ­u®Im¾ÎÚC¥*‚–M*�»ö¬û ž£Ð‹Tîö\J\¼\2Gý÷”ŸF¦¹:‘HíçGw‰jÅy }”™I¡Y…™¦Ò+¡­Ô9(qb2ñ{˜£¹ýFä¡_>ò3ò«ûí׬ÐÈ Ly‹&Í!Š©É žÚ5Q]î»ìTa&ÉER•ù[¡;”ž;´žA¦†FhOÞ‘B"™j]s—Í9ÝHÌðŸOÙyDjËÊL;¢3¨û[fõü/GïîÜI*2e„ hÝë _Û]²âkÄhdwT}tÝoŠ^ H†iP�¶Yyä{÷yHEF¼% nž³ÂÄä/}ƒg6r‘ÿ *É¿æg|ö‚» rQ¶åÍ.“¹ml $ÅÍÁ9µZ^’€÷To‡¾S_ƽ¹<‰Z‡�µ:›ÃÎðua"c€¡Ê¡LùÙ¶Ìènjõùrì±óÚ4×i?×xŒjÒÇë–V8,ýãwà�>×IüÞïÏÌŸ@°*½drBÄO33ÂÍsü ‡-'BªðÍN+òþ›Z–;òoå¯Ðì¥û^¡’w"¦…-“xªì³ósm¤of‡<~d7ËFRB ª³;Vå·Í©ð>¹`L˜Þ°­ÆŸ™—{ùIüÍ3x�Ëùqë©67Ü=Ÿ«m6Œ]…é`ˆ@ñØä MtüµÁ„?¼ 27»6‹×«!GÖ•¥.Pô¿·³Óu†Ð\µ>4ÿŸ'/|&ãWªt\ Q;�4ж9‡Q�=v«øºº‘’¯wœ`÷@ÍþdÍ•%�±¯¡‡¼cò‚ZÅR—s~§�R~Ägê ¢³VÏJ',Iíd i)žTgT|˼…}î6¡6Çýóí7ïz+\ƃŠ\E:UÉJäu6·(Mäxÿõ +ê¾òïê¾_üps=ý}ðêf¬”çG¿ùð`™8A˜T/oe[¤Ä&ú79'ÖµpØríhÕ#ÝÓùýx²xuV1¿ŸïéŠ@×ÃÄF’ÀêõK}6âÃvöywV~ÇÃ3Vy¬U ¸o#?zå`%äW'5ºª_e°)�*®ì+8Šrï >:¼ Í!æ‚ÿÐäÔx'ÿBÅÂø�p“p[÷r0}éÇgc+ª)Íynƒø½ ^uþãWôj\Ûzé³&öü÷˜È¡gfçm™ó扴úÍt⻾újß»“qÕz‰8Êňyj­tËüa±Þ©å�máK[¶=¥¹iOª8õê5k²‘‚4ç³ÖÎ3#³zn(PT˜‰¢CÒ­ ³œ †{Û¬³ ½€~ý<ÆéüF7¢¿ëÌãøP™èêtœ Ñ“BÕÑ�C9u±=«f—Ô–¬SrÝÙ-Q�7ž¢"·K©-] ùy\ûCCªVw¥Pò·1;÷éñáÜ•&H¤î{ô=eH•÷ݪšU:HÑù¢*çÄåΦ(I‘;J¼²cíú¸Ñ®8w‰kwñÉÈn©q #ÎMí~žŽîÿF?ž“¾uºãõù|ǹžÐGÓÔ?‘ø £ÞWêï7ÑóL&´ä¹ÇïF¾"ŠŒL\‘~6¡êss‚i’”Š2CIÉ2fºS¾ðuU'çH«£'!ìݾµ²�ªØ4\´ýDK$�æ�®föK }†$­gIój|9Õä&lÅ9šÒ¨’Ö Ï Šááÿ[gã4™$IÐïÃ~=¨ŸåµYûÜ®)gõ›È¸ êÆ»/ëå]× |üíñ=¿6?|©Ö­ïÏ™ÓÈ{¯á%…eƒÿCv&(ÿOZÑJÍ[mæ~§‘¿pŠ&¼–TqÕé:÷®­€ý_š>þ&é<¯ Z0IQêÒåPÂëöï¸ï}zÆ@¶d’ž¨Rký¢|%� @]³†BžÐ3ôKfôÆ›©ˆ� T§È P~Õ¬d±’äÔŽ"’!,™Oþh)’ðB÷‡fB AÆI©Z½§HÌœˆÄçïüýϽÃÌÖS�åµa® •`ªÕ©}ì-8¢ªËOÅÒn­¥ºÚ Ì)š�¨S^ºj³RÅÉ8œØAxÖ Iìó4ŠßÕÃfü¹µa“<6‘Euþ\3ûÉé‰EgÐÚ¬!ä쿇�‘a>Ž�ýƒt8šÔ, ¯…š‹*Ôôˆê@%¨Sp…‘ήTù“¢éiø 4й ]1w90 pJP!ãg ‰¼g’xW 5Á£_¼ïì¢}‰þNx6’µxg»Ú⋞런„ùJï »ŽvlÂà[î ^G‹0¶Z�ĉ¤–õ—çùYc¯â“Wª}tzÈý $GwæîÕ;²˜ð­uƒtá.²Íá— ôz+¾öÍÆT®Ô×÷±ÓÜÌ( ]U^é^ïÜuziò<’_ªÛF¼Çy”«$”“Høýì¶ÝùÍ]ñú· R~š¿–²Pà77Gv¥^Ÿ¢ùzl�xÚÇ]Ï’�™¦Oæ8„ì'G•v75ë>Õí’Vw_ÍֻѤøfâË,õ´:†FÜãYßµÇǤ¥}&ÜI¬â�ò´o½nMã´F9'¶_¤~öG]zC¿#oðÔÃ,Ú½=˜òÔ\¹¸é<¶5Uq‡³…3?ÿ±Nµ\‡õ$‘]aÎX-qxOùòñjˆ.�2 6½ÿh&Ô¿Ùê`1Gðت0%|±ÂûØ@ÿ;ÿ_Éù›_®>³J³)–ΑÒ‘BGî`U“ËÜ^Óð0¹—¨Å=ÅŠÓ•ÉfýÔΠÿ1ÀPÅvšf»úí'÷ŒPJ7IŸŒ9ÀweÖh¸ˆÍ¦ú–ÒP-´ ®zá«õ}i%¦ï˜lPÄýKî®÷ÖÜ´=›þ<êì-j¼ìÝ;âÔɦ½"…ar3ܯؾ« Ûü!åžó”U éq¾d‚ zMšÊ A�·êg”h%Íäù/ñjü|T}Ìþc¨ÍƒÙö�Dz{Q–×Y`/ÅòPÊOu>„t ^:¼“ÁãCÀ¨1 ÞÐoÀÀ¨™<j_cëП.߯2Š……¼Ù…Ï h>»«S¼¾_ìFÛÃkÏ?Ù„vôGõ ¹¼hd;Éó‰õ¿ÆVít”¡o 8µ[«wNhíxÞP½Ð3õžƒÏ™Ùªe¾Î&è0LH×Mò�Y5xÜ…Fd¢A¥�²VªT@¦•çüÜBªÈŽÉaɈ:›€3kH‘Y‹¼Àq��Çœün#©G‘ ‰á@—ò‰+1³ë–ŸÏqkjR†Ö#ëÔ¯§^‘ÔÄùDë] ²ÎÍ£6$4µçå³:Pé˜Ð §&z×çhS%ع¤‹ ÛŸ¨G•,iàuS¨‰S;Ïêº!Q뵜J¯,ûáD]#‹LR:Öd)˜ˆê}ÆAÖ(*]�2¦†‚3Å™e;Nx’͈ΟÉñËßq¶"³^ç€  H¥gã�c{ÈFµòàz>Q<^¸ 5õ<à=C B uq“Ê(ëu7ç1ò˜³¹s"çK—úš£¯öðš<“&Û "ÁØÓ~\¨½ëmÕÅãëɄͫ“1Àž‡Ø‚�xX|=¤—ÜÖïŽþŠWùÞ™B–u—Œ­“G�3"ô»±Bè³¾­~ñg8þfؽïR<ã ?ñ&ûq²_ïžIímÇòÝ?–¾tZ‹´ˆê §½D/¼Ã‚&ZQéI�2Ñ¢Þÿ«ÖÔ T¿Ï¥û‹Ë—k•‘^\(åÝÛV/úo\¹Å}Oã’¶qPP%þ$Ö¬}œ‰ÿ–ž5òØ�ŸÅ6ù£U^á¯M–+£w¿íT̬súoõhö�â[ 8D|ÚSŠêá›zÊjù+ܾUݯ,ܽsÿûˆœšŸbý ¼4œ“»p›OuHc“úMŠ×Zhè�O‰s£Í�?u˜¥à£3ØÏW1šã_‘;ª0ɹéxãb�KÕó��<©�è^]uÅ´QøâžNþL9vT9­wüfas0›¥ŠóÓÕRÒ£tä\p:Bî$z59¹Áæ$vÿ)ì~gÖð;t…†žì‘“À—®íRX¹žï Ko™ÎÍO8ÞC£g~/õðP½xè¡´Ë‚ ƒÄ¢†£·1Ö;Éè°÷FÜîyp”È_mH7³úŸÅIç‹Ð&h�%\•.÷T9ƒ}îúÏŽZ².bðˆîßç¯Ê~=’Üš©ùeÉõN�ým»¿jµ^Öß;<™`݈ï´÷pàN�ÚCu<²vW=Un¸OggS†Lm¨`ßÜøÿÿÿ¨ÿÿÿ¤ÿÿÿÔÿÿÿÿ5ž¢JÜ¢ÍAëG©Ih²j|Ñ¿PýÑ$¯ ²ç¹òáê±û-tØá 2Ü Oµ_ï\¦ðïû¶Ñžœ]Óÿí¾éE¿•S$LšÂS+uË·üCt€¿!™ ¢Û?Js ižZA2„*#—礪œIÓù‘¢ÛFét€"SÅqeöˆä§W«#!kC,ÕUOàÆÉÝâc²�€l ¤"M²>ÞP­ó±ogÞôʲ‰FíƒPD#„o­ý¼)€LG¨‘TÔ &޹òvºÂ ‹,õ÷#÷†Z3’‡&X%Ú£Vp§/È”`~œ9^Î�«Ž†*,—®!hÈIŽØ3h¢ùÔ³'Ç¿…—"ÿæÖC�WÝ‚ä^„œôßõ÷(y¼¹Öýua(–iÀ#r¿CDSÌRk·¬Úq¥8n>kRµ"´Hpp(j"L$"ä.ÚG÷j®é1e"Ÿ D 3t«vJtöÌ@) Y’t)¬5oAÏ9Œöìü¿Ç ÅÚ}|GïÃÐãASb×%:ôn‘x”*ÜTã÷×fò¹{µ ?¼@+{ž�&4qšÂTcu .³Çš?ßÛ�³?ëko'“ ZÍ6'ã«NÊ"®Œy«ÏO‰ïf‚FÓž�¿$MogÙ¸à“£.u™ØéçsZår” {oV˜êçëXÜKõSýïóöD¯ ]„þW_/†`òí*wN‰à®Í\ßb|5½ÎãæÉ º~‡ºíDµù¼ÆœÛÐ|œ%pt‡Û ò“Ué¿»&Ûc}Êíqº[×·dl °x.‡£49g¶¯¸ú­Ì½m°oßäO‚Ú†}@1n�4/2 HK='»—'¨Î+MÛ¹lWÁñ �ø­ºòu¨»5á·[üÑ@Y‘©O_ªéA·ZTŸBH½.$…ôþÔx•ß~¡Þ€¯�³s®ï%Ç{¿�²+>Kz¨ ù¯jiÎ ÙÅ¢…íþܺ„ÙKœ^нÞ÷÷t¡ãj_¥ØµjÔögq]r±k*©½Ñ�¯PR†6�e�ÇŽÛÐÚÿï‹p!þ»öiópª:cåÛH^7‰ïË&Åà6ööq×Íßָߛû†úä}åí#—’òDz€×‹,¹J#Õù‰d-h©r»¢ô5î’…&žHŠüšbïMÕ«�W¼Mœ|ž4©E�¿ZZ€è(¨‚5©B•˜éÉ[ZG¶©›a9½ºÏCH×+}¢Sq¡.F'µx|ª×Ó¹ôo¯Ü£PÏ�‚Bั´»Ù!ùÌÆ·³g�‰BR\^5œ³3/Ñw€>ékZ2# / ’í¤._‡ôú®™Ò5wÇëiˆ:õ>`–»Gþz†‹î²hhÆŠs”™BRy¨‰J†î8êˆB 1d F?WÜ/9.j ÷©¼W�¨û‹éÊ]ð¢¡EN‚Î�B·6⨣Pë7RÔAD"ë!Ú;5¥"•¾rÔXRuükd£ÙHJI`˜Dé®ÿøØ]kTxbç¯ÃQO ü¿?©�âºIŸ`Y±¸m¿¼@ºmTõ½/'*´D)c‡·T†¯¼\ÄNjÏ©Ää*î6 UQçÁï”ôÍù1~þµYÓ –mRkˆŸ+ü2Ã=:ÅNxêŽ�Hˆò©Ô—ã‘r»ò´®§�Oƒ[ÍttMªØMZ8a}÷«¤»s~ç¡Wž«ÀÇŒóNf›ü))êïŸ6PL‰¤c‹ØÆœ^ÏO:ÁmÔUB/ž´*ðÃd±«Ý`X˜«<é“Í×+…ºþ«ºÞ{§ZËj x™½K]¶ÜSÞ¿§ú'ø"{mç´â–d¶V¾´É–�<—�JàGí�k¬K F~lØ�˜þ3V0l6wõÇWì¤u¶ôÔ;Á¦ž›ëSãwнÅç\ȶ#E:¬Ttý$½«›‚WØN·¶ªb/)ÿ�£«üOŸM¯h Nëy*Çtˆò±ùá^’jH%:{^;c�áÄ�\WõIþ‚ÍQÖ®.¯G×u9м+·XÐØºä–7}È'ÌæÙ90ý‡Š¿œ*ÐŽ°1³Á‹µ'.ÃÍ´&ÈG;�.—~Ózq7õU΢†ñ»:!<ïÿÖÓÜùÿRÀ`Qãez•É F«¿?å+ѱŽ:qãò¹ (- ‘È­¾rû>–LAÊ­œíÍæ²‘ý�wÅ7P~´ÿ�NÅìÿµ§ë®OU<ÿ“¯ªÎÌû© ^*|¡?Ðõ‡Ú„&ŸÃ-ñ/©·ðjJWÇ»1¬ó-s¤Ë••ô¤o Þ­|©é{ÕLý¯±7õÙ¾è ¦Ô¸~s}"Û‹ûý—E7Èæ¥ì3p•«ÿ|Ç×¥øî’�ï×ÖÎë¦È)õAg÷ë„úêjœ‰8­Uà|!…ð‹7WI7qxkw;Šq©Ê|pç.ÀY»«ãräyÜÏê³xÉ¿�må:ì*e&ïåtÔ‰œ6O¼®Ÿ_OúðÒ4W¥f¤èµv¥5P�à‹îKN'³îUÙ‰¤F•�·ðPãä©íF6¡ý(¢�Y眂L=žP‡P—èCfýR%vR—á˜Wô9nr4j‘‡¤8ÃDV÷jÕá�#‘)«êKŠ�Bƒª�ëtˆ�¹qH>Bpf­âÌô1ÿÄO½ênsú÷Ëß{ÏKã¨JÜû$�Ê]ƒJÌ]K‘'ó½¶üÐiò¥Ú5·|uçJ .ãÇ«!BÈ™û×m›ÀQJHíaê±ùY!!Ü»a§¹WMãÎ�l„`„íìhÎR—ý^LDÖ¥_Øßüj7ó¯VÆç37¿ß�öjÏ�ßiÚÆíË€ñxsÐDŽýþÿv ðí¢x-в3þV†Õ� ¼_=‰™�<¼¤¾ðrUîž—Ó ÞL>ó ò»>7ÿ»í×¿Ž—ž êiËÓÕËMG¬s—¼uû)9®•[×­‹´k‘Ê'*ö¼Ð_àýG‡ÿfšlŸô´ùÖf\Ö4¹¨Ü=|~!ûùÙ�Ìáçw®§›õßöì;ßæßn‡IjùÛçÔÏâÌ·Gݾ¹¹›ÓÔýÚþ·èsùò…?8Ói×Ç|Óì[õø¯çã£Æ$zËܼÖ/~ QëЦs}<ŸïÙ]y1"â®õEnö©—“Ç}yÄÔ?þñ}Ý�ºÔ¯ Y^¯Ù+›åÛÏæuûú óé·ÕéÔ[»f]®(9(5c�_–Ú�1®‰Jw·^DÙ•&‹ú«f{*’-Ú�è )YÀ^©�û}ÓuZ2zc9fõ‰RGžŒaOõz^g­µçYcÏNP=ùìC^/Wës­µVeÒ2äbït�¾úÝõž1ÕÅ}k_s =ÊŒ’·§›©õ“5¦«fl¨FIŸN‡hu»¸´<"~ˆ,>gÆY«–ÍÙG}„ÆkÍp¾Ë\H%œË-–µØ8è>_k “t‰*�ää,Rq™~ä³ÿ~õ"Ä *Ÿ1ñ@C}}�ÜÓ“)C8NI8rœÂk#߉'Îìg%�I)Üüõ�ÿ?$ÇQåSI—ñxìçÏpšÀË3è«J¿OÙùiíoâI7(�6·‘³ªŸÚñ`³ú´ÐïÛ| O¿ë¸ioß±Ú?‹ZüŒÍi¶gzþC ¬D"Á–¸<ï‡i@ï§ív.^ŒLý"Žœ¢É%¨c8�‚s�scNÑš¤;». ?cë�Ø‘›K/O~˜ÇpãºT�®øa×û«¥4úM!Ú,Ç‘´éÑùqÑ@è}ê=àî§D<·jëÆÐóÝ‹ƒ£™ ü¤\)óŸ×õ«5¦qYMu=3ЖÏsàM`{÷¢½¼¾wì^ pÉg%ÈÁ½ éß0îÄÊÛ7ÂÏ~vÌýÙA_áwD–¯‡�lWz*ýQy4íÛëúÁÏ "e–Ńø¾ÿSøÜH{1Züô‘üÕ†3ßI£�vPÒá‚RŽb×äXÄŽ3Ü=ÄgêŽæ“õWPïîq#çKñQ³Wð­„>ßq±1¨v6fC”pìÅýIY©”ºd)¼Å"õôŽ~�à9®¶D e]ÖTÅå¶þÌIü¼íÓÏiuJ[÷N§´þÿce¶ÛÁÖÓµ6ª'ù§Ý¥ßóf8>ïo§õ&Í7ÛCvÿEº{‡´›÷jd¸îí+�ð5“k®«%ç7þøkUŽš-†Ú&9ˆHo\Ëí>Pø€rùd"ûÀ5“ÿéìÿ€|�kû:3ë7/Ö/ÌiÕ¾Û/óçjx]µÖüÇwÞsþùúp—5�<ß쫹Hv¹èX Š#æC]4:�bA WïÙº–ýóxó»Ç�7ñu­¬€›I1(Ux<ăÞM¥ÓÑUŒ+Öëö¶waDÑ)wµÕüb owºbe'‰ÖÏ+ìièwå°úwPµ\ûq^üOäöÛ´qÖ)`ì³?Ín|�'e¿·mèoØ#QbïWjÚIy‚ýâ�;çÜ�¦¦V¿©POeÌÇ|²Wþnï=||àÞû‡ßOggS@˜Lm¨` æ¦Âì�›š¢§°­ªÿÿÿÝÿÿÿZÿÿÿDÿÿÿAt.ûÕ$;í0a·y쀸jERM}þòÏí©ÂÍùßÇ]rY&û¼4_nì‰×›€SΡzSôí¡æ:ì¹çr\ç�ZÙÇ>uå ¦ �<»”§ìt¦‰AgÍ÷Üc z†ýÅZy”²=ʘñGAS£Õþ{]õ”D&×x0ásä†viŽ¢¥ŠfgyþR½ŽÒýó¤A¢pWÊßû‚ó‚ÇÝ|:çÿÌ…¸Ë6˜Óæý'oæš¼>÷,wߺëó6úàÚ5_f—s¸•Á'ò:sðöôÚëá“ ¯Õ�ƒŒæ¾›…7î�GÝ%%]ŸéAp¶[ÃôØ'`‘ÇÔšÔIøáൡåñû’7R)–Ó(~½uƒ}¢q1ý.WÂ̾æè˜Ww—zdÆ{ó.™çä»E×uÿ_§àµF`Êl2ãÿ©¬ý:à¶N�ÿs‰z÷Z/þå?9Í¿«H©ë²?Þ[fî³Ôû."ë�û3šÒ[§ó-WuÑ»œ]uÒªñŒ“¹~E§x}?C›@Fº—ž;¦Uî/÷µÔåtý¤D‡WÅ*ŸÊñWGºŸŸ§…ŸÅs£iÿîÓ/–œ/OÌÑ;ÚZˆem¡ržJáy¾æ×¼ëÓ¯?+«{Lë/jõèSNË+}ü±Ð{ý@€4ŽùïrÚ/µ§>Þµú~×Z.a˜ÝCy›Øçu"¸ÅF¯Eg­nõ`»XY£Ou>LiÔ™Üc>": ì´IËÒhI…ÐÑ`S·„sgÕZž¿Mê\oàIÇcí*%ê�Hõ¶OåI-–þC÷]–£ÍÒ¼XÞ"¶?ÍŠûñûm©øc+ÿÊš]Éo½öe†�F÷‡¡ŸWÉÍN�q÷±èç×uý­§Èåi�÷m™‡æ2¦õö§Ô«v¸î5­ïúXÎyHo'Ú}kQ§Ø�¹6Iàèqª2÷E»Qw}¼ö§7N^-ó í/ˆ†ó=ö‡·˜åÃ'vW³ûÄ.éœrÿ}*�ôŸçØÃ#çv›ÏµâE‹Ô‹¨Š,›áœ/üÕI3gÂ@�ü^óÜÆ¼>Þ[¬üYäѤ X×ÈÇ�‡%ö»ù· “4÷'½sH%õŒÖ—ñ¸Gø/Å *WŽ!P]6n·¯Ÿšâà…‚ DÝfNýâ[~>ûPRþànúèË Çããüùÿ,ïáöæû'6žÿCýìþóÓGn=ûÃ¥ÿÇõù¡¿} ÿ×ï›óåÞZ®*Ôz½É«^×—¨¹VœÚ2ÉèvHEfþºýüÙFS±9î"à/�[˜ù�ñ;¢ß¹4þʺR§hÏÝË?%©:ýÃÍJòs;5‰Œ%OýÒ—àDÅÃq·¬ã;SÉ6½—}’þŸÎE¨ª:dBÃî®Eþ.TïŸÊz€Xý†îþd|¡ðô[¿î·w£÷Û×ÍÝܸo<8k±ûÍè|×Vw|,žÙé1¢ä5—*ˆ| ‘ç,}×`qœXy,Ž‘#Íc<Þ{àÐÍì‘·Øù¢Ð A|ÓmŒ©“ž¤Ìƒ§ïÕ?`#€X|@èÚÕ"ñàw`#”,ok¶ ˜ž=r224öU¦³f¡‰:@yqÅSHe¢PY»ö;#4È霕€9i:Çwµ ÐH;—@$EE5®­3[i¹“ØS#qB'@çô3‘¯«¢Qi¸_}Œƒ2J%<@tŽ!ÄÎó\ 2/†ºwrê™óŒ¹ÎAŒÏDI×Êü§|0Ú¬ãbdoÖ8¿òÿûÛ2F�Æö¿¨•«²æU0¿ëÒþ þtzï?¼Wœ}ÀÀSç'›>`§f�¸ñ5V8õÎh©ŸÙ}W8[›¥ Êñ.$^§ÿL*ù6%Í×ú\ݯšï …v燎Çq¸¾Tœoç —�ÇîRÒƒ‚_ð<µÃz*Nó^›¼ý­ìM#îlD\Šc|3Ó¬š}•A5åŠÇ¸¸Tx^5[×Ã#uó)Ôíð’V(Eeh@´Ýò©Nz}Î4oIJxä‰ rÅpŒ!�ÝŠ*Å,pn‘bí³,xð¨ðœ/–ûͧŸýœi¦725Òû?ýž¯Ó_sç4éÙ�bb-ܶ°SÅ*[ndàzsyoΘÔÎý>Þ+Å –XÄèwvѯW{Þ†äi©»"Aä­óÚöª“.ÍLln‹ïød|!çÚJ»ƒ°»5cû}sú^ÿ7~{òÕkÞì§Kž›Äÿ®é�¸ØJy?‡ÿtd—ïÞûÍý�î_×ÿìD~ËÞ^¯vw<_åòÜiø¹ôþ‹}õÚ—nýùþ»ÿùpZnõØmgþ�1¬/E57“ϓ› ÿ©ŽŠöü÷­»|Û·ý¹û¼ÚÈ—”  †„¾öݼ8Ìïý•8Ê/ŠûÅ;[/<„(€ÏÀK>€™¶ Þy¼(SêÔÞYÖŒ§Åš”Ü×ÔZñ®ëáš’ÞkÐÓt/HCZv÷°Ð|ûý.À­Ù0®þ´ÓÐ� Á€SÕB©ËíÑ¿TUòP¹µÝßs×—g?{®ÿòyôS8 ô{ûp (ŠÇ™’^A÷C§zü`CÜò@—#�„AlO¯ˆhÂQ.’HÐt=ЇŽQ@Fuü ¯Í_ÿ‰fÄçÑ–9�(p2\�â":Aåšžvk5ÐPÙ9œ±rwö]ïîä6ÂäÝ[ƒ|Q‘ZMH*ŸÇö²(*dáeõþɃ*0„@Å€¯½]ØëüÆëäWX'3à=¶ñdZÜd#ÿ»Œ¯•1hþx¯oGI¸Æ²¯b§¦0^{äÈ_ÿìÓ‰’'™ë¥êú;øŒhÞHWE^øõ.Ý\κ—óÀñÃü Sþ,yãbº3üÔÃk:\ €ªs[›õ^N¯ßë ö¢çKrêÔ1�Øvð¸;¥Éõ`H¥5¤ªÕ_úA¸t؇ëK\Z!°¼UíƜ`ý™kE®YÝ!‡8êÉ�“FG€D)„�OP¹LÈ2%èZfŸéäƒ0ƒ@œ’Dˆ¢m)k¿WZêÀqÿ0A ÞÕ�­pÕ3? ý[·jÎø²`y­Ì1×cã=/_™£¯ðî:|:ýo6óוÆòZŽ*ßî)ÛîÓì¹®p×;ɆØ'¿`˜bîéY ‘~ qGs›ÜCaå.t…2Á¿©^N]ÇuØO•ïqtQ1^n3+8÷?�“ãÆ\ã�Xâ½W[gŠ–ÿõ^Í{t8«”ÁùöôŠN{ûŸM³Í‹ªñ÷âÇý3²urÙ^†(Ôc“þšÏÛvVù_SZ˹\õ+cÒþxʳ4KÝ1iF¯Þ=› û­LK^5®4 »þþýN·×û'j\¸Þ_÷Ëù^ÌÅmùßÿ9­ó¾òÞ²,².s¿ë[VmvNÔ�EÚ—‰º!Ÿj)sÉÈbƒÍ pTÑ÷éÆdÞØÜç¤6´?�üþv 8sÀÓ›ôlF¶\p�„i<¬)²;4þìjÆÔâî aР°Å¨6r…™{‘¾´5Sþ+E¡—Pè·{€s÷èÇÿ.ÀÍ?Û˜àׯ�µúþorÁôÏ«ƒVZ+âf…˜*R$I�²ÜèÚ½7ÐP©\‚ LgO]¢Oí˜ëç£ _4 Ýô?žVhºþ»»@h?詇aæ�¨íܰh±þ9*„€M€!OGÀŽ· ¢#$‘À.šQÝpÕ4×Gð)`~>«&è� …K¦˜lEŽ_§‘ç¦Ý„6=; €ÜN(ík\> `( € Lã�‹8ó×MIÄ[*§Çx±£ˆþ>�8ØÖôˆœ?|ô…�'e™ë(&¿½>/÷+vEs‡ ò`Ìø#àB?¥ Ù§¶Ù¢È^vBj³�¤Iº¿¡ëžZ†&“•x¯Íøœg3¤·“Ž´ .\ÍWmx¹¸þö;¹+Ô‹xß\¤îð…¨ÓLmp 1£4:FGR½^ ­Qäù�;g™÷ü¨«µø@mº|VÓ5k®ÒUCŠD¡u¨œ'�âi^‡ÂVØ„GÿI©½�÷^Ó/@˜wÛyþÓù·èÇ“ÿÓ*tD¬Wi±¡Ê¯*ú H0ü5èh4h��B©�\´_kÿwàíkKÀ5ˆ0iਪ0A°Zá›å.»°º‹‡lÄÉ„«‰Æ•ËÆCž/¹tµûC‰Cw+œÖùKöêù›‡÷ìÿ*àx“o¿Z6aÞñüßp½|bü,ù·òƒyÊ„Ïmäˆ÷ßlVfø#øztÿEØë>Ç��×ÙÀ”ŸÌR=ÚK·ærÖË,†nØm31íȦþ=Çñü·¬)˜6L&ÞI¼ò×èÄÚɱ.‹ŸÆ w¦ …¶VØ$T¹BìgŽÏ2{+?&ˆ«µR¥!÷§óšDýø¥»ÛÿGhTòƒªè÷œÄm+ÿ‹·#ëÿQ":-ÄA4×JÃe?ýõ4Ña[îzo/sé<{¸€³O>Eiº¯—‰×ºaß @A…_î6€õö¬õ™yÊh #¼ËŸ�Ò½€ú@€ ì§ùÀ ì¬5(Uðø×pqÓ>¯»Ã{ 2‚ª(OŸ÷¦ü/×ÞH1M‹ êÂål5†pGgþø‰~WûÑ·L“õG\õè‘'K~þº§ÕTÂs¯ Ï;ß´aN¨øE¼+5�§R¯7ôð3>7œ€V_€’†¨þÁj€�ÆA»9c*¨•Tc#Fݳæê}¬—HEõµN;–?£E…ãWÙ�zR4á�M qŸ£@ã×u.ÎM³À±õÀlÊÃxã@�×Ïåâ¢]îkˆ§ÂÛŽ (=1 TÛ 3lý@“†è š'Ýg4ú•ö þg¬÷§4�¨’’”Ä™ OÂØ—F Ã=ó9�@;2Õö[¦-­~ÊsÅ/ZX·ãæêŠ”à½~‚#ê’ ª³÷Ð^좺áÚ[';å�$�ã¿ŠÊ b¶ê>•\Qìé i?~¬êç~Ý §ënkhÞÀ|ØØÜ·ÛG~RœúrDz5Ðq† #Þ;l­°~åª7žöjÎý>‹¹*ÝóaS° þFY,©Àx Å€û¿âÓ¼A„[Š.×;Ùwû+ŠýrÏ2â~Æ=Øé‡´ p2²ÇïS›PÓbu ×mõ²9Š©ÑŸR-”5÷ú™:ÔŒe„~£hoŒûÁPô>káùö}�r­ëLfJÐÉÌ¿ŠŸEšˆ%QRñàÎÕ\±å‡è 9^KE›4ð 9iÏaî<>î»§ÑIú‚!’y! ÅŒŸ[Õ“¶À.âw¶½2÷|ýcÄææ—÷餜dUŸЩë76ê�çÅX×쯜,¯¾Q´Ðüv¹ëqº+ëî{Þe¤Ò õ¨4Û*óñÐêçy.ð&çÈçÆœgÁ‚úK@�µ½¥{a8€0–¥Ó&¤F\LÈ“¯Ùoo³þvÝ’«õ·GøL¬Î•/²U¾äåt;¦ õ¶H³x)†aç“üº£jò�ŠÒæ‘w‘Ým6ûçí$Ãó™½¾/›ôëaÒl†¥¿x9ÀDX7úNæ�jM!ä’ rÛ\ ۾‡ï£œÈï"®î2Ö¸/wþ:çHÿðѱUT”µ:„êúMﻫÑÝÞqpÚrómyQÔ¿_Þ ¼€#ܵ»frz|ÑkP¡i¸çh”NVP3¯�ô—¯_Ó_xR0î~àReC�÷=À ò$Q›®ß¼™{êNMŒ*MíÿFÓÛB�7/Ýú€›m½üópÔw¥H£©¸Ï²ÙᣂƒÜï@CCÝ»V*×HÔ¶zòÔë'S„âЮ•Ú@ÝB(èp@_'™c¤ƒdUH¨L9ÕSa¢�Œh€"§ŸY˜†œ¤æê…Õ÷kÏ4Ç’�³?Àm€WDˆ#J§†?Ëz| 2À!�+ÀO‘ó‡Áœ( ’"ÙI&„�ëøõý£O²çà ­âëwoá˜é�[4H6üL$Ò${¥ ‘€Ê<]ÏÇhüœh€<¥½Ü4¡aè~@Æ,%€ÄYë„\Cõ-õÁ°²6ôïX}nÙUÓ5ué?úgß hÆh¬MØÛ^Û±kÀw+ÁÆ¿2'©Ô·o“1ý÷b.yœ¡/‘|:àp¶Z}•"óeU¬ø‰Y~ý×t¸c‘Ì%ª 3\r¦ÁI@æã·�›†ý|)ùÕ• ™]—›,Ad”éà^‰Õv8'/ŸFp– ÇÇ9Ûÿé�‹Ã4¸-ç�æ_}¯ƒ9ÎLtÿ"ý¿Ö3¸»ðj_÷OcÀD/õ¬MUyMØ«½8ŠâçþéØKp'­�½®!önRlšÍü¤nH\ÚMéÿJ×u{^~²=ÖË匹â„Ú’k—ÿý>¿Î†�ƒOcPò£ÌT#V¤`ž®pĨd5?è?=ï"lÚ¡1> ujr,­ oáÇÉýé µdÅ}Y›ç,ßKnY›SÑ;u×}úÃËÖUZã1pRj¦P• ÿ°ãáuùåÝK[EeÝ×Ò ®iî©ïýóJ‚“n³œÁÿ8¸y z%îæêhO9Ï¥þR~\§Üº�{â{v��EŒ‰ˆì Ú¸qSZïSž•Ë/Aâ¶ód|’þøÃVÃÅÌX‡qæwdê‹Ïæ#“™ì‡â—å£Ïó%˜˜ã9/¼[•Iùœ«î–6ÃùþÞ:íââ¹äãôî]jƒÛ•Ãô;~æx]:—�&l«8R]±‘_=ÄÿÛ�ï\9ו‘¨´f·u_\ýŒ—¿Páxc35¹rîÞa~Ø\?þ–k <@yIavÿ÷�ªuhG¡qW¡ñ‰«ñ¢(¾nùp>éÛ¹GX ÍmBMÉéñŽ¿Ò‰Zš/BQãfm|fö3ÖíĹídFÂ÷{€OL˜L·oÜü—Ñ´¾°È³ñ7ïeÖ`Ýln^ÔÄÒüܘbú_Ô‚�š‰ÐЫ ÐTÏ8ÆÏ­Ç犢Àyö_³%ð²ÝÒ²øÓBÓZ“ªê§R·núš‡Ü3<{{ €–@¹ž?kmß×ÍÔ¹éYæ)Õ"!“=»L?”ö Ò~GMó-EBõ‚»è– ¼ÌvèÁµïK8³ð$Y8ùwjבHÈíîu™ùæà= ø˜I7ÃЋÏ<9/ï½BÐQ´PÕÕ÷õ f;¬bâ0!rø÷¥è¡R�Í ôäñyí\ô�Mò¨]UÍ69U,/ù¼NWöÈ jÐõß«�V‰¯Ÿòx.S©+óè«÷žáù÷S«›žåéÇËTÒEžô<›nQóIä¿O]#) vúXšN3åGXÜö�ž:}�1å4¼¿MþNÍ2àc‹D³9gÈÁyñqS“ŽÙñœÔyÇ Ç\€�ðqu3ƒªô³Ñ3Øÿt‡™ÓóX¿¬øÌœÿĵÁcÜ嬞=_ßQš&Ì?ñŒG#UrÙ¸öçlˆÎ_ ë<«º�@P6ÚÜ�ä*M.…¥ß'jt2wb²Ì�¦â[ô„¦[_lNÃçú·»%Ö«þÊÿ‰åhQu»9Ï®‹íßž]4>œ`{œÜ®V± {ýKívÛˇ�Â¥¹nŠJPÆe àì/.Ú¼ó~Îy='9/KP|HØúÄë׆ZJós}N^�k÷ÒìV— ¥PKVOþ�ÜrÔ‘úAãWWÌ8ê ð»Š`âîICq£»æ ii ´Dö,ޤ÷K•œ$µE‚%Ðñì­¿r¸ŽOýï}Êh‚Ñü7y-°[ôßç:x¦òãwÀ‡f;mZç§$¯íÓsó!¥B¾1.ûÝŸNôS©Äÿ_꯫՟¢›Æ¶Pôw fôë”kn§ë´Å‹û¢œ™Éeã~†‰‹çÈí5@™cÙN„þÙi•|bz[¾óÕ[YŽ•óúoeÅé&*@”(ÿ»Ç3´%õ?»vâPL2km�»ùãô€LÞØ"‹L¡íª½ý–}•Ô«nlЍêD>�}Æ+…ëõ\Úb.ƒO¾I¢Uy¼Q:¾w×_n«>‹ý1ôr’GÂþbÍy]°æœK¾OÀý‡FÞý÷ÒõñÔ¼TÅ¿…‡â£~ùÛÏÈÎP»8Ô”|oð+MÃIÌM®>ý^Ì…ñ¿ã—tgÚ¸iÐfsÈ\­Õר­FPß}æ­Ûx‘ÐÊÏÆÞýÿÜüÁ$,ôéNk/ºØ±=ùÇ+ÿ_sJJòÞiøåÌ*ÑQÜ€šMQuo Q®“UºKQ‡Rt;TjIo²�ªçóÝ6¡¦¹8q�pT¤cÐg�©ywRÈs(*@$»$$9˧«no²#;%C@6õ‚(ÒûV±ÓD S@œÞÿ¨NÖw&Kø<î>_Ï’‚T@ºÒl!ÃØ†#q8ï¨:IB¶ˆÙ‡ãH·,\>ŠJ‡CK“5®¦dC…NÒu œ¨J§°t4òèÅmü¶™OˆåÑ™ñ¸hé(¨TföG^ÏÌJ~¥·ai´[üþÐf™.š~Mÿ>gHÅEÁåäÝN·+oš¶àŽíý×5ÄE{,9ò6qc'cþÃ�>ËÄUóõ$:Ô0Êw­Šèjt›s¯”Èj•í´cÅ>è�Üì¹Nz¿íjí.½oGù.Xfß&îÖgÅC­�âžKôŽ`�‡Žgiðý¿Õ1¬Z‡ÑŸ5Tú´sd†9e®ÛpnÓsÿgFuCIÊy šˆó<ØÉ^ÏŸ°4îä)Aչݚ„{yön:J¬ôG~ž½µuÁ©½¯‘èÝù);¦¤ot ýv�޽—ð úÆÈ5K Ç÷näÞ9yPó ¥ßÙ¼ÕŸ¿tÚäE£Î¤%¶¿Ät%¦Æº\Dû=„^dzQÐÜ Qݹ)jü¦dj%öô0ÖŠÅõÖåXM\Õñšï�ÚÂÿŠ ã¼.{6߀òÑ^©ýöì÷w’³Ó`»¬éŒi"fl¨?_jÎ*Ë‘)*µàžpÄe|#7]WøÎW€ã·½=›’yP†ÔíõC v¹Ì˺Eò³Îu¢©v’º’ߡ؈éæù]Ý<µ²³NO3·‘´ ŽÊå#ï]Æï–pöáå/”�£q¸<»‘PoËÂz…ZÙkC"þä“ã—ÏÆg�è®ÄÓœköä«K‘ª†hƒþq¥Ëg|Ú‹®Џ½UŠz‹Ü„|e�ßÄÜêÿãx:w§žÝú6#ghŠN^ymèââ=‰þ•§­Hªèÿüÿ7·^`þx±>ûwzXÇ5öÙß\¿1ˆµ©?ϬÃu.MÏõw¡À §ƒtC eC•î¥ÉKëϾ›v‚Õd«¯æ‚£ÔWu6LëSÛUº@CSÐÐ8@”ÎY› í÷A½˜~Êü 3?�ƒV¿˜Ò2r÷4 ¥ï¸òöÜK{ ˆt–\3ߘCY3!4z3M(Úóÿ,³5ÈPõp€#Eóì¡5‘+GÔŽÐ\$• �Ÿ^(8ÒÊpŒýzÜ[»Ìçq×ÒÇG­‡©š|l·ëþ™>Ÿ°¸� ]"óøº U�V¸hX ÏåçñÏý§zM¥ÖKjuÀ©µ™ç?®~ÌmÑç´­Ãsi¦‡ù7ô�,þÁ4󔘻zPÁƒž*¿ýX8I€EÒò¨kxÓö‰z­êÌ+ t:ü¶ƒ�_©ùýÕ“¬�À×Í+±úN“¿é}¤£¹�)²ði¯µÏ”w~ÙÝüƒÙÇI˜�í  ï°‹%ǧïÙ^U?{÷ÞʽsIû NÀ¼‹ÂI/m�Ýãœø/Ö¤èžQRõvðšòÛÓšãÒ,#0ÓáçÙš|qùíB%Ù÷j¦×7UXÏ8ëF#w™ nGIxæXØÐY•‰[fœË;žÖ| x2^µ¨¯¬ýí˜q}t¯mè÷Ÿô®Ìj†÷u!žbq Ìù7ÃnÊXòU Ñ?Éü[xë«uíânkwËlÞïÁ¹Ù¼cGnå¿öÛøŸ çrZû"º^Ýc4B\ß_¿þXèÏ”ã»ú_¦qÏÛŸôù€�Æ¿ÿ7V%°UF§Ä o‘§é"’+<÷:ö�Åë›í§bYw½J6Ô.¿Êâô¯A)TN¼ÒË·Œý¤ú÷xyöçA¶Æ†ŠGêöÈר[—¶Ö¦úC%~mMqÝÏÕfì7Ÿ c]Äú Ÿã jÛâUÏÛ�:‚›<J«@›å}ÌæóÕ¾Ô†óÂá”^-O‚+]H~^”RÓþE{ä‹«Ü•‡äMýZ¤ŒEé»®Ù®Vïe[tZ–Ãm|ùKl€_Á)oóàgëLR&^Å>`F£ ÈÄ »É»Y߬ÁpÌõxZíÁž˜)?5ýA�ÿ^—3þ,´V©Y�GÕ–åoy”ßœË h“–˜¨Iß*±HH̱‹Zp¡~ðOggS@¾Lm¨` ½À€ÿÿÿÿ ¢®ª±ÿÿÿøÿÿÿŸÿÿÿœvœðG˜-w'sjry|°k¤£©$©W5¹øÃñõ[rŸãfvŽ_}àÖétÿ©;Ón¯£=êöW7o¬58v, ^*íëóS}ZíTxº23× ?¿To6‹exÞ4±¾ÿè-ÖíÈã—·B¤?]ï}ö¯~pzÞ릵­EËN ¯è쳿$*{å¨Qþöñ>®·º¡^g7ÉNn©ô3.…hÙ¯gbm¬1�‡n}Õ¬ÔªT嬕®´ÀœcNd¾óñh$q&2p äbq*P%ÕöWè ¾×¹ üí©T(¨BLﯺ_} «ŸûÀ�È:ê®hølõµNh:€ptÈ7åR @AD»R© ¨ÎªB©{¨ÒYA>ž³lòû,DîUyÑ?A®J ©âD•¦´¶âÔ~¨G3tïyÅY©4©P¨’Cš�Ó‹{é’ãyþ=ÒÝÂsHÏõø ¤§r’’8Ù'V§&ŸÚá «×ï8kè‰ËøÝç‰ìÈÔ»‰¿ˆ†ã¡î�ÄdÜbè4èûSÞ G»l =¿?¤¢¿Ç&þã 4èûË._”ÝwµROM&w_/�“lt V¡V®�Txúëf…I i±›dÞ�%ÉðÝ]Þ�¹Ÿò`Ø57J™¾¨ˆ1(]m�lŒj“Äû½£…,éM¬¹€üç)ÜÍŒp FV5×ü‹¯Aß�½Ýüᡘ¬V4à[ÔÂqˆÛ±Ñ4¥† ~¿ËoÉÙ�vý.¦v4«ÆþyúN YBolpjÓ‹èÎ\õxüÿòJû͆iê O«ÿKYÞtÚpOª«Wk¼jë9G» OþÊß#°tà!î)í—˜6žÞ­Á[ÓŸª†èX˜G¾`RœŸ­¼PâØšl/¶.À¦(×·fîÏ!Ž®°ÓÅ­íìf'^ÉL{íh}„¼Y ß�U©³^÷Šy?cÇú:Ëè•ë\ * L`"%ð÷ (§ú,¦´žÇO};>R÷Ütßç²6×åç‹�)?›½—ûv³¾Ä�Aßý0üÛíïõ¹_®ý÷ô®þóº_’uº�ÊÃü*¤Mî×Í;+Nó)~'|š×£/ne‘F»úµþ¿Úã¶­wíœØé¾M¯§ßêÉß'×e“QqhË_T#nØtý“k;JxÚ'|Þþu\Þ³Pgt]@7j¿_6kmû~ÎÔsr¨ P.Ío6ùÉNŸÍùˆ{<(uìO^Ÿº9´N†Ÿ}Ho¸?Õ ^¹_‡|Êp÷½#åT¯Vr{¯õX¾Ìµ"ÓqÓÑ‘IIŠDÝJ~ ÀÍÔtP.œµH„&îẩþÓ�Ãz­ o+Ùg³v¾>Ÿ{zJE’ºl¯ Ò` 7ƒJõW;8ˆ¦ÿ¢H,Æ9`Œ‰$EœüõØN­¡çö]?t£þ\÷ŸdÊq þ/›Ç�‡8¦û¯]ýj!Ï9 ¿ùŸc·¿ùç—é½þö¿íê}Ý gë™íëë§áá³±>“û{@®Y{_¿z‡C�ÆïìÈŸ@`ºù ÇÜÔØc>á¥ï‰’�u¹‚Wh¾qëÛ‡d¸ÀöœrsÉú® üenk6­Ù%röaYüøRá*�KTOò›Ý”2Ä8f"ÚöÏPùïö|òmŠÁ÷Ól*Ï/ fäÓú¦X•.jòUüÓ8sûÔÇËãB4�__ýüí“ùsÚð¹ë7X§þ»XßøÔç�_NÐ1EèƒÁ•ðÀáË:qfiû(¨Â�û%µåRv ¡È7¬Õ‹bÍñ—�ŠÆšÍëeaÁMש^ì×L¿ûõ›Ç(xòÃl�É÷ç—áb>­^',ê'ý]KÃyλw:ËŽ*¿·ßs*Ùè7tL"Ã7içj†võÎgøÅpí.Ão|<¾ûð5†ãŸ_³‹Óºk_Žìc¼wýûó߯R¾lîçV{Ìû÷UÙA×å×ÉcDÒK¢~4Èêi£xÌ8€€Ÿ3VÿçëþÄÿoÕÚÙ{¯»Ü£û£ŠæzqØmË—IóOÙ/×µs½+í“Gr_‰=bõ!u¾'§Éñˆý§Wò~ܪŰ0Ì?à®�&y•g26§qîØ÷WQú \c zè›ñK vgI*-Ô7<$vøŠµ„ê¼Þ®ŠŠ¸väà?¯6ÞàÙrݨ¯òúú¸åÅ*GéYþë=@aá´Ô2¿°=eÝ»^–­SçVÝþ{9óþ\_o™/¯¿ü亷5ZÍVþùó‹bšÉÈÄt½{¶Àf�Ï3ÐÊ_R °WêyûÿºÀb Ž£äòþ(P i9!ZõBU$I€8†î@ÎÌðx `ˆŒäˆßI�È-Ç�§ß;Fce¶g"½Êñ}­?]…ŒžkàLg^§ T‚È,s?kä—m*äqä½ç"ù¹þôÊz‹q\æqÉìQ lÍ_»'/vhf²¦@:SÒy@_•Јz¤€ÞÉÇ©ž8À Ï”I�°N*‚ ™TPxHxÛ¨;» $ ûâõgÝ)·ŒzgÌ’9I‰ŸvÓ©­¼¶¼Ã3qjÐrûlê»>|å3õ»Ñp³ÀSÖ‹¼H[è¾7/Ÿ;uçZd ÷¦6“êv_ùÿ1䜒€=– pÞ›µ{CÌùo>eÈ-þLù®?ní…ɼ%©QâêÆw6ß¼!‡$¶Êá7»åœŸÈƒ‹í&š?m1Ï–Â^næ»qBûIÌäÖðð»ÑO·£ë�ã[µ´Nj/Ûær�‘¬œNž¿©8óDWŸ5\Ÿêf29ôØÔÌê?¬íE+Y¦>‹K3^ÔùxoŒ�1*oÇx?ýV �Ùà%ÑauU¯åC q0Äþ7-4`n1€mÇÎ㾿Û%0{Rjqj1C#Ow`@‰¢2ù\xÁn:ÎRáQëþ“,0â°/Ínè[64¦¡¡iç,’€k÷—ÏT»Ð·ÛHÑ:6’ANÈ €uª«[žçFû}ß&­Ë°s…wÀùÉyç¬Qm^¬Ç‹‡ºšo»}֜ŗλHVE›³'iá6dtÑCîkºô&¶lyåÖn4íÝ—¢ÀðpàκS¬Û³õWÿžqq×íµóNÖôá—P;`Äܶ_�Þz˜î$ý ÍëPݯ(ƒ{¤ó¢Â•©zhFîˆ)ŠÿzøeOôü¬>AŵtºW›°2§ÆÛˆæ\ ñÜÔCâKf qeÛFº(2Ñä7'|Šâ^ù»ƒ¥Èl`Ê�Tã©þ‡—Æ;÷3þX”u{W&r^ús½Û··Ñ£Ý},1�ª€L×:�<Â_n³ñ@½k¥®gf AŽòfÙÒÛ>âÂxw«F�Ì×;o´ó$žúD…�úµ¢SÕÃ!j¹Ï{ ¸®$�FBåÆú§ÝÀÄ‹§À& ã?`.»øa <.|X€H€¼g­O†ŒÜI€ #ˆHÍhØ‚e^j£ Ð�2�¯\4BÓ©°ä“�†±€p&A- øÂQBq9ŸRw–¹€�Ú¾*]íÿ&dß”T%©‡‚2œY¥þ {©Z™>$T ¥«ìNþÕ ¨ï«êúé$±$Ué<⹚ É"(ð�÷Ö�TßTº²‡"¶œ€³ä&·ƒ˜õÒæ/ZI…9mWrWçÑOë®,ÚË+ùwk“³ôüºáÈ´Š½÷ðÖïÔÈú6z°iõž¦'w7pm÷ÐÍßê½E²èñ#²óàžkD�›êïÆLDÉð8i‹^ K©*F6 —õ4¢ß1Y[²Ñëôr0Ëèõ€Áb™ n5¬€´éŒ´*£0ꡬқC×åFjÍ7 `N¬h™îdÄgAhÏÆ�õ4VÿDDQäMû¯½/ÂG}j|œE�?³Û5›H-«ð»f_Ÿ{všê%ÞŒKÁ¢Õç©òi®+t}ƒWôr3—eý–Æ«¨ä¸Œ�EØ·ºUw%È�Î8ŠçYV”õù“®ûã+Þukûþ—–iï®MÌ_Ž=½¿Èe<œ«W­JéOooç5•.y¯kž}SZWÌ7T}‘únv°·N<¦°éšþf˜©¶§‡ã�•º ðÂV¤q»¸ºæÿ«:‘¦j®n·- ë8–$>õ3•ËÇg²Ð«L " +îˆÐ„Ë7l·¤°,“¢íšbªÊdÜ»EÝ´Û}Þµ¹^ÆonZÓGÕ= á‰eå%ßTþgìe•ßLµý"£ã23?yðWà  Þ>¾é»¡GP榨”õÒi¼�Pû£“ê–"ׯ°óWNûÑÉÐ|#S¸À¡zìwR�ÂúÏ{€ƒh¦»ßݸÕ4°~#؇c[g‚CR[êêó·íÄ\õ¯7 @(À/þDXÑ R7’qâÀ;ÿ‹ëXih�_úq4éK¦ýÛ^ ºŸ/ @JªÇhÅÁþ‹[@8Ä—­ Y—ݲ@[�¦f9»dõóIúöW?€´ô…S_5Ž 4]É€£YϦ5ž+êsB¿üN- *´øX)ª‡€ýŒÿà 2ÖS@Xyk˱çŸ^lÉUì]t%úU:ü¥Òy<Àó!ד 2�™­GçÄ �—y¿ãç¿Wšê1 €…’:¹m릴4ˆ£É›Ö©³ÚŠ¿˜|*1È;nè‹`8ûÄål°Nä«@DCc‡_°UW�?P_ÆÓεÀµ1Ú¿(¾· ¤ÓÖj•€õî;�b¢Šù¢kwM^}J< „œ£.Ügo¼“ëÍíaDÉ1Š\tɧRuõgS �#Ç·êõ¾�ËØ?½¨<äw³p©°ÓQ¤WAXa¹¹¦û+êhð …aö{2é]VœÿoèX�_ªõq»;hKnš¦ÖÙ¿Øimp�çpõ®bmPt‘¾>ˆXÕŸýܳJj##Œ'FÂbŠŽy†ÊtÂ[å›,�mö$uÜ8ìÆ>>ï:N�q/V:°ü|´~Çe±dǃ7Ïñ£#X÷àT?fFOï§Ôái‘ûi‚Vpn´ÒÚÚpÌ£AÊເµÔg*»2†”¡âZ«MfPéÒXLr8Ô;G%”×Þë/ `Ò"O­ûúîÑö�‡Å.l/Êé«ã†¾Â_“ôîó�­·çåüç-užÍé_!ÆVI’§²¼Ô/óZõF “™¥7v 2Y•Í”ñ^U~œ>^6üêÄÂqYÈײCý¼Ôe3,ùýž‹K×áø) _Ò¥Ú¶9Oð�ŽÙzyùåK¾Žî�Ì|û5|¸·Ã+ÌY¸ ÃϤ¯×¹TÈìþÞþó²È÷ÿÊ÷¸àOggS@ÒLm¨` Dæ gÿÿÿ¤ÿÿÿyÿÿÿPÿÿÿ]ÿÿÿzþ ¼Â_ñé:Ò-©�Œµ'£Çû ˆlo¨�<@ºÿþ§·ý­k,]}HhÀëwãÉÆ8†¢Ã‡œ¾-o`^Š €îÃ{…¹6h�è•÷`ïýø -®kB€èú#Ï?É«vm  ³¯±}³¦„I 6ý¥ <4E¹±4 ~RWìÛ¤h˜‡€½þ¯Ñ; •f:{�/Ĥ¦ªh©êçM<>¾mÀNT Úª€¼¦MqX÷5;2•NâûÙ€¬4 ÐðN½ä7)’Û’ì €Ae îAï表w¢�““»j2ÝÚ*OQºøM‰×Çsš;“÷󺉀pHEô³86²¨§ŸÚäºF.rbüôSšøµÑ ‘,èÃÒ)GõÄrS%2ä‚À³ƒÐ(MQœµjž]PçóoÁm�SS?ðÀ­9ìÌQ÷äi¡$€ ŽÍ=7„øá×0ÉÁ¦Iªq-ýJ®kø-r=!æ+ êʬZ¿BP½Œ+ŽíÁ/jXæ–MrýT?@ø,€§Aø$ïEg‰¸y]ÄŸ< /.×:Éôl—²äãKh¿àI&s¶Dn¼ÍÛº5^]ñÁвþéU1½»×Hcû9Œ­…,ÏlÝÏW¸“.Þ¼×En{Jëª\‰z§¼2 µ¥£™uÒœ•)p®�¨Üÿ4ײºšKºæ{äûêåoŽÏ~Ëì‘ J~2U6Ÿ[®Õ-G³½¹B{;êE®ÊeÍñ þ,••̤žrΉ®.ÇÛ¯.>~Ê[ˆ�'‚²û–4e=‘OC~Y¹öúÃõûÛZøw�¸K�ËŠï5]Þfˆyꨳ°‡Ï£}BÉ�eÿ5f‡'”M—kÕзìñác­šýÆÓd<Ítù´Î;zÂá-¢«%‰äò~~Iä0ù~?•p„µã²%ˆzŠ/Ô:–ïe«¥FTcîx¯âôÞ\ä9Ý�•­-ÅSÉ È7­HÎ??ò>ÂTnŸ­|†ú±yØPrq"x…÷¨j1üŽë½yÐõ'Ç^ÍúAÖŸâê—ÿ`ׯ;»â>ÄzÁ1ïbC°ºó÷qYÄ'¯%¸¯2õKB:þ厩ã¸×SÁa:á\\ÞYE§ç¼ûÇçòtÙ:ã­µaj¶Ï”S—µQé%XKí·—º­É7ÿcî÷ÏËîê²®õ}¢`î·\uä–à¿r² –»ÞKuïWîG¥^é[É{¸ðf®ÿ“Îã‹x$€¸p öäú›ŸŽ�òË�r�(7£V§µ‚>é ñµ Hùv“b‘—EÏ�¨Mä$3>ÞD�OmD¸ÙèÉ.|²Yjt7Qÿö˜œ€àѦž†®­ cÎ]±Žaˆ�†¼ \„¯7øìû¾k ³_+ÀùKa¿h[€tæ|hîÔ%jŠ@A+Q84kÒ:Í%ÚÈPÝ<@AËYä¥ß0 z+þ÷ü�\Žˆ�,UqÁÈ[5‡]àuÜ´áMqP÷×KÛƒE{ÈÃ%œ r¾°µ¥³ß^½³÷è€uŠâvOüZáüN�¬â4#m}ÜÈè�yps·ó†åÞ€e.ð¸îú®ªëXÙŒó<ëá¼½½­&ž}ã=!ïìïÕvx�͘·ÑÖ‹îL'ô¡®‰#нÆÌ{+S¸«ö¿ WS©ª‹E2yÔβW‡Ãõâ *ãdjÖí¾¹9˜©v€mm}Î]•Ò^}nÞÄïWß0zØ}6B1�Ϻà ‚·6ú›õµàª¢ ¸MÉîHûÊÕÉ­a\¬_{Z®ýâIJWHÊà0o!âÀŸãƒþmUaëª)(Jš 0˜ö7ŸÎ[‡�•Xë_\›~óúîëÍ[Œ3ÒžÕ�’`}Ae†‚­»½ó},kxJßh.«3a>1c„̽ÁÀ´ëÍ÷Ó¨xS>ñèÔ·:ìZY×.Â6Þç}'}f0’á1É?Y�qí)΂œ¸+ÿÎÔr'�”õêÄD�¿,WáO®äÀ�øÙ”�«_ÏmŸxUý5ŒJ(ã4>ˆÀ9”Õ‡p²åvAX\ì´+�­‰Ú@½HU³ýƒMòÖr!ͯ­î÷Ù¿c� Âjs9cËDì0ùäÉÇ¿©(Â|¤c¯ÓxpªêyðŸõò×Ãg%ØÀïhLˆúÚs_àþ/‚ c ¬sF£y¼‹ð&ïž¹1«]H»Cž™à¥(?Ÿ»ýïâh›¦.ÎBÔõFm�~E´Þ¥]ôoü1Œ¾ß§3ÿZè·ãÚýa”B‹=|·äµ½å1ÍÀRîð…õ=û³pëÛãÛÔn*!á~ ~<Ékª�2¾’+Û¿ÈæñN¾R ±H¥…z8¼B›ÿ—/½|'}<W ¸\Ÿk::]àëçÎúçä—*H(Ü·®]nbÖÍáQ À=+f%ÖûysàÒ_Q_w¶?þ¢ç¿ 5µ«†ãÞÈVƒäPCS¯gþýNjÊovU­°â9ôï4ݸÿ€®ºo:´ŸgÕ3ÏÆû¡©�æ—‘3ŸÑ˜Î@ñx´¯Q¨t�âµÿ�ÿ|H;¨| ŽDî09TÀ&K8DÁ;Pôüá‹Õ= Mÿ’ŸáÀýl°m>¤À hÅ9g(YÒÀVˆ¡nñîy�HåªÝI6xòïI”u«nÉå ¿7é¿.饽Ò©>ä4:$¬9ðFo< ’Í‚¯ø\m` ©¥lŸÐµŒÁ@åÖìÓäSÎuÅÈ,ûÎ\pcÆ<ž/}1¤ Öñ´"Qä*ñ©ßÏ84Æâ[yuEÝ“E"Z¦ÇZ1ÕÃݵ8·ªgª‰ë*âÿ�©VeYÝŒ¸¿Ï àÿùˆ=ÎöÛ’¥~f‰«½èþ^÷½Ó?ù³m$z¸—ˆâ·¢ï~Í k£©ót«~ÖdÈLÆÛ½‘§_Þ3›£5zUÝ’K0Þ†.}´h~@ö–×× ÖŽ¼A6“>=�ƒýXoL\®Ðë~°ú?ÓìKÆù�õ7rèíØÞëVš üloÑãÆr@hºpª!™ávaɆD1#à!†ªk¨½Ú †•è,ˆëþséã*n€ ï¾F’þaKË&)²{=’f‹ü#JüA„š·íX5c½:ëÍ´÷Éþ‘£‚œ?þ£åæË(ÔÇ!))¦Èû-ZÊ”Âu¤±“œÑ›,ãkWv�s^(?rÑ2ÚŽw0@™Ë*ƒß¨·[�²6æ1u�8˜|TˆÑôË¿½$i+ê¶�`yQ¬hˆ¢XC»”žþ‘‹wÞØ'0"­hPÿ¦uecGóeZO>É­cS–eóƒÒ×’×5"¾�Å÷÷xïïOüÿ-ÿÎ÷�f×±hC½¼¸~¼àKa\-ûIñaû“„_ì5½‡i=¹ðˆzó�î½v'Xî¬rÃb"ª29ÿv³v›…üZg ò¯Š׈‰)¾Ý&ˆ€ZUc½Á2�ŽN¼ ”·nZûù 0¡®q ÀPÐÕ¡²Ô.h(„[cÌc®úñGWí=Œ(--ý𸿠;°ý?py¨€>>Þ °.E±™›°@’€Ó¡‚/uqÕ¤8ê�P5Á�  þñóødÛg€VaX~д8 Šu¤a@€kjú^=šnæ…°PÌïèݨ7îzñø=ëZüQP~È‹úy¹ÁšÃa«ÐbvòòîRqÊo›~ÂD;7½#³Ç F _ìZjÃâÂ×\lZ;ÆIL¶ëúÎ8ÅÖ1ËÚwhPò/’Iç'÷LÚØ—[.øråÐÄÏmÿªtÎÐôzž#“ŽOh1í~zœdCìs£}‹‹©àÏs1ËúöËÙÉÜV»òEÌVÎÞ „Jßžaï<Š+ÝàŽƒlKf‡P=Z,ŒæÔ€qª‘·`\%¦¥\[Ô$KåÏ«ëÊ [‰îV‘h­õëìÜËyN.¾sÏœßýIFóŒÙö%”3æÀë³ÉjŒ² ~O⬠B3<¹ŽqÕDœU8ÝkR0ÀÀÒˆÍS4…e¼÷¥Ûtb¸š7Ãaišue&3ôÞÈgòv*Vtè¼ý€Íl)f ¤?ÅŸo3N­W2A àÈÚ†sÎ[Ÿ¼f'|6ç‹‚Ç—Õ CÉðÚô<Ø‚]ð · ®�¶²æôJ<*’5ùz0ˆà¾¾ÿÉïŒMҷʃá�EϦÏYs<}ç„£+’t*yåU˜ùmÎu—A<?­¬U;‡!Ióú"¢ÄÂ]p6Š‚µ<Úúµ�Fÿ=õùê�æqÒ˜&Ý\ëÕî[÷ßÛÚ¼l?K¾”µq!nû««Â8M¿œ_Ëþ<‡ít¡ñoøùk}Úçªú*çßuðÓ‡Äj4/¼=�qôæO܆öÊ¥=s‡õ¼O6´®”,yùÁâ ÿyÀó£Ü ÙáÛ€´¥ó²Ú»v(YÕ >Þ¼ãkAÆŸÔù�ý‰—Å-úÒFh²ý ¹B>oùÉ{û7ýÕ£Þ2fhM w>Þ×NB•¸ýË›æ8‰_Ú…šþ{E§6âêÍ{"Ô˜ÿêkVÛ߉šXù5©9µ‚z]ó£\áQ)`�«ãõ¸’ÀO?ÖÜ�zš‡'óOhjQ»>q[êh¼40 *ÊÍxT|û’sÀÑýƒHÀyTØéÅ¿hÀŠÌŒ ö$ýÊËèqÜÜ$|BÈsQeÈåÁ,ŠªÅ-ЄÐ@9EâoüÌTÉÌ ¬¡[»º²~å)ñû¸‘¢P°4,AW”°€“Æ; hšyöó±<¶—¯s™–|B€—j¦³&óó�ØPÀ]gT=õÙø�ùkïÞZJŽk[;ìíõ{ÌHcfdçS€¦?’ŪѥKÉÀþ\§q9(,aœ+÷ŸX†Ôþ=Ó{áv÷¦'Š>·sIú³[ £÷„ÂŽÒðå~ÎânVw› »á.íï0a«4$›²?>~œÁS¸‚œý Ó -e�r|g‰£jõUu7®™œK¶c¤³5çüsÁ˜r¢¯MGéý MÈÚÿ ˜n™oQÑ{ÔÑÊÿu‚¢fM+¶6¸(‚›Ž©“ Ý`2À÷ �G²Âþ�^e(Á¯]äʾ� ´9ðêýhЯIO�¹$€öl¹ê•¤+¤‘4TÝi¿µLBŒØ¸¥>coò9ÿ½û÷ôY@T¡A;˜êçJû¤m|Êì-טó€ßio¥fNƒÜiýJsP)(¸šJ¥Ô: r‰ýÛ&P³î~Ÿ¿¹ryFë[ €5â?â)ø ¿1"™J<ÛÕ•@B¶8TÄ�‚ž< "á³ÖÌhÜ ‰�ãïÉþtïßU‘ÉÑð�ù‹ß›EŸíN pÖ\û¹Cµ6Õ�µêÓ'ÒÒ”(ôë‘IU:ò�D*ÔJ;YÝCM§Ibµ;ÕDwË1wBȘվË@)d:�HŒ<› ��Dòcוwv�( ãOlpJ@œŸüùç÷“Ø}t×mtørîžz·UŸÙââ©sü‡ú û‰Ð‰„þ9X¯q±î›û:Ü}â•WP/{s‚R ;åÚGO©#àìnn…ßã\Íß(Q–h8Uhá|ß_x<{Þ½_¼¨¹ÕÃc]cÂç~Vå˧O1¡sÝñâWåg2ÝÒÏúµ}bsþO=PlÑšñFïi Ûú|[ÖȆßAŽ¿~IéÆÛã/n7}ÿìÎðR7”á &xïZŸ)Õ?)w¾mÑBÜÎÇL¯lŒÙÉŸý}]ãÉ¥1†Œh¤µ½8]a@Oú‚ùGÍ?XnÓøþ¼ƒQI-¢tÎø�&••^eoðí¡¹JE_}ELú¥cë=¹Æðs‰jµ©yçs§v`5€ê"ç[ƒ“í�Kš�4]Y9(©¹MÏx*çr–/ÍuDµ´±Êé€z¯0Kƒ?âÆ}4Ýj%¿àÌw­°qì*sÿ´7Ôhs§ºLZ¡Bßí%’Ýòl÷*Òlñuýç�¾ñ oœv�;~Üâä·i¤€:€;³VjüÛ�Eì™s/Í(üüÓ,£¼ÎB>±z‰Ñ¥Jûý/î Ïȸ-›¯c Á?«"ÇÒK…¥\ópVAóè7­ý�z‰+#Á)v)³ùn}Ï‚¸ö%xÜÝå2\=Ü–Ð})‡æ\bÆëJ¼ªÍ7~o]´FÉ}e±Ö¡íãtœ¯»¨~ÝVÛí~eF]¶Ÿ®¾LöÜìÏÇäªúŸþý{¨vºwßòïö}´*¶¯ªxM.]_M×FÅÜ�å-ú¹a¹³.¯§g¾*þ å÷ãgõ?åhüG¬¦,fÙŽÝ+JÉßûpcƒêS<¯1—Å.�R¶{« $ǧ†žNa>i´ÿ]¯,¶§ì—Þ_È—^ôãÙìþ<>5]S<ÌÝ0úÛµg–9ýý®S]þ³Ö–g)Ǻ¾S¦‚*àÔeáÎuF% úLhíõ (ÎeàrÄÝÂg¾~pi ÏIn†­ \\Ê�þûŒ¯2{_ühF*pÇœ\ÙÅË)_<»“ê÷§âVçV*ÁýRÇ&ùÈö®õóÉÞ Š?É#r¾‘\Çok]vü|¶å\7u!ÜöÂsvûßuî÷¿çâ5¦òaN¼Ä ñKóìi•ª_þ}€z­ŽÎ¿OC½êD‡Ws:œb5—®üü#U†‹À +æ{N4%�8ÛMŠ)˜Õ×\C­žQÙQÒ_õl‰¤ôƒc›Ô,4R[ÞÿÑÁ§ë¼ÒÙçÄ%ö(µ†Ê¶{Öï[ïå¼57×h�í_í5mËùt&—ß ï‘¤1ô9ý+˼‰¬áõùÎxãýéV×ÄÿÁçóxk†µÛå‰a@úÃwÜ|”Òךo�h*ܵÖã�kŽ�¨²ø(gÏçªê-r!#Waý´Ï£Á^iº„ù¥ï�^Í5KüKs·~ÿh¿0¢Ü"âÄÿ†IÖ¦!Ž 4úâsëìŸÀÞ ÖËÏzÂ�ØüÚ’±ÄsI�3|6×߀O|nê³ÿg‡9ú¶_ýPÜ?Ü\×Þ[¥í_ïZâùì~§Ç‡åÝïÝz¶â}ÝU·$¢Œs÷â{xÓ_p¥\S5$£Î!H>s î0ã#k:�cpÃôÊ�‡÷ìºØ\±/jÕÝ‚lßuö�M›æûogü;µxcÞZV÷&¸Õ4Îô7N#eØuXïí¯/¢ë'Lñ„.׿¼ê¹&x•Hû/ðE.î°ÿ^taöåE߃©<¶ï¯µÞeéç^Öå®Ñµ?fñ±¿¥žE,9ëÚ’ÇÞÑSí¢P'¸te:Ñ58óŒ1ìý$öæz™Å—!ºp.x´úlÊczL�ö™x Qã„ a¿vÐ[y§K@yK€�Ó©Óód†Þ¶"ln,Æ�#Ùj8×­ÂZ!x|íhÛ¶|œ:×ÿéºö>%¸“Ió_Pw™0õÿ<ânÿïã/ÿìócú~žêSÑÕhÅþ¨Ê�áÌsÿc�­±Ý¹Æ9yÔ<»÷nB»4ßBò՞̀Vûà2ÉKÖ[s¨#C²X›×ÜîüA¿’¬ÕdRÝš„A×Q{`ûÜѹ`‡úµWàÅÙ"H]Åp™l­Ô›ÂpOú.<Œ¶|V}p†nöïŒ6×ÿ‚:kÀ e¶ÿ©5FüþaüyÎ>®É2hˆÿúZŽ¥ziTQ³—®¯ž»3}ÌSÊïf­QßIܤŸÎ§óx–>)হõpWÚ#&tRhÛä `é«ÃüG|Ê¥Ü-Üg3[ܱÙô{¿XäTi>Fµ}¸æ³efÝŸ'�žGòÛmÁ¶ëTJ£Âhé³èþøD¬·:õ}Í�?®á–Ó—OõŽãÚ”ò_þ[¾z;Kñq¯»èvƒ#ù³ýðîV— Vf¸üEÀñ›-Œº5¶ó#bc.Ø:Qü~N‹qv7~ºN“OÕNj¯Éki7 �€A¤èoêiÉ0�³ÿxÞ‰ïíÿ’Ç0‚ôöë9æäÏ�d.—›=f?¸8Ê\ ±‰²ñôe¸ÿêñ3×ûì|çÌ¿ýþñßrM>ïö�KÊX-bôs_§{eÜoäúSô`fìÎkÐ�ÖÿSj¾×øÅIN Ø+¼æÉ5 k]dÑ™“f>‘Ž5#t†ôr—¬é›=ÕÙ—ÆwLråÞÑCmÛô~?c$>Ëq�Tè]\<ìÓߊJ®3œË?ëuâzoSgÖ¯ŸoÈ›´¼ÌÈ((t.çg`WùR¯õ¹>vù¡±¿t4ËŸï¯ÿÞçø7{~¥áãã› ûzƒUzyJ1s¹ç^™¾~ŸåÿVEǯÍZ1õg~ÝZö‰¨I•¥óšüo²|ÜWÁ�Têäo+ôôþÚ¼Í#Y³„öµ�ã8c¯bÇ›xøœ�ZüM¡¡ëð§0•u[ñ·Ê3¸-<—„FA™?<Þ)<Á-Ò(jUWmgPé4žè#%‹ùúʨó‹Ú‘ €jfÚ¯ûˆ•Ñným_1¹Yÿ£®7À­ì9Qhiý_·ö\üÏ:·”bÅ�D?–Û ØreüÿÝM((T`�\Ÿœf{Ÿéìâð8 `Cð}ù=à€ýÿýG`÷Ðo…àÖp"##€àóÏsˆ<ᨆLçlÇ8dÊ™ÕÓC“ñA´×î${í°7# ÚÓàP¿ì� P  惊 �ÙHeÿ‰©œv$E¯®é4ÕyD÷pÞBQ³Ö =¿¼j¶j�.ž**ì¼×’�Õ©Uw€ TªsŽ–È†JZ�Os§·aÈè§î �E”ã¨Ö €$ [òëh󔎜DZ8ß�è_Õ26E§éÏ%âN¦�Õé ¼¸4ú­Ù7t_ϼ†Íï¬í7š ¿‰”±ò\•9†Ã/º?SùÀ<ðõ?9 É" {£�!ß’û¼}g€®»ÉÕ÷ñû[Ÿö¦ÿ×f¸#Aè\I/'|~ÜÂpJÓ_ žyróJïëÉÖv‘õ]ÿ+âd5úþì__@�j}µ†ÖålÙQ * …Q‹ïŒ(ŠÊÓ €DK@B¾:óœ;�e(@‰4]ÇͲ{‘›F�Ÿi¦-ÔòÇúL©•‡C‹²'ÛÇ{&ë¹f¹ïi+…K'« :4ñßJ ;Úçä! À´E›Î�LíU°>ôé*–­¸þÅZ¶9ìVªäÖ¬àÍê’sp%æ5ë7Óü§…'�™æ ªfc+™Y1q 0y�Ö@ªyÜ÷éLä~¸£-ɸ…ÿ»Ó\“GíX?¦zO&»¬:Q2Ô“wW¹<ë»gXZluåkã¹a�ðJnóµìâg:ìÒ$¯ñmͬŒæì”âîGH…©…Eû«¡Ó>d¾ù%Ø5—ìlGpÏv/Ÿ‡].ƒÇ8L˜®óD ß¡X—7�ñ#?åúyÔ¶\Ëô]ç>ZØoCÂÇ–6·!® iXú2I’®�ýëž&V¶§z^>ýa,�O’v3EI°^Í &ôÓ6dKcÚ²\‚*Açgf�·Äqâ¬VÑt:�äíÕ8MÒÜ„l¾lßÿG䬆¤Ö¿Û­¼ÝʶIB’„ØJ»qi'mœG¶¿g<»oX}œ•…‰Œ  ˆ±j5HMÖWµ“Å_ذÙfî­½ü·:×ô«¨Xjˆ!5OggSÀ÷Lm¨`§C•…ÿÿÿ¹ÿÿÿµÿÿÿ¡ÿÿÿ¾ÿÿÿ¼~:|ÒG@ÿðÖ†£Æ+þŒQíõOfç�µ‘-€ÑcÇúlLFƯ@ý‹Gïlÿô«Ü‘‘-q�üÕ€ Èþ ggX�ÿÛëÞd`"9{8@÷Û ‚Ê•�ÿæû¨ *À²À')Ëh¯ œ |®àPÀƬ¯ÇØ?ïÞvè¾R¤È p2/}È ƒý:ùO@âÀ\F´5 Õ„T)Èiùº$| &XžD†Ð-6#7  2Ÿ¢ðWg�N:8€ˆ†Ç%j�rmg�̪WÀ *!2ï"]€¨¬C?Q4¯Øñ‡S[ƒÈ”‰èÕÚüîCÔŠÓ2Õ�Eã· hd€æ€„p‚@‹…‚Õòyû£òcÚÆ�tÇij9Tg¯ärƒ¼O±qn`Ïþ·¦ô:Ãì ß© êš%€pBæË¶IuuTõM=}à<ºá:¸©³ïž‡š}=ÕØÿ¬úÑ„ÅÛÜâVúÓó?6èZ}Ćõæ”̶!ÍÏgòmHýâG¿ˆ:&†ë�´ˆ,IùžÖY-(Á‹šòZƒÞϘC£.]Tds(\‚yá7‡ù`ßG“UkúoíÊmOõÊ`S#�^ùä«Öìc˜à `-Uû5/^ÿÚ6â H"Eà ˜ýž¯GÙZ–e[4!}Æ0p�íãïd$8°2È—ºdw…/ŽiÐSBB N†zùm®¸–Ê;ú$tœ;³²hÃM¦s2�Ã�Q‹Ì€lƽy·FõcX¹žŽêêáÜ•©Èdæ5Söl+¶Ê-þ¥çÍÙÚÞÚðŠÕ'KJIÜÚcþÙ*¯GþÓô·øÆëc²ÂâN“ŸBƒµ&¢-VÖ:Óå­ÄF]®¹}E¿üŒ#çÆµïÌ…R#ãu‰É›XñâÔg� YÇ5ÝÉäSï_ÄÂ(Qì…!ÿøŸÄQKY+OóÄBähëÀ˜ö\Üðø¡îR%ø\uõ0Zú•¬Ÿ<ÑñêØáëó�¯²^]ðw“î'ÞÔ¡\dSÎøŠuÛþÝøŠ¢vuˆâ|ÊV˜�”G³þMkï¼³~u_ý’"ñV“Fãð>…Í7M£¥N\]$±cc±v³Iÿ-þ‡Ùšj»ìÞ&/¯áb%¸ØFÆEŒ—,öÞ =€\a½µ¥ÜÞ¡mÝóŸ’öcºæ%‡‡}½Ã�®\Õ=�Z˜OÄðçsª·|¥R>:¼ÁGB2:mü—k½‡�Æ-z§œÐ�¯Zj‡1BÆ€æù‘¢v׸uÜZ¿žö»íàÖ·–IÌí#n�Ü€üÄ›ÀõÓw¦nªQ«ÿ¹ŸP@­u(o ÀT�—ê×ß®; @ ¯ ýÑòÃ÷ í(¼pÀi(6€éŸ&° p¶?žvtSXqÌh`€€øº>v ÜB$ß´â8(²DÈM¬�ª'R~ûÙH* •:u²ºg@´öïëö€î Õ^Õ ‡ÔSt À‘�‹ØG{:Cš‘QI™']éÅq5 ¤îš™ª ¹CR°ª™™=#}K€ù@´èÆNùA…Šö,$j€’XÂŽ=Ƭ³ \Çïi@ãO8mÔ†”-T~?Vr•»-ñ¥1Á¸ó“ÖŠrß�)i˜Ô°Â·Å]mß.8ñÛGÎär„ì¥ÂmýÓÌöµQÜEŒÍó—­<í�pänoog’ª7Ìù7]ÎøÚ:ã�QíàÝ·kùÃ}€ÕXµ®IJ‡ïHÔx[Í')H<:…÷Š_¾"à©0´º 8WìÛ¶\üØ—¶,j5÷úYï�[Ö› _x´q§^áúG±ÕÆILØa¢iãV’@@5( š}Q³UíÑÒÚ6´ZMÂrìâ’?AyÂØaËðhÃ’oÙ@k!"ÉÝ nµËù56Û&0®P¸Éqì(¯£Sdζ&Ê¥šÙ‘ ÙQ{²?ÒÝÒîs’¯\ìÝUþ Gð×yV“ ¬ÄßFÉŬ*M2^DSõÓ�·›X»›&�#~øŸz·–@¯8âÅ—þ×øÑØþ&Z}î�«g§é/Å~=»�‡Qß0ôXÍmeâoû°=;Øè½“�þŸ¼<¬"ü<­ùÅ�wÿ×Y¾îù.�xrÁ»9Õ¹8¾ÌLb‹upú/�›¼¦ò¯`ê¹£Äzó?3!n¾ë6þÖ¡èLGgO_¼Æ(‡P¾[UTøÿ*@Žú7€†yäŒP`ÃXî&Õx«v·PP0éɾ ˆÜdéò#ÎÕ%A•'¹)@ 0ç˜(®0£û´Á-ýí³9®ûHv•8Ò™5@'§‹{Í?Ú)5àDÍÞócÓ^éÕI6!šƒìä¾ï’Å~3Ì}yL“M70Q�ÊêÜ¡ÝxJísh¨ÙÎY«v`M:׃PX=×ΰKê ±H6€'¸WÉ�îbüX·[}öJ“‹Û: páíG5·€|ñ³�Øl�ÍÉxí”ÞzI?³°ù^5_èO Ю´ó„Êpws´°­ƒœ{ÜŠóyK¾ rÂàÿžÊ þ‘=uzY²–�wPòÆD…o�òÛ ¤¦½Í”%u¡¥UµÎ4³có9ܲ ã‚/¾ÿô}l}©OdxäÆzv:B1⇵†`OÇ4ŸUCÿCx­³) ’Øš¢ƒ]ë󄽈_K�2‡�µqögM¿ÊbóçÄ ‘ñ~a5íoÈP]­~SåÈ…yÕ÷z¸˜z¸#‹ÔZX+1Õe…׎yópåyI[º[òï~Í© u` ÑîcšÕlÕéCÈ7~VúÏý¼ŒøZ¯Cõ]F… ›žFþoM �Y &£¥3’KÒÎ3§[ŸØåµFæ×IûÛLZÁš!Â.–?²R_mv[µ˜ÿq·± ŽMh”d´ôÈÚ…•!–gh>0UA–9„žoÒÉÿþqååm¼åƤž®/ÁáÞIÌHØ>tJù(+ñù³“ý¾w�Iî*ƒÞ _=Y× ‘Ã))ûsÊÍeñ.À!�¹Ë�žk;ZäÂ&T˜+4,PGŒ5RTH#óÒ%»ö‡j”¹^cLªQEeÒª]vš6C–·»ÑwïÓ¡>ߢæ€S—÷ÛÔŽ>òÁ”ñaLB:t¹¢rÜÿ—æP©Ž¾4eœäCó¯®�Ýæö;í>Û¤Ôu<ÄU­ïϬ‹t•NÆôuš´û(Nòʈ�� e¹o›k¹­ó6¹.4¸ŠëêGÓÂz.øÛ²É¨u²‰¥r¿óm'�I¸¥>:|Ò_€üA[ß„¯V %ÞˆXþã:áS9ÕFnÁÜ£k¾zùG€[£>í]ßmÐ7À­{×k³ßŬÃÀ­§{XPÿþ_¼o5€ëØ-7ÝÆ^yýŸSw: # =º€‘Èï‰Si/WÖ¿Vô¨ ì3@Ûú‡v B%¿BÐÀF°þÊ—@@å›R¿ð@�Å (LL’Ï@´Ž´F °€vÏfB“æ® ªTœÚNä�ç2ã9€"Ç»–} ©ý– 8h´.PPD))HWòY~~•‘X?·Žy@'7HK£WuØ×+²Â¢‡èNSä&ž@’Å+IŠºRD£U>ožøL*Í–â*¬NÕ=Òå>ʱ‰$Nˆ¥…fD=™LT ¦x/Ü& Ÿ £ê3Ñ8|Ž3Ø9PJXë8eÔÝÍ�.0\œ½ðv�ñî7îVÁpÈ}4·ñm’«ù  )üë=KóÄ�ksí Ýu‹Pí¶;w,ãÏ»äÞ\c�oÿ…ýÖýίC–dáEGü¶³EVß÷·Ö¾ƒ)rºQ4¼.×odå ø-�Ù[ˆ?6@ïÆ¶4'õÂÛYê{tþ+¤­^Ö½8Ø jШx–0!-E™ù�Ì ‡ý˜å{ZK²�/9pýõiià[FÈ›€¦­úÞ(€ÏÒˆ02fYp/üP6´­¨m‹ h¨GüPã³Ò{™ð]+/Øþ©,‡¼û›×òÅNéÉ{¹ð}ï=•–Hð­îíx$Ýù½u¥¡—§íî�©Ïg¶Ø0¶9ò2ž©oŸ¢ì©Ló'³Ó}W¹rÝ÷eåþv¾ìNWmf[eƒ/Ãío±æ‘­]†·q9d § 7þÏ=§ŠÍ›!¦Üè"÷x!o)YiÔÃþE”¹žì§Z?m@l�·°Ÿ„¤Z›.™_ºÆ�s�¬zœ Õ1ÿ¬T^ØHNÊèvã39ì—‚,äçWM´*—HÎW+õiUç[lžÿLF±"r¸ÅPììçq©x?dÍf65¢õ=å¨ê7¼½‚˜Ð†ÛÞ'µÏ“Ü·Õù©ñû]îoû¼n[‘¨ØTï²*¼ñn®VÆÇy¸^ß_9]ÿÅèŒq§GÈË&®rm·‘¯»}8>×[ˆ3½=c7lÓ´>-YÜú$¸è}ôf½þ3gn9=:«ºÝ·mbóÈ'Á¦ñÔ–±ó¨v/Ôtã`†7>Ù¶àÖÞÆ…*§¯Õ—¨åÔBå*ž:üÂ?âÃÊú#ù×JJ‰Oð :?å·¯„ì jÅ €b<~7ª¹¨¥`û±�üzkÞ7>3©yn¬ÿþ¹oý;8þÄ^ 7·þ)Yàÿöèd\¾õ1–‡/ùæ·SDûUUzæòo_z{˜6tDΨVM>²žkêßß貪„|‘Y�ˆô²©Ý§Ð Ÿ4l@ðü�°ýqVÎv=é�^„×C…ÖrqHGHVtçד˜[‹ÐMH²ú:eRrI�N¨e~³ŸÆëÏÕÃô—qŸU_Ú~3ä›.¢fCõCÿ"_A +µQšD胺ߊX´×û÷Ï/�Y43q€^Ñ43½_I|Åä%)Kh?ÞeÞ»O»Zü(d81WHGWï1Û ªY‰)+]‘¢7¹‘|NQ/ìÚ&ÀBI ¥õ�ÃûkÖ~÷ÊèýÝS2óì;ð«z~íÆP%ÈYÖ“^ƒà{ƒQÕ– Ƨ®rÙ·Ý'ršËý²eAm׆è¬ä àÎ3õÜ>sÍþ\ƒ’¥fÝæû�Ž@oEû�ãL_7‡ê·˜0foŒ<<×b¼Îüã£}Ÿ[ .KÜruLÿ-žAÿŽÏŸIô¬ù§µ‚°gÛ:!Á!ÊŸ´ ²Æ"¿Í]áy“ 8ö±†øãvïá¶’90�zDŽÑúX2-5¤ ¾çédžƒT£$K„ԟç#j Œ9¥\+‘©…¼ç[`ÄŒ3Æö¤ÔŸ>W(1’+Þ,<ôe½Ý©æöA*×ï”È÷2“®©kóJ›Ä·ëk!ßÃj+û™È½Ž('oŽ—N’Ó%#zÝ·¸P}V¤ÎáLªˆÖ¦,w­"ZVë³¼MMôÉMÊ5½jGÒljhÒ@bPáUáw¥Üú�Z•µ¯X,zÊ�y�w·ÿN®þi*[­Z±ß¶0hù¢ºyv3RÛ%i%Ô¬ù‰Ù3ó�v.©‹´Ñ]ëF瀋ÞÐæ¨»=‰�:¸ZS;ÊÐå ‹¬ò±¹d†Î_?¯LþvÞЬg&¯ÏlÃ9»XKÝ×Õ,^…|¥Í½=*èÈÕF–ExV‡KWån4Úg*±Ÿ›eYW‘ß®¾ßò´Ê-¢†<ß<†‡Ñm1Ž‚k¦ìpî7•é]‘©9ÜÚÃ}{yŸÿá—„`Šdõ-û¦ó�¯ýsëU«ðËœ¢^~|ÜÜp_�œ¥€+–6ůµÔǪëOggS@Lm¨`#Œ)ZÿÿÿÃÿÿÿÿ™œ¥¤·²­ÿÿÿÿNZ|‚ÿ�Iÿ%Q·âjñ‹}'€X«“$oãàC³Z¶=ÿÔQç¨7i°ñ¨[ÿ•‡ïÖ“¹4‰c€íØëTå£cЫ�£Nè›íÙÿÿæWïŒ òèßÓjÓ&“ˆ�‰òÉ€·Ì (ÊÐ\|÷ßÄB‚N4ZiÅ%ý™×H™Ðûì³Ë!·ä©7üˆ€ ØH÷_lUøÕ þu¾JpÛçæ@„vò+ ÔnZ�:á€É/ \mBG™ô2$«äqŸ Ù ù=ê¡4¿÷á¡¿’Úrú噇/ZjÄî$S„@jÒD.©�+ÿB®ã!ŸÛôgA‘ú.j•e—„õ(C+Åßòõ>zB5Tœîi~U2X–Ô˽>úØ–™¢¦f•”sª†$Ô5y0{h|Çã/®ÊÜS’’�9ʱóÎäâD¤Nªy(2AKÏ˜Š§T ÏRý(( "ˆQ÷‡3b0îÙV|ºôwzØí¬nërB}_+³g™pBêùkßÉ mÓNOûU0m86дüŽ?hŒ¸û$l/¤7mÉ€ùÄ“sxUwû_ŽR]žˆÎB+=sStKZO¬�eÍ|Ç=ó7kêŽr,ÿóÖ®Óê;XW½üúO ü�âuÈqœÛo}×ÄÙ —–̼e ÀOÎÄdî�ƒ�-uÏ<NÕÙ*¥Q=ÆA�´f[ÜÍ¥j3P¶÷ 6‡¸rŸ_ž=ñ¡ ÛÎNXUG3œ)ÒQ­d´mr]/(lí  ?»•ØWoNæå�|À©6³£ç¦ß¶ö(í�ÖéÚ|æo)¤×É[ÆÔ¡5q܈7Ë&Ðøì4kÅäÓ}{=¹†XmHM}cNz�à_�õ¯tñèq[ššÉK‹`Öª´]‡4(³ÍËa,ZZ[×à­] ØÏàJŸ4Í-<߯/…U±7¿fgFët[kØGÏ/©K¸Ï^Œ>ó:Ÿ"a.3 î²ò`�ˆ;SžqW_²}�—{))�w×PŸ ¤+âQþpg;Y7æ «çÒù)⺻½ÒÉ•þv´÷ßO@Cå’³f—œŒ8X>xÔ�Ÿ¡‹ÛuÞyþQ3)PÃGÇñ!Ÿ›‡8�¿2ƒ�Ëб³“˜•½Ïª\ùì—TÿKjAäúómíXX7?5@éS–�8@ZäÆ6¼†Á'}�5³Œ*V}xÍ�ÕóQuQ”ç!ò’Èêûsß²_=ÎÝ”GMÒ¾Œ"cl(£ÔžLêÕã\N,œÜû®Åk–[¾L… Öi|°Ohüè;þÓÖäú7‹ö œ¤Ïÿ؉oED¡°Õo/ ÎÌŽg?ܸ póàÆ|«÷ngg=VßuØ+ë󽎸úýÀÏgºG}Îôì9!åûvᎇ±'¢‡8‘Ã5Öà†=�é\{ =KçÆGѧ[×çm·î•Ê/axgCÑ8p�ÝZF|Kœý€ŸÏg·üU’úè%ÍÐÒ=WÎuýÈ €P‡B$ÉQ½IU=–Ø�þØ�oƒ–ƒ“uÉœ<‚ÌÝ�î8¸Ç5ÅuôÂi|->¤�Å„§÷�p§ò%¤g¨dd2‘�-9%­xª•]ò,SkÅié™Ës- ?ªÔIŠ]CR£J,ˆ´´³Ñ+FwW9Ž'çµÀq2jË¥GurF,�ÏÏaŽû¾},y<Íz&¹¼Ä†GØŽ•r ‚ðžÁ#2j IL�äí ÃãJŽ%êW¶‰&Ú“8ýÈtÐû÷Œ´Ó‹ÌÄ S0ÖZÏÿÉ—y¤K£g‡Ñ nÞËÜ“ïoºJúéÕÉ…ä¶M ØD û×ÅwØqYïÃs68ï5‘ãï@�¢§[±Mw=þ)ÂY¶¿pnòŸÞ&h% Ò›ìÛ”fõ6‰\ØP¸OâØPЙk—ý­ƒ‘±�éIö´—œ“Õƒ³/ªp_�v–1K­u+všÑ–Ô2¸¯Ñ­VU8LÝY*˜OÌY„[«ÊØ+×o±"´Õò¦ïÒM£\fj43î ²šLëhVëŸ�üÓÛ¡I�^ߪjWÇü'ç4(;kÅž¼£Øu—õ:àz{œÓ„¶—�r§µ:^i‡^ħAŠk–[vàB‡æT¹~=«ÎÁNüŸçÀH]CŸZWÊ\»kî½G>aP›ì€*�yÇÙ ©ÔÆåe\5"ai�û½Žp!wïi±æ´W=‰ž?ªÂ×#íI6øÓ�n–««ÙÞ¾½e�¯ßO¹êÞap%½Sü¥*Ï;æ †UåÙŸè…ó²›M -†·þÈᔦÛÏ�]|x®aÐÑ7Oc€¿þÏsÿ«Ú[ví?—[w\——×ÿ•Ü^ëó¸Ÿ/÷¶¿z:¯«Ë.2mÇáñ,û"}úïf{>»õÆîóös¼Ø^›Íj’ßõ÷Ú]^‡)¿¿Ìzu3Ÿg¶ÊûÍå¢Y±¯c‹ 㨲 Õq/¥¦mm³ué’êSŒÑ&®9þݲóðÌô{»>v‡´<k1.ù§}»zøû#Ù"ó<ìãì¼Í»Ç]Æ¢2Ø}“ç…±¶ºE~“Ƙ5ÿ¬�~ÇKžÜäâ¥ðvÓ¹¼T*¨0Œ:Ïß@lòGþJ«tûëÄÚ–¯u˜õC×~1ßíÑÕ>j¼wÜR­çÆs¯«Ó½;<yCøK�,]±\dgŽc�}‹�¯ýUÀOl�œ�oJ•p…¬?_;Þ÷›;¥ã÷Šù¨;%Ÿib<¹Ù«M5pŠ6éî9T{¾;­Xp´Æä›ì1üœ÷:ëÿ­áÿö¤BoÓ-¶óPbX*tþG—}o_6*=þ܃§uÿí瀞.;ÿï‰x¯»æ?Õ-–1jÔûÛ©Î0“™×»lhg 5unêQQÐép8¬<ñ°'¥$ÑïTÇ—ø]ÊE—C«‹[s‰Ÿáž^‡#FA§.A|Ä�þk×jšcbª›_»Ïþi~û“:Þi2‘]шMw-†Gþ“K›«‚_„*o¿@ü�à³6ûMy[^B¼ÆÁ‹ù'ÿ“ý‡/ÍÕ/ïºÓñ_Ng¸Ÿ5G®Êf,•égÒFtîQâF<¯¯ÆéÊ×/òÃ*"gO¦|-t�dW€µÕ›¾»o(¯–ÄÚÄ0Ùûää‘“rþÇ~~YU×kÔÑUîtÞãq$·>p§P-N%ñŸ¨nÿ†Z±R�Ÿ-5~žxþßW¶ÿç$Ùuÿ¡l*�OÀ2'Â�¼SÙþ‚µ-è�?·ÏþÍ£Çûß¼ï+Ún¯Wdøá³ËTFÞ› Ïé®uRŽ(_Cë¾ççFä�Ö]¹ÖSfpxî:sº,Õ ·Ó´£ÛÃÿž„æ‚Ú^ßñR›¢ý«ùOÖë ó6ä­ÕS5m%]#m6³¼_öžPZÐ͹µ0BéW‘›G³¬¡ú“4ÚŸ~ÇÅûwü÷Ï/Ð2$L2û—lý?•yùäâ<šÙFëþ¡ål°¯ý+Ç?¶çï£ùû ñ-ãߟ�Gÿù7{ûV¦£Þ‡k¤ÖÓ0:cöž»|Æäÿ×¼õд5¯Œ{ý×~óv¦ôÏ*»Ù~š!j#=ÿù­R�ˆª+u¥ý)rx6¿#¿Æ\Qå·>ÿ8ã¹ïdÅ>?>-È×R]Ó<,CãÖxO‡x©Ê«Õi»Þ­4-óçè�yŽ?Ž“1 ¼FïïæÎ.ò½]ï´ÙžÞK’Æ!ü×Ç·sì¿.¯?óeöâpRðéºÓzU _õn9hbüÓê­?åÓÄÅÔw ìÒk=¾¢ :ŒúœÀ-¨‚Òý3gåÚ“OãÖlƒ*çÖ†·0{ëÍSOýñºhäëü90Üú/Ïý9î½ñ§/÷›ã›•n^Ú+ã—rÕשÿÕíy˜öÚþøé¨åðVA=XOê¥ï‰ŸFܺfþƒ ®Mýì©!ÀM�µ‡Î®7`_«w݆ó‹Ç±áB×ý]eñÂxœ³:o(}Ää0mé»ë¶ˆÛêÕο¿[_»¶Ž�kFR$EÌTw½œ»Y¤$jÌE‘À^:¨|áWI¨Þhp§¯iTh¤Â� ¢7 ¡öY§ü?}ŠŽô"{6_úx‡Ÿ!·¨eõPbôè*E_ßL�9ªC:ú{d_{\*(dˆVçÿAm8:9D÷ÖŽY'Q áíïÔmò(bަ¯½éÚ x'hò~ˆâ tã Gsw?›¤«ìf ™=â˜UL·R5@RˆÌ¢Ÿ{L>‹¼Žj]�¿¯‘â4ÖîMsý½“"ó®q`§³;¥ýPŒRÍ*‚ŽdîÓs@ÆÔŸpí1÷²¢½Bu½¬Û²žQôø2Íú¼¸4ò¾™óBUêqïÿ£¬�oÉÃ�9„S#õ…ùIb3éŒ{W—|‰Lè¯ׄyíuÐú©ΫÒÌí]\�æLÉç]òJÚ~š÷7ûÿ²5â7?kpŠô«>%®íLæÊÿ6VËÝâ�1ßæ ?yÙPs•YÅZ¶ôd] áðqJÁÄÂú˜Z=ÒÂ|ü=k÷ãõ/:Ÿ‡sùož÷Û°?ï—H^•Ov·<ß죢Zþù¦ÿíüå°�_·lrŸ¾Cm§äV�—9ù]–È}Ëc·ôõîxü–ŸÝd…ýu}óÌãí^âÃáwé›®z¼>«ß8ŠlÛ÷Wg.äÇýÆý嚎Ë士ֻèç°›sÁD€­æïó†s;×�ÌIkÀ4›^u©OggS@Lm¨`¼N�ÿÿÿÜÿÿÿåÿÿÿêÿÿÿàÿÿÿÕ^|ÑK UIžk#§Ã}%`tZú£¨äšÉ@G<½_åPs»–$ACâWµ*þ® ÿûs!@(\€¬¼Aè<õÚ€^Ùþöö�öhNä­?E°ÿ‹ùK/þ |=¨vüNBÀ{¦U;-ÔØBž5 õKÿEo¢§5€ÎƒÇË ˆf-xhì°%Â]`²Š¿zœŽÿLº‚F¾ð¯KQ€ÞHæÒGÜ Ph R#Þkë(…’@¼RXÖpšø+©MV ]>CÒDF!2÷!˜�nbÓÞ�s?Gò~ÊíƒçráN9ŽHµ|<_Þ‘éÔ¢èÐpRù©B °@£ìÐS™Çµ:ñ}MMâ�SÔž:Cj¥ò(³Jâ pi£¦k€BsoG� rUž¼ÔÝ1™Çc¦xe4Ù9ø3ôƒß&3‘/…SRŠþ¶3ýFS»è¾åÖò»íÈñäˆjeÖµ¥kö—•éh^÷›]5 úw|ºKÕ}ÌËz®Ànž™tÀª}“æÙ`B54WAñ°µ–ëëJÛ#’SšZü…o�kËŠ<ðÔÕ§<^bÈO]]ÕL á–Õ§‹`mÞ‘„¯F3…³ç=¼ôÏŠ4&ÞÈè£êO©£…w£ eiø÷íoؤ…ézGŒ�hëuK½÷­ùü]”¥EQı{¿×»CþYûóùUÎM}Ÿ›ÖZÁGÖ.ëë*~Õïõñ—æöÑ-m>¤^MUU±ñõÖ¬‹¥ù?Uœ:Ûóú>½š!TN!ÅñÍì~qu�Œ^$Ò^ä»å“µo»>¼á¯Ë›l¨™„oÄgJ"ªèG%™kÅ[Ȉ§³Ö­µÀ…?B€(€À�ç®ÿëî ýüÒÿÒÚM7µ³k°Lƒ_öÓüï<þ�°·{Qýï R×Ûàñì@òOà•MldÞ38€Ÿ‹è-ÔoY7ƒ€‹¿8§Íº žz Ž$ðÛ­ÿu åhÄ·_®ˆ�wÞâQ?š$ !™ï/í$ÀF‚DW€¨ÀAIk­‘sÔÑKsÙb„îÉ~ È*P5j÷÷hF‚:@e½Ç¶U÷!ƒ„!Ž££å*‘šMCÈìÜžHQÐÂa¥÷s¯AN‘'ÇÈ`®EEWô´fï’²›ŸÒO-”i­tGµPˆŒBÝî{B.¢(â<õ$:&Iê£V�Z½#ƒ�Ïz c^W Ï‘-�€ÆQˆl諞ÔMòÞÀ™z8†BÆq?$à0€„§Oü?ù÷²k¬Û¬IP8@óáü¨4†¶åÑú•p—-.¹°ïò$€/ȉòËÞ¾ézÉù·DñÞϯ^e‹sBÙµ=÷å(”ïEŸ›ðÝAõÅ2ÖÒ/©\mšS¢«ÿ6�½ÉÑËûf½}ãDÁ=éîÔÊØ“‹?úòâÙ¾ÅkÛ ®‹¾¬î};Ñ·ãÀE«b'e¢ædÓ»ç]Ã)K¹îç¡Ûè˜dŽ+˜0:«É!G¹V®“zÁOº¿ªð¢v•ÍR›ìäù=’ĬìddúË$‚Um�—ù¬§Ù`FØßÚ EŠ„1ñÁØŒx˜[ª6¿Õ,ï®^gíd|V»£ï©1 ÷j®ûÂÕ(šùþ¬Uj`æÑx¯P:²v¤�\€&T]™±×ÕupJú“§j?üÖî,| Dt¬~¯”)²‰^:ùé<5ŸÁE?ê]:ÒG¾Ýôú]©:áìÿ‘Á}‚ŸÛ9�Ľ.,ûíû‡û(m=öjVÚ�C·ª›xšÁëe"<©SUßïË1ÏÏŽ—ÇWú¹„ñú_º”7°¡Ü îJóvºx�³sÏ]æ®iœ9Ë.PžšåfÒ’k[¸®Ž6Z8žUI³^?qød‘÷3y!²¬M� qïZÏYmù éÛcÇÊ+ºPom'öŠž’|ä[U·°ôÛh'ö©žýCêÿÜÿ÷Ôîºá—‘•‹{ßDÅüÛþûÅ�Çm³ï·>I%²Š³žë¸ÉèºUíÞ»ùläÖ°ãbùv<øz>¾>^*|’ß)iXß µ‘Ðâ~�€ÿP+¹ˆMn\=†KeØ~ŒD¤?ôœ ò9Ïðíù=>»uLäôSK¨½¸/68‰»ØžUüÿÕE «Ñ%ñ×?¼éÿÝ£Qï[ESQø™ hÿªò­$` 1í¹ZƒOf’ga @Ârä¦ö>ÛfÉS#+ ?J®c@Çÿ·ÍÇ nÍ(…:¿õ šˆ€ŽÓÏ @PljPÅK¶_&áã�Î9IR«B«ŽRO«—ço~·¨ )_žƒ’5Ñ‚úd…Cí:/½$4j­úFí¦P ÖZpÓ àÌe„¼N( BAWÉ#uµ§"Q÷—Çáµ{Thf.HH%þ…™LL„ª¶„;IºBœœo" �`ïË7™wH1IÌ-�ñWK}˜aÀŸÎ&KU3ò|¶¶D]üÖ:÷\~.ÑiHˆL"`yÛ-øpª_?9ßÄ—ÄV`ã†?­YµYq›‘…„ÿ.Ms¿ƒ½ªŽŠ=›–‡éăÅÁ^ø ­of,f¨ÍkEws`Ì*óÞ$ãÿÅÝ�!ý ¼�Uþ§™Ð\×£ÓØ;öoè>ÉÚF6*ƒÉÊöÝØ«ø«ÚÕ|¤c¨bO0îíÇ™ó“Âíò¿—˜§§÷·ýíü¾ ¬s§¾nP;¦uœÇg²6çmî—ë{ÛÍÒ�~ËÓÉtíãv÷} ÄJ×Vïž$_®Þd ¹Ý“ I /¹ðòÁ~v�ÞMhü5JC»É?—ï´ðÌþ1A4`°}T™U¦‡šZñ†K-,?¢Á€: |.jü}˜2žˆø¿kÇdQ(=9où¥o&¼†£8ìÑ�SålToj1Ñÿêû¯.Kè½4²ç][z•Ø�íRãÛ5.î”3Æ ª´õUÊy¬Èu‹„ƒUyrü÷±zÜhì�7Ë_ ‰Ï9o§Zϧ@Rê §j”�‹’º1j¤¨ºzðqö©d.“¡9ì3W7Æ“GÖ¬žçu¿_ÿ�3[=^š]Z ™õ±7«ãïÔ×±ÿ.ëæØø83ï+Þœ¦Ûl Qèçk�ô¾*üÀŸ Gyy3ÕLF‹Wô• ”§²§Úá@¼�z³– y™o€[ÙdòÀM“øOÙ6øø¯ÓÓÿûÏÿ½–n5<èx`{ªV?o¥"Æòɯ~ùõîLøZþa@'ð·†à„üë£ÿçvû§¯ @C€›ÇLÈ_ ¶€îT`e�w½^““ ÷¢óJ€¾Ž¥×®Ôh±<2Å¡óÛfµ@A�â‰Z( ùU€Ì€µ'pr ½% šl·ñXšŒ}ÿímvÜœ'‹æ¥œ³æï¹z Yßz!OÊ�tâT�Ð hšòüI„zGf ¢‚̳îçD@ Bôpܪ'wþê×[B_g ÒâTŠl§NNUÚfeô#Q¦÷ÕjÿÜF \�ãäƒíûÛ�À Z{©„°Pñ=¢�é%xL  ÀQš¬�{¬§C¡p©²ÅàÐ JÂ9ÉïÎ܇ýßa>ÓGXÝ�ø6IðÀ =:°n^5æÈ#T ô晪ˆ�f†fÉRëõÊ§Ýøz#ö ù0’7ñp©€ÇDï õ‹ÒGýô×8Õ‹Ùì ƒ™6·í8ÅìÙ¶5ûl µúßf8;;ì{&­âæx¯#*�jäŠú^E,`ÏÙÝî'„æñ Ñ\V%[ÿû‘�¹�òɘæ[mãs›sõ¸}}ÿ¹÷§?¾ \ Ž©;ŽGî§n5_åcãYÝÔìîË{•â¨/:¹{.§ï§ú§3¶Ýç3“»qèÿBm—ÆÒpXDã Q½]9›Ä˜coUÇu ÿð%¡0­`Ùw>DWC1~¦[±Ú•KâÆ§yšV9¿üs|G•ýgÕÕ튴ÕzR­¦÷©ßçúî¿yš‰ãS¶¢mçû¼qßi…(òãXSW“Îâ…ø@0¨n¶§?ùãºç:ÖÛà Mû?ýºu!´õC%@·Nà+žœ£¹¶~üÀvŽ‘'Jå×'ø•»³×ïÿ¾6ýÁw€|¯­ð¯]ç%)ðÐYË*(T&{¨ÜúÓÀyû"eàQz|i*:!®k<ü÷…¿»H·Ø=µþ£xÀù:9(_ÿE8€ß­4­è…󪜦�*­�í)�Üñ,×1¤JzÿJGE`ÙF.E Õá¹ T¨(Ï¥ *)_!jíê€SáÚ3©Px‡£¿AƒZ+ÙÇ…¶9PrÚsÝ>Ûøè8yÏs× Ï£Öžº§�¢9&¾w·‡•�Àƒø&âò ;œý‡p"Àx>”€ñ@$ ðt0µ“÷¸Ý³üŒú§4Q“Äi7e¿6]¨¶±‚[oSõNÒ³çW)o5l|«ÌMœþæ³)¦f²´ÅU0?‘m‚™l8|.Àòç}1PÝ›ÍD×Ù¡Ã�·Wl]È· ,ûM�«’¦­¡þ�N¸ªä«~AÅñü…Ž1è Ç¡™³ŠÒçšèÙ¦¹q´Þïàê¸ ¨¯~T½tÛ¤Þˆ´Ê˜ïÑïùÂ�&᳋²Ë‹¶]Åûš 7 Î�újÄüruñ¦›œ?q÷_C«ŒÏ…šûÏ1/,Z�W€ Ç9ðØ<‡—BcäÕ³TÍѯ ·%H¡Lâ;-‹`õNäI6—Xv”j¹8ÎjP¸n7Ì ÑùÙrÖ¼£³M Ê]6ycÙ9ÉWîséS/²ðòXȲ&+ŽÏí7ÑËl[ëH3è£×­DÜþyÆ9`ši1+ŸÝšž—HÙßë[xソü שéÇZ‹Ó^Ìh—î·ðÌ`£¤~Y¨‹ÄõórK<ˆåP?F¢£;Q-~;ó]rÒæ¢LdxVO;ü�ßûk¼MÐăªxKdé噵)Áv'êÊö·¯)ëw²+Ÿ8÷-øÁó ú8'nœëK¡%kõò·¨ýÅp/ƒbJÍ)/?�)ŸÌ�¥~×Zó«Nÿ6–$ú÷$¯ýý /™j�²GÌ´ñQ9ƒ ¹Dz¿ýùÈ•äß%»»^F¢Å@P _¢åÃ0Žœ½³]6|lØIÝGDEš3gCµÙGå|5ÝñT&e|™¶q–˜×㫯ô¹¾\“„Õÿòë³vSà|¥æûyÏ]»Š’PtS•W…NÔ§p(Ÿ0{ß­ý0OggS@/Lm¨`Ì3%ÿÿÿ¬ÿÿÿ¥ÿÿÿƒÿÿÿ³ÿÿÿä*¼_q'$ ÕÔð“xã>S�2 6r0×­1à©ó˭瘣.4¸ÝÚ4Ah¸øp ´ÿ~ú?ZÜ$î ÿªÕ5Vüá?ÙLÛ¾ÄüEÙÀxÀ”g½þßo°¨ò §�é ÿífn|Ê89F@{í|K[hª^8Pö»UsóÛÞl�«´(”À¤n�Ë+ðjŹý÷ Y k9q‡Œ|å¿�  ¾ÕŠhªöZ+ LçR?Ÿ{ < YÐ’;ÚCÈ—t¸” (๯�P N¤V ^ ¨°@W¥€¢8~#ÖQn€é) ¾ìy Vð”„dš&-mù’·gÀ˜é[à„€Ê:ÇWøjbDÿAMëàMŽ õšý:’–PxϦó¶5à¼ùªÞ40ûM€[­®¾¿U—ZI�§È›+¾Ã¢©,÷aÓ�t½ÎÛ{yåɾڌdå�ÅÚÂùï3û?s�\•&ÇÊÌÜ)}îäœ&›WØI0”êËûÓÁˆ/å k´¤T\›È‘a ¢RË«Ã8eúÒ³ˆJü$jÁŸ† ¾xô'�ÿ2Ö1 ý0!•üÆÄÈOT‘4\ùŽß'[E®¥!0—«µàXù8ü5†Ìœîf½óŽÜÿNÍmöqúAMÜj3¦¿pç«Ñý{ú›©M"¦ÁÜk�Ê`HªpÉÆÞè!Ä] §­VÑuñ8~þJsãù·rHodj¸€g:8Ï«a/ÖÃÐàn¯¶�1»Lˆh•šF™EX†‘S;}\HF‹Ðòÿßázó-8$F÷Ù |0„Åúé+J^ÀÂÜ6‹÷JŠMh]Û4&h) ,I”À�Ó¼HL^šX 6-Š/Œý�� à`‹ÝBÀª(J¢-@SYàØ€† øzTºíÞ±ÛÆÉo“F…)auyÊ·ùþõéúûáyïm:dZ'V6ÿ„é÷òëk–©”4K1¯æ‚¢P]Ïùþ´Ée<ÖŸ“3­ °j��r»Õí/î—ûùtôeR6.VÉ#<ßsí#ÀVy¯èø;to;ÖBÆÓïý÷¯»Ñ¸iæ+ñöZ6•Š¥ôîp´ `àæ‹Àþ)¼‘_Á� NLB…Wò3ƒ�TkÃ-`dòµâJ‰i]§{‚Ý¥þò‡¶ ðõ)zå¯ô?i=¹©iþêqjMPû×o€¬ó“X‰þîÑÞê@ýë`é�ó™ÝP8ŽÊGŽØ^Qõ_P©5ÈØ —ìcØ¢ÎEÿŠTó€òR೦m!€Àtvá@…Ó·>¡-lë Ð ¨�m­¯¶Åy{hGmý!x]�„¦€( âG§à¨šZ0®çFgtÄ¡¢L ÙV… $æ°@E‘O¯‚L Ñ3æÚÀÇøa@%�Ÿ'ì€~ˆÐj"Øt*a€B†ˆ á¯ÀIÂI ¢oO‹œ¿u04y~¡%þ,¶˜Ã[ÄçÜHٸʾhRðúÙìúzwÍ/còKÆ·ƒþíÀëöìíÉÌ—[MÉ=XHÙ•õ2z‡åñížÏ•›ÏàæT* ¿±¨ì…ÌQÒ�Û·âŸÔ +¾õÖ�ÉÛ~¡¢žN÷öøÃe¨MÇæ'ÿ1¯ŸÏôÈPf¯á€Šùÿ¤ªª«^(ü7ío™Ø~2^­V×À¼5ămõÊ/I#�÷—} Çv&�àƒL¸}—„MÜØµà&ï®ßà¾ÙÛ|Q0}7\À:,¼ŸsŠ—Ã39Ýs+7·{»ü“õF{yÞBÑqú�û3ôqã%Pki†‡/$_6?óÔ˜ÕÚÄÕ2'Ãj»ÅutÑ¿�*kQÅ\‘ÒY´€P!{û¾O¬aÑ¥‰ÏßÉÛ‚ÙòñÖMæ�Ýå>„ÉmT;[»§Ü]Öë~6—¿|ýsýÝÙúè@/û-ÍEYláŠFÞù3Ò0œ2Ê—ZOÇÇ¿öß—òóÙüsY~s“"Χë¶.&þào ÏÔP‹Õ•h?%À¦ÿ�bD! ç@dµ ³÷^+/1&gŸçœ×–%,n�Šp½×@û± X¼%>I†”€$ÚÑ£ž†D›¦Ѱ(‰ô>Š0T˜)˜¦*ß@XpÐ’Ñ$-ó"Q–âÝÍ„®¼ŠUÝ·>­ÚâöêyUÙ٨ݖ›êÃþ°ûÓ{˜°E¶7˜ÚËCx—oÝpoáºG8À€â Y©*:|_)jÆÎá]ùˆZYC¶[d ÈQŸ0R¶š9Ƹ w-YåïÓ…»NjýðÓªhEn×Â:-À7€› �ÞZ]Ð?q句ù#æÿ³jú… õ¿.h€éwàšøA Î š÷y¼õ¼.@`P}x]ïº@Šà a?^¸>ÏÍò§’X>]�âP(-þø}( ¾£*ЩEÔþv /¦R tqRTDŸ=ªp _áe! Üd|ÎèÈl22ý+ÿö �#'1z›©ÒÚ¡øíSn· 4g8PPDW)Ws”+<øÑ0Çc;àÀÑ= ´—•Òßf€ôÇ«¦^pzhw]ì¨1ßÚ`Y"À®RË`HSЃ€‰#€•1F[^A>z¯\vº×æL4œ˼3bKwîßåÚ÷“vï§_3rXÀÊk iÓê¦ ºžï9vžH“' cjÏ¢éz7¸°€íçö…Š<ÕͺY\Z¥��†‚z×~ÜQì�c&¦KöG}³^ùòÑ _/� +±[•§l‡÷tìô c}<À²"?C[pÙ¯Ëç× ªù{ª.ÜÖu9?½Š°ôe�ÀŽ=ì5^Ôº íÝrbííÜ“EO¯çeß(~ùÿ»å±;K=a°™÷~„ç7j½êšß‰˜ê� {æË-Ëû=üæ+WP¢A__Û)Ü=¾ ½�wy¾´å §Ÿhz±Cë3ÓŸÌŽþo³ ²û@*ƒ5ëJ¶]¡_E£D˜¨³¦1»óþÆ;´š¹'¼Št#ø’×]v5TW®·Éç±7ûæ_Ë7–�Ä)³B»99y^×Ã&³ÞKîÛ„ÄeSå$¿Kù2�ø¢•XÕn„¬¯»'t3@0° ë ÅÅ�™Å,¨à9"Oεˆ4Ìz0”º{¯O‚(i´i0áro°77d¨:xÏúÿ7 Hé¸×2ias›¼Øµ÷[G–‚a ê\ºáñš#¿©á#|èGÈ +Q“aj¦çžÿÀ)tc¤h–‹Îèñ7ƒÇî %*O; eA€B“SèáÁM8èâiY«yž9ç£ÜÚÆ>_¾Ë6«Š¬NûdûÛ÷m·4iêÄø÷ªíªîÚ~vU|¹L›¸öÊ]ž­W\¾›ß0~ò�d‰U£Q.Sen�Çεf›Ä“,Ï_÷ÜŽ@È6ªHòÞ9ÜÁŸÐ¶ÔŒ—ÁÙú“©DÃZj7É ê‘O>èÖÞmÍ×w=°©×Sßû¶’.°Y§‚H®çyȼ,²Ÿ®Âö‹’Þoœ¬»¶žýj©»ë¿ðþºÌ•íÅj¬-$D÷cê�Ü4@WQcCXÙ{Ê3î̽j2iœÚ]E�œâ‘\¤fºš¡§‡üH"™Y¾¡‚8~Á{íŒÛ÷êF�ï´‘OÈœžá E¯ªs§ðÄN§ò¤¡£ßƒYÜ-�;!�Ðe¾éîùØãw çBR©iȆ CLQÌ:kƾ‰÷&ñ¿üĵqXãÖe½@Þ°L÷‡M°�Ïè0�þý~·¢Øñ�OËõáôSëÖ[¸Ãž·lj÷=³LÙ׈—ÃA Á× ¯:öžü¼•èO{ýlösßè#½ Ùxºòý™€tZJÿHl·òÓoó®•£¼¿yiþ‰™Ýÿâ"_Mñü–èòè†ÿZ¡}<=øÿ ƒZs÷ÎÜû-ø©3!¶;Î&KuÏÄñu¶[—y´Sâ÷É:iayÌw<”>óÕ›*# æ¶rû ~‰ywnÆèÂÛ…5ÄŽ¯äL»¿œµšìeü*­5ÙE² ¼yL'}ܘ£ÎãÖ�º†¯§�Ö�§Þ“ö –¬¥¯j³J÷v¾¨¿oO÷�×`ùÆžŸ¶îßkÞ0[¶ôÇïþ@qÆÖ$î�¶p·ž¿ÓŒÉËȾ¨F�É.w5– ~,ã3H¯S��¶�5°nš:È`÷/4nëÌ€²b±ˆA[µ$Ët"’Ò‰WCLqcÙ¿ÛûȹzŒº2¢®Pƒ`.~)=ûü§Ü¯l¼mš�§‡£Dñ ñ—Zµ蹌3›Xþ�S²'LÇG”Öè,ébö;]í,ž™FïâFµ¶]¨DEÂëÙ›OžÒ÷!çoçf÷nà„÷AkYû æâÆAa|LŒ³ë9i“l:¦‘‹êòð¸^Î÷ÃfµÞ|œ]š¦}ŸJA.9›Ì€r³ó¬Àº\OggS@CLm¨`óß`ÿÿÿÙÿÿÿÜÿÿÿÆÿÿÿ»ÿÿÿ²ž)œÑï0ÿ­R+ùèWÂ!~ 6²´üâÁîêR?ñyë¡ ¿¼ëÛêÔQQÀô»>ýFƒºð\Ã)ú øðäBÇ7“»›z²O¿¯‰OÝlú)¨‰Ç-Óíü·�Ÿªä˜®:-«gÃðaìÿó›PË×W‡jÿçÐã¿k Ä ñ±¯²P°…‹¨€nØÏ {-Kö<_·GCv,ÿž ÿ�N;|K•¹qp (êì.ãÕO¥ásíŠ@mçg—8$PÀzì‰g Œœ €JŠÜ•ý3¢o|ÎЂQ|;ªy ¨Q,iÅ!#Âcm÷o9� †UmïÂ1÷3úÙ¯ZÑ.¨¢™D/LÑæ‘÷L?&̓$‡í…S #€%ЇÆËñÏ\âpHŽ�¿eø¿] §\½ãjmRf/Ø•=Ö�’îA¾QëVV\Ê\ÆÏ§5�Ï2%kW¬Àt�ã­9`ˆçóÇG¯ýý¾²]×=£íÀÛZ‹€ À×Dö8ùû«/»‚� žœÐæaBlÇGMÍds¸%?Jl¡ZQ j“- õë#ˆ-�²üðþ6ë(èøyh âÛ  £â¹æ€³#úeÙ7>œ¿tô¯ÖìëõúšøÛ› ä:íl{f"ÑÏßþ{ Û‰ü°í\¨-’®­ó‹«¾¹!n󪶎ß$uÐ Í4™Þ×vP}ªR°)€ÏðQ_)ðËf뀇êýx»—:žgB«k�8$¨üëãØŽÃÝ¥k�ßb¾Ú'@¢À¬ê P!•§Pð)ÐÜþ)5µ: Uˆ½µq>ª(µóë³ €T¨² è�T@¦Àq$Î*€xSçW"vÉ£¡ !…呇½FD•½‰@£kùI/µ  æÚ™Òóþ¬ŠÔ®ß{W¨N<ž‘N¹–dëDCׂOÉØ]äº5çº÷¢`>P Uƒ ªx†pHí÷áb»1º�±«Üj_}Ï[:ž{„¡6ÒR}n U&åNRuØ’ñæÖÍ4í,oÔp9ãŠqŸT)|¨R’„->듎&ùÃLêÚÄ_ÜŒrÔ45­MôíZk5ÓH«t÷ž|¥/Dqe ÐõÇÝŽ~¸P¹kÅ›çÞ�¸Cµþ~KÒ'Üi½¢ŸðS‹­�9Ç4\X`¿Õ'íû†wùöù¶"7m|>ßÒ['6 RÊÕ¤F\!§³-sžæ:Û껉10œ¯'~ºß8«ë_6L+¹å¬Ø5ùúÿnÅÅøwàx—h|©iP�ý Éý¯(¯&ÿÖè�ßR®p:¢øèò·T²°åÿ‰XøU#ëéQÉ�d/«ßß�w½õ�þÅò!6Ì­ßÈ^²ö,1n ññ‰Í îöK1·dXâ:î¬Fe1·¦³n¢K%¼uêÅYó„lÌöÇsÑ—iÂ[Å4Æ¢ˆ�yº×¸ËwøV¼¾Y²çÏã‹ÛÁ�¯1:u¤30Uõ¡ºø+ÚêÔâÒ1®$Æ=™žJ_ƒ» ´#_$=÷y׺~¹o> Þ§N”SXö¶ Véõ�ë”(Üofåü¬0—©]“,Ç*ÐÞõù_$^Â÷UÌ„ŸTœßDÿØSAî.wü\c¦Šó󂯘©ÎdòË*§læÕ5\½ñÝíë<ÿÉ¥®Éͪﭗß”àÞÃö07ˆÈÌZ(ebyK';RÔµôù§Û/Ÿ|ÐÌÖOÜd�­[ãÍnÞÉ6%ëTÈõtý"â|c-ìº/&�:ÈÏôÔ}*^<x«JÜÓŸ]ü]1¢´)°ÄæPÀô!—~kº€¾\È_¡#s´‘25“Ñâ�øŒ6b¨QCãÀX>e-žeÕ1mZ¿M¬hÔßžrÁ)S{{J[€ðá—¯ Ø�X~˜â¥M{ró)dƒÖNùaÐÁO¿ø¶“–«÷¦¢æQß,âÇÏW¶Å¼]™|�é@pIðŸÇø¥:–hxÞ”vÎ(¨x#T‡�Î+œWeÍSÐiÄà£ôÁ|ýŸ÷lÕltÝH}þÕ*4V—ùRò”ÖmjÜU£§ZC8Yq(È „lsù­:g�§6—_—Éù#xÒ¼÷|%;®çöüÛåàT�F€·„Çãj $¹âLäT@­@=̆©™WŠoþñ÷ìÈÌ ëp7wï#õÎ÷Ñè®´Ó$èé€ý›î àÿV[&µ_Ô¦ËIWòou×·÷?ðž9<ˆÏЙ©³C“Qã }Ç"ÖNÕž¯hÙ{L±¨ ‡Þÿâ/Mê*©Ä¯üç‚ÚùÕVããÜ´¾× â_wµ6¸õ Skê³�ç_~âWrÓ³ à—HßüËÛ/ýáÈ0m]7ëß 1õL][�?ü�ííWSy�Æø@© �›FŠ*,c@UúéZlQ vsR@í¸Ã—Õy÷P%�Ï ¢ ¥ö˜?÷w²kÄcÅ i`�_­uŠY ¦Qrfƒî9C ¡œ<ÆsHašÄ#{/W#³3 å÷Ó)Ž"²äDßO?ë’ÐÌÆ/y"•ºµ©� ¿Sä &v¥ÜÇ ªÏ=+šÙK?;rþ�~,¦Ìë�TV•àï•þÈâ0'Ÿ)ÏÏZŸ2,÷Ç–žüM_°ý-‡–vö³¶tuö*Ò;0 �—þÞA €€¥ÐÙ„ÎøªÑþ)Vâ‹Ò~ïhqO0µŸäÔÅ9WÚëœÙnÞ¦ÆÍËï�³Á¢Ù—ÍhƒTx6ûdT—.ñ­k&kr”ªüÛÛ<—Î Yðz•b°šœÏ]ô�×ó‡ˆÉXÅÞôצ|õ:NõúÙmLj¼¼Pqr{þÏ>aàWp½ñºMvrsj/^ågV 㯪m€Ž+êr°"OÜ×s-ÃárÆ‹iómù+õj.¶#`ÜT%ñ ŠÖrf{¡[„Šàžéýe ®¾ò7q÷‹¨·ÜA]¼Ó¦S /Jh}–Û¾"ý!; OwúôÊ\°?^Øwsò)ñ½î·må¨KÄËL{½4a˜í'‹ß›ô­qÒ͵h£ä•êe«­ÃØÄBhþ� ıÖXüaûOr—i‘E±�à^�Â6g³¶QÖJžE'}›5w·FëSÖ4K–kq®2‡:ëšè2Ä™£hs÷_cn›Õ¹Ô$i²È™à³®F›½2)D\ÚÞDä©1ÁëÀ§`Ú [£˜úÛ" ìß\ïwåZ«÷”ïÚ‰£è§�5O~šìQ2Ò»A¿:sǦÿ¿Ãd·3C÷Êh8§øAã[¶�™¥f�—}ß`ÔRÚ˃ɤ¹1I¥ˆÚ‰X!2šDìáêŽ ¥ãy-^iðna…s›ñþùI“+ü+&/\M‘CäŸ µ€m¾�blZ¿7ªvîhõC©NU0=Ï—å”h¼µ ð|ížé4¹)ì‹EãÕvö–Ž3Ø%u/ñ«VÍÛ’—‹Û£~äRäëþGVS©N‘¬\³5%~‡ý’]?ìuÿÌ«ëUíŠÚè?M—Rï¹Hw.”°ùvƒ{�ôDËõ¶‚PÚÓÂ$¯rÖ9óåK³o­ý¸j¯õÛ�(Û;þÅ<Ï??©±]·½ùL…2uݒ͢˪/ˆBö_�ê¸CÒ÷¾Z«ÿ˜O>d¨¤‘\~£\òÞø²þ4Ÿ¥„’$Ï:ƒSGÃao x§M«×ƒCÁðÄÿ«|¥îE� h]=™4 ´Ûsé5VäMž6µ¾¥G|'·Ëé´mçùw›ÚZœ¸b1Ó°7¾\å6 OáYøÃ^ó¡�C:z­ú8]_?Ÿ y”º$Ø$·ª< 6^ºIñxRÐÚ–ò›±0Z»Ü²ü줥&r×»¼ÿœ |+M_®˜5éŸ_¹OggS@WLm¨`—~ÒÿÿÿÁÿÿÿçÿÿÿñÿÿÿÞÿÿÿÿž)ܹ?ñ)ŠC“Òã ý Q†�6y@·sxàn‰[Úmgÿßs<¥¦'ð‡¹ÞP'quÔòA\�¡FÜ<ÿq„[˜ô¿õpƒýh€6ìw?¾@L'Ÿl!ÆntEÖ¦?õxí÷è®Ä>øeRk1¨dñõ_[Ï©ö�« dË7©ýëÿsݬõk4(ìS�T” yÈô¬æëS¤ é~¸ PiWý¿É'EÖzk�“fï"Iç·Nq� ɱçvU J…p×#ò €ÀüÒ5 h ŸW€‰ƒ] }‰\©ÝÊRÿøœŸ‹ö§"ôv4QOdwÚ¡:úZ§¢�CSÑ‘§.T‘ÇÃüI½!rô#ߪºÉž„èlèZÔ<œGw£uªH­d­9Iž-’¨|C�žkªV¨M#ôÙ€Öz kÃ^@ f7B7¸ÉœS`)Â'7Vå÷!fR\ÿŒAM9y‘Û«ûËue.ªì�›�úMõp¿3AXÌ~ßÕLçmðÝ»ô׆£6×éÕ<±3ß\ºì�܉cÏ:©“mÃgo<º˜oÁÛ¦1Ú,9í¶õãÓ²uH¸eN›éSÒ<·Šq*>Äú¤‡½ªOký^í–ŸU¿Àgâ¼Gš­7ÿ*»¿9R³Ý9ÿÛ{§½ôjßþ÷×>¼ñóý]æ¶üya±÷yÑ7Ø8¢³Ï5ÉB¿¸8GØ�vœâ3s¬Æ£âw]g53²9ïQˆñë’>ÅBŽÝöµ¦ïkr^+ê³CocŒSwŠÙƒD›ÏI÷é­_$;Vøg“ÍÜð^åÝ×*º—žVç$‡¼;AÃ__*µñl{ˆ;5ÇÅу°™SF*:@ž®Œæu±õššbô[W± †5˨¡Q“þÓ—±…«¯±M­OU4VåꯠúÍy-MÎáx+rÛ.Ì÷k§¬,Ø�Óàú ŽÎíZߣs™ u·ÖM>—:ׯuY3£ßâØõÑçùô6õ¦ª.ÖØeé׌ǻóVåyþ¦Z™CO”³ÂĤ‡‡A�{{þ`³:!4[^“Óßv~˜©•¼O-Õè¬ßq �mì Ê«ïê}~îë:ÖrÉøEæ %³S@PQqÄY>ï¯Ô¯C’­çBƒ(:U9Yï¡æo|šñ(�éîŠôÖ-–é¾Ö¤ʼnohmÈjÐû¤0D¼O�n_ˆHFÆ~-‰F¡ZC2÷$¼à+‘µU¯WR#p�9I˜x�¼„PtQ­’µ æ{’ùéj¥›Xb‘E5©‘k§µvæ1K€ê{áçaÈlÛoòxѺK;:iYC…d'�Öºke §«3Ëìóúüé.‰v×3ÐÚ(ôl´þmWë5Zúì:ŸU#¨øD:Í?èª[º�Ðì•.Ïîîi$† B¨?Qð*ýQÖŸÛý—¯ôTåÎI42UÌ–y«Á#w®¾´æØøŒ©X(æ¨Uø¹´¸jŠ5JŠo—Ìd¿n£ëK4l’ 9?1�â²ß¿Í_­~nÉ—öš©ç;„ã Þçâ»åHjjJ¤À�ªN³š·ú뾂ž?)~=~G~™¸ùÿ¶ùÌ­0c.)ÊØµ­^½®kØ€õ(jP>»ç¯+LÈ Ã`©.wÞrìëôŸàôÊ0=]µtg¦|ÚdÑâ‰kñô\þ:Œ‘ÿ„`éR¾aúãõù ™]%¿œ…aìè”¾ê† ª{êIGý)Ò¶p4m½ê ïT½>1׸¶.Ö÷õl—åñdÖ�#Ûãh?È»Ç×›ÅÐâ´t�7HjßÌ|À¤{*Ûo¨·åú~Û!“Ÿ¯]V¾“ªÇ®µ�mM{Ú%©æCÆúߢ@wz =׺{ûoéʉ¶u­p–„z±–7¦c]…›åý¢éå|”Ds®À÷¥N‹-~á‡Ñe“4²×ï¿y€}8&¿�á¹k—Ã3‰ãS’³'¢=�Å'õû^íqûòb{ Þ*˜ç£W;ýÌ;5/x±@+Žß#® J–ê¤ÀR¢hë,²gãÃbZwÞ¦Å%¼G×i1ìŒÍ!?ÁÛϘX0~Ùõ=IÏ=aÓèCÃ1fÏò øLD‘kñ³<„� #c@ùÿqödH4Ä!7¡(€6çœ V,õœÿ|º:x‘»Imè’[Ï^ß«p?ÞùÛ¿c 2à?ÔLB�7ò_ñ!⟠�Ä�·å"J·ä7æ­Ÿ’öG"Œ7dLá��(Rô ‰œ=Oâ`‡—Àúß›Z|óvr7˜vwvÛ ²?ù›œ`ëèìmØ rÛZøðÚîž ®oûñ,Z‹ö$Rƒ-­A®§J‚(œ«—‡ÿñ©‰�F8Ó‘ ÝÐ-?ÖNô7™V~Ÿ*©TR_Så�@î×)ëó´ãÝõçaÜ…Ušµ:û£3PÕ¿žà„*ÔHªR8\D À“A'ÝkE2:�‚p—Ä‘õÊפ¹O"“�YÖwÖ¾® •Kj•x‘]#©)J¬K‡~Ô®WÄ®gJ8‘u’º* hå%ïu‡Ž�VUÕ½]Ò馦ÖÚGtwÔ!´©¨ô"†n¿sxÿ!ò�7¾FÅ ÙÎÑuhæl…3ÓµV¢R+•¿¤óz4Smzq+§Å3{Q}Z6AÐnoÃs9®kåð“†R•œØ µ®TVÚs®£‰Ÿùb"g}†h8>Î[†­æ«5Q‡1yh+Õ?k!Íö–E÷~7vhÐlâ7ÐÑ¥îÁ6Ö?}1Ìl^¤ÚSÀov »ŸØ{÷D“ºß*òùÈ_Å”›NNö=Ä´ë~&SôŒ,ÃŒGÓ=Äð¹FÝ0 ü'¸åÝQýÅsSܱ{:û 6õã¥Ëü¥Ü+S_œñúÖ’Ù�T}7w¿„º°LÜÕõçÒʪꕚ,ò�C*[�ï~#yW]ÿÍÿ«Û!¤/Bîÿü]×c¤¡ÑÌ¿ê¸ñT€K»úM2WùÀKÉ[½ûp}+ DßtïÎãè�*Ôî›™Ihdæío Bt¢7þØkôˆUîÔ¿ä¼V©�‰¤«ÊïÜÓ ø%¦§*ß2YkQcD·Êïàá�ÜÓ.-SÒh•Lñàj¸±�:[¦µõ ùµ¬ÛÓU=ý93ÛîŠG�ßüàj³åf=æû•Ɇõ½ÉRà:΄··š$ӳŘ-$­~ÿÂÊy^¯gÿº^/¥�—uÞ”ÅÓÒL idYjM¬n!foÈüÄCs{¸7„ùp?@¶tqV-Iíôúxþ¾íüÉJ§>±’Ô¹D�\Òü[q.~Ö{.Ö+ýR ”¿À¢m¿».—ŸL$þÙ—R¨õÌW¿3þ <ÑïÐ e4à2Q3~·àwpÕœ©ñ ׃Lû:ÚôÌQ~q¸jˆ+è­q¶Ð�Ìú+ÿÐì£è…?¹á|âã‹\ߨ³[¬öû¢çõQèÀ±ó¯RQQéüèwØ’ê#z YõÎâÔöÍ÷kp½¶âX€çT úOçõh` µ™�®(ˆÂ0?™d‹õÔ&ï���CK’y~=Žäµ ‡V€¾ˆªã]‡¸„O�ö>dHŠÃÿ>WÜñÀ8ÏÖ �…ÓNñef‰^­ �VY¢ªÏØ8üÜ'£z(ÚŽ¨óË(€‰…¨µø=%€Î�~’/µÒ•p¦J*µ¾‰D¨!Šóì(¡µÐ>¤�¡$ 4áï�tHÙgT ÎÅ¡HU é®?KíÍJkƒµÖ– q+a\ò5a`�ªjRß}HêghHedgéÎÇä³ÖÙ¯yÈó~Þü|4ˆhûÑ€!¼@óxÂÝ]x-4$C2qÄm›—šhí7[bU}!=‡2Ô]T¾„wZîy3ÍóšµS±4¹“l¬[T—GëÎÎjÿhˆHÒÍÏî¸{o?.sÍ$‹æ®YHUì7I†¡£Œêˆ8S+Ñ�cÔ^ÿ‡ß^Wi±ŒfWƒû›¾­ë÷'Ÿ>>odº[üé^c½4A5ùít¾ÇÔ&Ká(dÙ¾§–›9ùòã:½h+À>Ò7ã†EÓöùD¹ÚuZ“ %pEô<‚°[ºZJs‘Њb½­Óm™¿Ám$÷ѶRÌ»†vBæÛúòÌÙ;Ö=Ç»]×-¾:Ã[â7tœŸÄ4¬vƈlã�¬ûêÚ­ Û„Û̬Ú�L™=�+7/i#Å&÷8Ÿ4<_NËÿ#µE¨l\ýEgÜ…àÁg´A²³{¥%MA‚= ”(ïÊî§T'++.Ÿ=K=²éM€ýûÂÂGPHT„åâŽ>}NKt?60ðQ»kg�KdʵÙòd�vq^«V«K¹Zq²Üè+nžž�Þj/ÁX£ÒÁ*}þŒéùÜêßsh­9f)2ukÒz$¢ ‰§Z=˜|½½ÓQ$ÃÛœ¸xëE�ì#©æÀ}·\üsÃÜyDFÙÏSì*ûÀÙ¤w݃$±=|BñÄJר7°Î¸çzYI>t+NfªŸ®sÚ9úI΋‰ÁðО7SݸÇׯ ß þK9M‹é^þ³ƒ\tü÷WËåß å^ú»á_¡! þA­äSxá~âüA­ä�^}vê˼9>2yº#«žnªê±°…8CùÿQª¡èpwôEˆ+5ŸXû˜ýÎõ/ü�~êùÆ€×GYyÒýØúXaa^ß¿ÿ–;8Û`j_·h�T½¼v Úyî——×[úŸ†œ°¨£k4Ž;/ro*_mn • ¾Zq–¿ òÉÐhóY¥×=Ð+^ï:<-í@ßXA¤(¨Ï“®uá§­}¤—î7s~£�]²Q£Ïu“ƒ{/yHßÏûÁópüÎî]4# +ê Õ‘ciÈZëÇÔžvÞEˆzrê¤H�Žb‰úSÑíèíù6™2ÅýX~^Úµ×niENK²×Ö8”XTe�þ�ÿ¾Õãç¯ù÷C(C¡ê´E=ȉBUNhNkzt²h­âÖT“ÃRãïµ[ºc º»Ð*:§Êžgj%çºÌ92_�Ïbù~_Nܘ¢Bjj 0Á˜Çc±4ÙU0�j�&»u²éîþÝü#}7ôó® €  ª´çixé1w«Kɪz[”péí~F«„�¦j± ùÚ¢¾k+öªH·ÜÛÀBZzéì8æ\¹õˆpÚø9¿'š+ô›c}êñ?C¶Ä=Ä-Ÿ‘Þ€_Ÿ]dŸß‘ 8§�ƒë|”óg×Q™ Å0¶àg�¾HP!ƒÑw·,ä½�¾Úð^ï–Óž²³åá9ŽI»çݺ§ýïCsBÇùK®(dỉ–«­hßà�:%ëï¸Ê®öuMtan¯Ü<�Ù÷„†7Üç!I_¦X;¦VÔÿ«·„k¿Kªß�Ó<;·ý»æc£/ÿ7¡+-ç•ω$þd˜*¾}׿^)qµKÇô£¾ažêi ¦=ÂYyЉÙx#oŸÊÎß&)-ÁòÁ`Îñ"Ð5®3Ã#??ø®�Ïu?þŠO1–{fÓ€|X Ÿk¢©�œ“tÏs¸b¹×CÒ!;¯>^.twàoïS±ùÇÌ&Þë^ÄÀw:«"·Æy7Á¡˜@-¬T9úAÞ£ûi1DMÔÓ�3d%æß³ÝÔ«¨6F,ƒ­ü¼ºØõ×Âð9e�mMì’¡v‘ž°œ:Ñw{õ›Ûz]Qzu…ª+>5×Î݉d8\G[ °ÿ? nÉ‚¿}uêBx•Gø‘’ÿzÒÓ©;Uð{$§Rû �¿ý©3|PÍ`ËLÎ7á„à@þ•–ðÔå}÷7Ó›ëmz`€KŪsÀœ}%GoƯ˹•~ÇzueÀÄ=ˆ:Ù˜~(�½�rý%ê¯ÑÅÛ®ý`�ïa˜óšÝÔ¿ vu~WùÂAQwšÍùºÊ›êSOggS@kLm¨`Ì/�ùÿÿÿóÿÿÿÓÿÿÿ²ÿÿÿ­ÿÿÿŸžù­ŸD1àj‡›Â‘ûI9ûMM`íȳÜ0D¶gµ�ß%b0ÆÞ\Cò}/¶©M�‰sqŸìÞ£Ç5Ð?{Ǿ.“§Ÿ¾º³®“€«æÝ©½1ró ½1Y·WSdƒÖ_ÿôWk¶@ˆ6u­õTÕ¿çW ºnÚÀnû䥊¿ú¬Æ¤ Î}§¡¸Ð ÎTÙùÛö�[_‹Æ©8�‘$8•%²’Ê’…Tˆ¿§gz¡h}»ŸS !/Ö$¹év—tå¬ �¯×w¨³ÿëECÓðc/­ÏÊÏÕšw·ö²ß×=`DoŠ®@’ðµkE5麸Uj:NfÞ¸S>^¢FV²Í»¼Ï ½ž]ÎåHtÎD|h-ê”NDMCÔ¹«0yÇÈiŒÆçÿpdõWÕƒ!ƒöa˳³Ï4ïÉìǪuÈc‚zu¶(¿ýѾ8„¿aÊÏÔ‚Ú@eíò8$g6üqzƒ®d(²j:p"§¬äU2 #�²ò"ÅG§úrŒÊ”èÑ9$ �à,I@Á½ÙÁ&­˜#¦÷ü•´§©ƒX�e˜’]†Óò&±¤.þXU³ÕÓÛá�‘¬ý*¿�ŒVo"Û'=n~vÐEåÛõv}½Ûø_°~‹–9S�0ÒF�=ýb=ퟃþ‘lÿ9¹Áž§ëÎ/¿¾UMÃ1‡Ä–þ“�{_3¬•}AÕ×ô7„±�jV1¢vJýÄÔþ 5·9“æ»l³ÔúÎ3N8>ó†çWôÍ2ÿóù_pŸ {‹ý[f”u¦ôý¤Á ŽÐXî m>WP(²Ò®‘rëGß§ì{aR~å¬$qTͪ_Ø‹‹‡žžÀ\ _Á@%@äÿ¼3œy{ýüêe§0ØBnaüÞ×íu‡Ý&&(áW�ûqO“Í?¶.�õ_dEèÊÁt¯'ç é‹_"˹ò‰�Ü‘Ü߯§ºË¥:ºó EGù„™r›Å–æË»Eâ <üñŸUeÕòõ"¤ ۹¡inŠûµQ¶Óû1ï9{#z;[hqíz ðšF;«=Ö&ÞE‚îÀæ8ü·ßÖ­,šX>~¿Ž?+NèSÜ*-Jcòû�a)SÀ‹i4f¿‹A?Uö§}ØoÓÏÉÊ¥‚N—¡~ó§xŸ‰¨.qìMnÚÊ$…ãR¼®ˆë}ÛðËöåh!ý^Ü�K$}�_ŽúäÍ©Á¹=ŠXׯQÇ0Yç:sÖ��õuÿŸ½NÙý|éj/±ÕNÏLxž ŠêßF³ oïvžÄ\k ×e›o}{.‰?ï^§ïcs|m·F}Œº6ùÝjÁ 7».¬ßË›Š8 ý BO ÜM_V\>•ïXA„Ö4¸&¨•|ô•DËuKeY3Ù ðOŸÔú«³O9Ú̆áìH¬üêp³°¯ã~ŽÀ,ߊ[à©Ko>�³ ˜nÝur}ëôØ:­ ®ƒSãcÏþ{µ^/9�Û*ÈÃó~ŒÜpzú�ZÃí¾ð­}¢„D]µ8îÍ2³jñ‚ð§+Ôß¿Õ òê” ¹À$ÓqÍb kBþþ~OVïZ.äiâßx²*p–õ��^¶a¸óß¡§�Þ8u¨�בÂtR!¿Md®É½¶‹«º5'û^«)šÂ_ýHcÒ÷ɬydÿ|@‡á”VN’…ìy*Èuë°n#&Bòƒµæ¶»Nà#.â¡Èa³X‚/Ë–WüÌ�ú®ÜS„[Çz¢Û®çâG¬E.æ‡æe¹µJÉæ…\b.Ïl–²¤âïh­vP,qU$rÖœá0%÷»C¡"úX)k™Û-Ý¿v×V;7u¾éШùéržUØEʈzA–sE+o7Gë éµó•W D±îHò,bÕåfHxÅ &Áô»nÞ Mù,QÿÉû(Š5¯Šh½þݦZ>é¯_7¾XRïRÑ´p±?Î÷·�VUÛ¦u7îåù^µl6 à-Üšµ´À³Y“ ^ýÐvpÕ“w©|Oçëºðþ)<á3¹´¦[ˆë\òhlÊ#® õ³ ñ-žn{Ý?“Η­µ^þêƒ�uþj  ÊÏVq¶> öëè@1þAp |ñwçýæè€[w¢F}óyblAä@À¹µÿz‚%6¸ Gá\Åþ/¾©¡\¡¡&õŒ_ÿäñBE¯ p>×€µNΪòÅéà—R€þ4Õ‘ {á[pT"Ù©D…œ ãCÙåx`àZ»ð âAíß  —�ô�¨ÒÁ¿›ž:ç¡pOë¹í½¦=ù(„&H¨©$; À¡¬×bþD¯xHŽÎ“•‡9FqàXèåÞÓ¹ 8ÑòÔž2ª@ÄŒ%ΊP™|F€ëÈg²% €�¨}d—ã_£Ýí(ï¿Q Cpô¸ÿ£ùˆÍ¿¶SS…Þ/8Ñ™«5õü*{½+—4!Ý¿ÝÕWL ŒBïÛã>Hn’KüQÜ1kûÜ5DÖyÚ;†Ž ìŸîÓÉ�§“z ·®-ÚBd6èw³?ÛRÚ£‘#Žö­•ãýØ»öS»ƒåû…Ô~O�Èy¢PÖzÔ7⸾i6j_Þfêa¤nYDÃÄÞÁFá³ SS&ßÑ£ñ& ¤øvÏQŸÝO?QÜn?ûyI¬Ìv¶D~~Úÿ¤ÄhîöÏ~Œ4VêOÅ�ÿXs¦�Ý#Q’@Å”z/o]—ü«þY)±ƒAÍcÝ|~‹â9�Ùø½X)>5­„ssìÙéD¯¹~ëßQ-ÖîжñøWÀAÀ¸D²ÐU¦¦$y\ŠcdyÉksÑcŽUwhÖÝáñ@R>[ìI)Ÿø+uöÒ³^¶–ó¼SkŒÞvâ@¶"ªÁöý=^éöþMò�!ö_ZçbÈ4Ým¢2uZwqš©"óí‚ûuY2Ý8o4Sã«.H”>?±¹wãõv>ÊÐdƒ±Þø(ØÈ§~»_™e¶¬4/'_Táz ^5.¾jÁw·¥\õœ—b0q{W÷ðª®Ôí©T¸¼n2Þ)\Ñ3ÑêÙ9Öm2j¼ {\¡~–¤eã�ô½~9[k¸“¶[ÓÆq�ÂóÞ¹ ŸFC¤�íü0*·Ð=ùEŹë2©nýucu|½Š<lM@ Nïý£Ð–là@<¯à@ j;úÅýHŸê4±Ò_ŽPâ¿7Ö 5xª@;Ì Pk:ÎòÂnÖ€ŠÕp j|ìý<�‚$8>  øîª©RBcèêgt?}Î 5¹îEW*Ð5å๠Ì_OM݃2ËôòP©¦·ß}vYbèÝêÔD´@Š:(“»ü^ÿTÕ÷Ãu�ï8>@X:: ÖýZÖ¥–JâHµ÷ç‡ÆpI㉦¥çÁàIežƒ6Mƒ…€Ô ;�štåÀóF'!€„6Ó삯(ýwówgÚ£ý¶åÆîÀ-¯ø“]ѵw…É·(IÌ Ø, WamÖf®ÑÛQ�lïhÎÀÜVÑ·C`òCèZ»îË&L9Ä2àcK+_¬rʎʲ֬¯\µöó¨ iX«‰ ØéØ„àÐ> B`G$Š ú`º^£Þ ØT�ƒ>÷3éîä\7|dvF®ww÷¼P ¿ 7¯Œ<™s˜ k`ýr¹bé×Ò~ø|i™ô$á:I )Pµ{ׇ²7=;MÛ]%ú–FŠUT‘¯Å/zC´8*_ÛzOõ"xï9p‰š^µnž˜ Z‚Э5”„RÐy›‚ÄÃ’F&Fp1àS„v<-AXY§pTôo …ÜmÆÿч®•cÍhü �\¸fÕY~áü;<Ça}pšÞlJü0ëh&ÏuÁÔŠÌ1Òâðyƒ¹¯X;‹œì5�(Û;¸gÃIij ¬ ާúÛ›êœø¡¶æ¨Œw¹[»­ª¸h!ÉÓy­zøÊDCÔ�VŸ„ÛÕ»Ã*9÷Ø„2NŠÚºéܿޗÉu3Œµ6dÖø¸n¦_�&QiîÛíËØÆž�ÎX� ç»ëRÏûñYs“UE³yÙøNb«Vœ�î<î·{ý·ú½úwq§ÍÏ�FQ2—ãw]KYL ¬½”Ì1ÜéÛk:vò7©á\(þ)Ü’ÊuºD§ÆLãD¼ /µlÝïɨÉhå#sÐ!{H±ëfpàStO¶úÂÝMòÂmÞí`º{·Àùëÿµ}šaÜ:«Ñð3Í:¸€Ê†àãnÜЙxÐÏóÿàFëqöù-«‹ù•aB92tÆxßrª z7ô0•Z«ÁEjÝî.ÜÌ!·—YÈ®¢I�W$¤Å¡èRùH ÏKQt`¸²žŸ¯`ëаq ÂðƒIbQ8´P gRÀT€Œ<á÷ @¡(}S¥{‰@Ø ôof}ê2:žÃ#®ùEô¡�š×¯øß‘¤¢j@­Ý"L—|Ó-B¼Ümj·bº…îØëN�(`ÐPj�’’ "®ÖÏÿgÕn˜RéÊ¿‚NñÁ5)‚Sy-.�±…¾¥DFžäÙ~ÃVu!Mðmdo«Ÿg³Å¦\LŠ *•žò¥Á9Ob�ƒ;J/_¦ø|›=A—Öʃš�ñéºáÜXŽZ×,Y‘zùWä­æ>å”<ûðªÀ–ø�±¤¿s ¬�x ¬,ù†¡)¯4Æ” 8¡Ï}Õpveâ¸X�§eœœÉ€»Ié²pšës9³™çäà�›6žÎªâ’Ç�ÄpÔµ«7Îos9B ÜÉW['‘j¸»vÒÅÇm×2ŒIˆbÜq‡ý”_êl†«ÙE·®Ç,qQÒgî–_*™ÉÐ?{cQŠùu›rŸçG’ Úõ]±¨ùð³ä-à§×¤Û¶ã«,#õIÐY±;IE¯ÏÛ’\Ö7‰~Ø ×ЭÜòJÐ4or~Á[Õ5ÃÉÌ/<.ã²¥iþ£»qq,ÛÎ:O¶>q²Q :ÐZúúƒÚnbG‰‚—ÎV-‡åM]€FÎ šÜ»�Í}CÛƒ@a¹µKâ‰åú^üȾä‹Õè´æK^ƇxõíŸÐbáÊÆŒi\´�Âé‰{‰ßÀ4|êò옓‰(6hüÙ–­èñ,$ çµXÀ²¢1ãéc<æ¶È£í)ÊžçÇã±�ãœÏÌûªrØ…¤^eéiÛM™sqßz3íwË¥Ñt,’X$6IQk“MôYsšwŸûu6ço}òÎZ—$¾[«8’,ñÿúøpÆIž^Æv~}ïFŸ^5Àƒër«©Ä ŽÙçp» Õ�ïÞ tïPÓ¶ù˜é××0OggS@Lm¨`sÊtÊÿÿÿ¥ÿÿÿ®ÿÿÿ¿ÿÿÿáÿÿÿî~)<øWp�Ú‹¬¡ ˜IœùGN™•ÎïahrEÜ\hÚ›¤5ãW\üÇ@ÛÐÊC¹aoÌïr{Ýí�žÄ!Ü€'c=óê¼ÄuŸÖÄíÑ­þö+w¶Tw5*„ìÍ_#zï½a»@á8î\éß­7ù$@C‚ŽøýåãqJUB悜§ dñîš¾çÊ­ÛÞ:þ-[=?¼ªäŽW�„$㑊ÜI…'Ümß4%]RU>²Ú‡î¡àÙþ©B…ÛÛ4GmtÐé¬i&5úÇc^Su§§M�n¯Ïà8Èí ‘¡‡:ÙE·™Ps‡‹î'9nžŸÉÔ³ÚY~½óŸŠ«ùw‹ºü>Ž+Áë_¡<«z5‹ƒHœ¨u˜n ’Ú*²ï„*  ІU4@à”H Bb½ë·§ÆÏr[¨±ƒ`N°YIÓ{«„™ÝPk]ÔYOáÔÙ¾—3¡�¼ŸïiÃaá(/�y1³Ã,Y´‘kn¶?ípž¸îóËîÖK‘¾Ævè£7Ÿó R?Øöh*�j‰y9¯t4øxò€,÷)à"^óãHƒGܧÑbx<7®OR¶×!ÁÙj§¿³æÄQÈÏ0ûªAõ—MüÜÝîmË­€žæÛG»^s’þct3.”%å_ÑYë¿G­KñÉÿ—/øö¬GŸô&f½5èbl–­ñÿ\½ÜBÞÈA4Rä’îu5ÎrT­¹¦ ÈßM2 å›.ž|@6,âË<�ÛXlGñï¹P笗êÀ 2Ý’Zƒç¤Œ�§ÛÖ˜ÆÇõ®Œ|ä,Lºz:SÿúÇâ{­´�Òý–¶¿1dŠ;ýÏâItÏš˜©¥.Ϭpe_UôÝüÝjuSݨ5ð»ú©üý·:Ù=Æ®ç—6]ttìK¾�|| ^Çãámó7‘{ù:“{–ÀÒRŒýÅ‘éþt[ï\‹-�ûu9@ýO³ÖŠQµý6)Ä@lþ»«çµ·«í¦ù·1¼FɪÂSÏ.›Ø„½9¢CÙÞËkäü´eSÈN‘õ¶có.Yºë„“‚�r{øç¹ÍeóáßÍÎn›¾ÜüE‹,NÂ}íc;oÒöwÿ–1Y¬˜n¿j¢]V^æÕ ‚X£ÁÇÖÇuFò/,.­³ÏûïvïãÚ#DÁ|¬Ù8t÷µÓ]ü»—ˆÅîëXT¦¯±?ÔR .×ç*À^ \­g¤*RÝG²»Ihñ�ë�Žw!®·2ž#òË”‘Z­nC‹ø´ çÝ„­ïU£ÏkZå@‚v¹{Ä=rc·½^oÿü橉¾e|öwS?ß êõ�‡�GòDËä²³n6¶ ½�Æ Ð\á®iÇoÿá@ø¼: à!7ÿ‘Za-€€È¦,~ùëÏwD·Pºfs¯�A8ñŸY¸öº'còqB …«‚†·h§Šw‘’Y¶ÎV“`txkbG(€Å¨E/•PˆÓñù΢i„z>¡3“T©´ìǸ]ÃáîMLô¢îïôÐWmüܵ'ùØõæ™».•Ùk�ø.*N=ˆZ¡‰:çIwÕî"“¯õªÆUµ/ºêY[»ëQ¡9…î48ÝM'y·.£þùÔ@ R€ ƒHqõ.}•_Y‘Þ³wHãPs}*þ~­¸øƒ.sŒ6(>«ÈýÙòËÙǦ`Ién?Îò>ÛI¿1̲ÕLÁP"0ðø.=àpk$¿í,Þ|¤®›äÏù’„Ù/‰¬x³/£Ëz‰¿F×ë{[,Ú¶½ÙšôæüËžåwÉ' Ö‡í¥d¶C¯ç‡Ž­Êöã!¼f�ŽDA8@²›âÞuþaü¦¿ý›Pœ`=Ùµ¢=9M�0c^e>”K",ÈJ9kØ·?‘Ö/ú6¸ºõÉÖû¡Ë:Ä¡N5rD|Ô×£oîíØûyw»_ZB ÝÏùí+n–gÛ"Ex6Z�ÝÉ9K÷·%ªÓ]]ù3/T_É6læ}ÞH Òí\è’®|hv`L¹èí5÷;Bo%o]1g³¥kfÓO²sðqDj,…Œ4¹ Ù3…Ê¿›mq5ãH±ïhÂ×2Íïšœ±÷Çd±]ý÷Iñt¸v¸Úöþ~ŠöL}ÿ¯(�ƒgâüA•%}ÿ[IVb½¹Ï¿³^_YM—í¼õFáåÙ÷Œø� •ö‚�³—‰šê×¢ºÁß…õ#3²-O^ëQ*ቫËÇO;r4¶‰íK�=¶O‘„4»e/²Š–®ŸÏé·)'èŸõ~›Å"Äy$�©œ÷û!yiïS½ÏÀ3;ý²¶+Gö©,Ç“[nD`»Öc¶eåñ‹�‡wnD¢¢j]4ï_Ÿcqø^ÖµÑ{LSïO¯F‰6òvÿÌñeUnÙ¸÷þ¡?^/Ü…ëF1þ¼ ¿í»¬GýwP@P j-o¼Ë¨~\ù¯¸2RÝ]ò²1“¸ªÏÌÎÖ©ít5%WȧNéåŒ9qy[âùcHóí67€õ*åÝúìT~—ÆYôÓ²FmØÀ¾ÂíªµGH àŒ# Âdô/*Žä¸@]_íÀÇø j¼ �Y!¹þ�a�âÀ«î4QPk ‡¢Ê× ‚‹t…J½'2ú£UA úOþEw@æ ø;ÐEo] ¨Š4óôtà~�Äÿ�‹²ÿkÞb¦�_ß™ñP’f~;´&ÑǨî]ÔZ…T¥o�Š­E˜YüO#¶G¯š?gšŽg’�³Ä�‹ù3äïà>F§'ÿ´ �îR‹ƒ¾g}É®ÁyôAײJ­D#SH÷ôySéP¢èÜbFËr§'è¢Â…Ÿ!!Q€R¸ ”ôE_T™oi=ƒSÝ\m·p!Y‡^?òÂc¬}—…÷á֜Ø8´Fö¡íNª°rÖ¸šÚmÜn©ä¯#µŠûOþZó®� 7Û¬ËDí]’‘ý=åÛô8ŠxØ 8ïÊ—×tÛ¬®èñËé“ ¼HAçûÓŠ¹´» êš—{YlÙ|\ñsKZßC]®®µ•î|Û}÷W±SûŠÄÚd½y=øª�Uó3¢®mÛu§Æ³.bô‰÷Mm&3ßYÎu9(Øï]F¾»H ¿†ö,z¥º(ÔÚššçÓ=´�wÜ_KÐ`§Ê {žûÑ[äµÛŸo?ªRÅóq|ë\ßÓZA»v©7Ü�«h%A��~ÅJ¯’‰ºßdåÿéøLk¶=�WóþÅ,ò¢‹Ÿâí•�½ŒM55]«‰ë�Ô”R»Î[nÜ·ô§U›D5(§nÉT_ì^þ›–ýÜUf÷�«ábÂbšŠTÿN7õï·4ë>OÛỲ$`åCöj/#Þ` Fð"œçÉì»”N;êÓ�qëÉQ­·T¾Ï(pÆô^éç´ÔuõŠ—ü1îN.x’<ëÁ¦éXslžv¢}�I5w§W�Qù;?+3Ëo(؃ŒEâüAï9þ4õ_HC»$ì"Ôz¨iÁhh+ó÷/ÖZNgùÓo4J{OLn�Ú�vØÚÿ�YKàcêʄ͛Mu6«šÐ8ÖÙü.œÝ›Åà5:kƒÏ �¯aÀ߇Ҙƒ®WFûªé§(ΟÔÝë>~¯Ϧ¿½Þ±Á œz8¦C<�²&ør4€÷ù¿ï5ðWà^\>þé»Àï$IŒT“¹k%›Ã…ÿjÎd†ŽÖ¡É”7‹;\*ïŽ'u¦8#·mR«ó翳U¢3ûÏ]e)÷?îKuOpüú¿Ùú´±òÕˆãN‹>¶v ½'þËß7oÇÂzñǶå°Î¾—À;b.žCã"u|O$².j$ŠÖ¸„¼Ñü@!±rö¼Çñ…òHûù›†x¬ P 2ás¹‰_¸eI§¶À#( `½ ŸTÔí¯Zgq.@Ъ¿ ɹ“r˜ÉÙæ~Ê!*iØÐòý„ß!@õW�É¡�*�@±T*P�ËÕÑü¿ãs�žHÑ*Õ~…šU÷{¢ƒÖ“<ùvpjK;Ôx^k:¢Jžµ‚¢Í ñ2“íïñ�z›pEýåóY‡Iùç:þ<Æ<|ö펌[ÝÌN…IkW×!Š©‘L¤�"í¢×Ç! gT#Ë8"׎!¨�¥HSÏÿŒ÷|äµ»¡4òŒéÐ&§Ñ¹ã!~z?@ÓTí 5M5@%š´kîŒÁÇ´¬×ò.ú}a«ò¨ELámï—Öd¦Ô ºNŒŽj¾ã�šZñkp·£;s›©n¢åŠæ{Ð�wÎ-Þ´Ïñ<åñ”™ÁvKx*&gôÒòñ¢ŸÁÈ?ŽX‚µ¨¤�9ýl³þwÏ9-‚±§Çs l{lî˜l'e[%øiÝJK9ÐÑøÙvxðÑîÞ?}y®w.è Û¹­C?~|ˆÀÐ(�)B‡é·ÞeÉdo²Î©ùÉñ²8=ù8�ù*8[^7:¼…|è2™�SÝŽÚ̳„ߨðù{…Â`êb¯õý3•JO9B`†vØjqfNÚª6JWAª�C*8y£¸&S´yVýü1ëØó²ÙÇŠU.x£1Âú,´ø«‹ã¡ÿ†6›ãµÜ®€¾Çïàn´èzêä~™á…ídFiRfüV]¶–¯;jøÌo—lÏõmãyjgãâ<­ñŸËÌèü/:âYÜžóm,Éjl§kõï>ù­›ÇŽpŸÎd2Ü}�«s!z™ýÂ?¢³Pì5Üžº/¾V «ôz©B½øs®xį㲘ãd'Ï_¡îRˆ«Ò0ìd‰oM9¥OE¤Ón7)7ÿdõŸ´æk˜h’›¶IµýŒ§Ó#~�ü¯ÐßÒ2k§Ò ô3ùÈõŒ”0é–œ|¦u9výÏ&gå'ÃÙu“9“Þç‰"?5+L ñÞ«ãÕž�»²ÞŠ:Ã'øç|j¹ä4,g­Û/�ä^ä¼ÐÓª¿ò»¸íEŸMug檛ëÆ]DøOU~]¸ †ÉìËÀÔÇ¥~^éÛɯ jj%¡Ãþ´mS[J<6Ù2läÖÖ?½­`¾åN—û²™mÇ[È?qÉ?¿¤J›Ë]#·n?ÿš[4ŽþÅŸ±ÊÇj77g�ÍZÿôÝÖ{££ð=vPK9ùz•|<8Û.ù §ýQȳë q­î§7k o)<Ú¶ÿB”ì?’Ð8R©N:8½ÿe3=T@a‡£B±ST£6!½G8j�Ž &ñ¥Ö4¥êq˜$J€lôï4‰Ò õC¯`�ÌǰÚõñ!�rËh„®(Wph&•’™‡Lˈš•*.¯{à\Sv¡)5ÄáÁÉ΀Iå¦Ut:š†NBYé³Ä¼öb/ÆÏ'•VÇ¡Ehôx©{BF†ÔÚI³ !šsåpF’U/ö|DÕ+6Þ˜§‘ul/ú·Ÿv©*-]Y„ðéŸé'ÔÓ, T„Ç4Cˣ¡«áãmMƒ §ËeôkO�¬ ߸s­±‰O1{©ñ'7CéþÚGgGÅÂ7� J¤ûÿ¡~6îyñ”$dû*^”¬d“}Ló$ ×�H˜äÜ©Õ<_fZºáN»†Ðx« ¼÷I&³åmV·Æ[\©ûΙ2óq#gÚ6õñKýmÀÎéï¸Qÿ"ÇzÄ¿µ¦u˜~‚êÆÞŠ8~ÝE[ÁûÛ=é[±/Np¿¦iž‰’ÅÜécDGpé™N” ùÌù`× Ó¯ˆ wø·_ŠÚ[þÛü<Þ˜EU†Àÿ‰ËÈä­Z�q¡9™ÿ|ƇŒ¸é%óÞAKö¬ªU®_¹wy3|¼Ò<1Z'SúÙ׊\$`ÊFûߨLJtÇy_Âñ¿/LYäç[­ªl´¯ƒšžf¶ÕXgªÖ]ϧø�MÜò%Âf”ÿÅéáï;‡ËíûOšžÏêWÂ.°qYù@S±KÛ~�âéþñ`?£x cÉž«Cö6:^ÂÌ—»‘Œ Ö½éÔ)L[w= WÇÉüOg¾šÍÃÏÈ¯ÇøÝQ¾ôX¼ãyO€6~»aÍÝ®‰ghÛœ÷?ü}nÖÿ×þ‹E­ïìR%w8“ëè#ï„¿O3.Ã2Çø½˜/\;¬a7ëGÒ l°¸>|´Wˆôïˆ` Ý-¨b‘’Ï÷ìŽ*K�¤Æ{‚¢ RP‘¿òì¼Î©r{±�¯öpÕX Þ¹&e/ Ú(ÏêîRVL»ŸÅ?{V=‘¸ôãñ?ò/Žº‘£l-F_MáR MÒ4ÿoðªuéû\ïgºyx}‡ñ¨ÕŸþ·.ô߯ü§ª·ö_¥e,Jí ú‹»HU)àOggS@“Lm¨`‘Áb5ÿÿÿàÿÿÿÞÿÿÿèÿÿÿîÿÿÿî>é[ÕÏ µ µ’ÍàÁÿN9dÐÒrH5“÷Ë/_Ë·ÄõýsW¢‹íªÒuy±Ýø‡#A�ëË™øÁW­¾Aóáñ�Px{©ï€_L|xêæE€å¿w¹Ï¢#õõúõÝØB¬¸eüªD¯É�åTèü§ñ‡�H­°Œ'¦Jç²Ë­\å:ÿ¬ÍùÔ@hˆ?¿Áë…® Õ!w'`iGM$ueO—N¶·*?È}¢‹ê|¹S¥¤ìJ¹fæ_=¿ÊDš˜¼ëpº  Ð##­ú¯u䨞‚ t¢Nç3× ÂËÙÖ]ãc&?PÝ�®áNÇûããKGòqœúÀplW;·×¬cq¿Å—6r©?øH™Ñ¶Õ>¨ègÉ™̲ü)¡É–ÅnÜr¨ 5hÉ¢×¢»p7}Ö.ZÔ ù!.h¤6šç©s.h1~†PéPu«©Qc¦äjË< ÷Jù9/ów:+‰6'Z¹}�Óˆö„Ž—"ÅD¦¶ééðÏŠàêÒ�˜Ö¾*â‰*þxÝq@‘ïn™Šù“{U�äp>—uP‡ð�Ÿ3 θn-«84MHëΟ-Ox-ZÒÎóá½I£¥Ä‰&§þfaGîê$Š¢ywÊñ®\ëͶ3»ÙêGÞúè¡ÜGì½ÝV¶ñ+›KK9ƒ‹ Ë<ÚµþRnÀñ>ˆ×È€nZÝlbÿýF‰‡TÌ2-ÿ’Ïç¶ÝÒ›lþ{/-$‚Ý�µî:°cf_x™µ’ë~p°IS„?B*Ÿb䮌æz0¦iŠ”‰|çÀÎK wæ¥(™uâÐÃ¥«^›à‡}è×µ Úºž¨ýÿ¹žƒdß(۬ךÓßç<, ]³�¡“{ÅöM ­ì%{§2ÿÊ?gBì9eˤ´S^ƒþ�êWö&|)ü*·3®#ií’Qòëõû•c‡xE[ÿ“G\«.Ê(ï"Šû'ý˜ñÚJ'¦ý|ˆŸMùž2µêí[¹áÏ�+œw'àîl.©$¼‡üFìît½:[î£\»Ìòa¼Å>IžVkÜ}-«ôQ—b†~¢ßec\Ô;Í�ã‹Þç]™&Ы|ö,ç�–¿0�ô¢x�µäíüª×Í$®»âèØzÊîböÜChÏTqM{iÏŸ÷¸.럙ÿW¶Ô.s‰’’Q?ºÊiýr;à’ž•Ù¨°�‹ûÙînRÆ*ÀcÔGÓOó�ªXêÖWþsµõ·"©ˆh,ÐSز.mo¥§«í{SžÞÞiÙiÛ'a2ð /&ÊF;Ì‹ó�ºÙÝ2›R]ö½vH‰]±àÅ~ ÜÕ_ E¨-¨3…'ñ«M%IÀûõŒ¾õÞø|^ZŽ5�ñëOKÂRðP¦Å�–æÔüÕð6ƒl(ôŠä¶•ä?\o`ƒ Î2åFžÅ9þñ¦Ó1íºž8¿i"R¿}w··`¹N¢ LGþ=Çh½çÙFîs÷-ÐÿÛM8J2g�—ßÑËß°þáe{rü¨ ˜XmÄ/ÊS¡¤µ=9"Ûׂ[*dÉÇWQœ-é!¡Håz}€>�­RëETì÷ Nm€.¨ÓÓC7¢<—8Àž§¨" àÐ×jè×G=Çg˜Ãa%âÙk�ù=¬ì÷xPž+Ú‡ãHDðdJÊ —V¨ ¬)Ô�:UuRE´.÷öÈ¢R¦�èÄÉÄT½h2„Ùã—Ï•ëKŸ’Ÿ¹þºp÷§¾|¨[Œ<{ò†È`e’ìÚßMÒtLsžgÕö p4uÒ99Tmæ Ö¤çSý‘€÷!äÌxyärÚ«zíÒ4äH±PCT4ú?ÆÌ Þezw€ô4ÐzÅ˽MZ:läh*}`¼ÂŒ¯cX04¨ºý™øiLXMBó6©o'G½ÑC3á.hbá#“`A³*éR 5ž6YÜD¼fòLõüá¨Ô¬®=%bòG*&ð¿è‘{库®5r 9j‰‰îpYÝÇŸ¼}躷àÌÝØç΋—û+EY³áq™rw¼Þa‘yO'Wzu­Qz5w„”:?ó_?´—?‡”ò™å?†xY÷²8NVb³V³}½‰XÝKiN­‰õË—º*¢÷Œ?.u+ƾy\õBeÕ»’Äæœ•óðuþHÑè¶Š—O‚kQ©ñ(íèÒÔƒÝ+4:¼ø,Vec®÷òT-r˜cÔ®Ohýs›øõÚîÖ�^*^keÅî‚&jgH ÑEþ' suæ–^»£À%EÛNª±)†*¾ÎÙý�UÇ:V·p±@å¥l¾³)º× 3MF¯•uxƒ“ZG‚ »Ü_pŠ´n†xO8Ò8¬åîEGyec2Ÿ”açžêv}P?:ù[3¶pLX&±-³ kz­˜p£›áÐРuyá .ë#Tÿâµ»â1ƒZ"’†9üÛç»yx‰�ÿ åœ�ô²Ô5ä}ŸÃ=H"Ô†<äòû�Z%ó´�AHe÷S~ûËß½v+¿Òo²Tôþ„ƒú¿ ¿gq¬¸,L£žS§Áœ»¥ ÿOAüŠÜ‘ël1Ã^èù¨Ø7|’ë/„h{YïO˜~Ûj)·áîçq1�yb wl@,÷3á|ír®å:æú¾ Ü’¿‚„Ð0 5“Íà…ûŠ;±UvC¨)>€»ôÏç?½ÛK¿³ÿš§³ÝØr€·� ··öЖ“ƒÜïeI|Rk÷¡Žˆ4‰Šª‚V•õ+)ÚéHy夑)ÎDMB�¨õ‡P%"�þVW’çóÁRf¯h�9ØDËèyÊøSDˆóèTDTRç"œ(‹~Bp%»rˆp r×r—PO$¥cšà–�ˆJ½ 94yE÷T×]œ*;D¥Àò˜ö['-x²Ó2Þ#-Ü(™€$È�¨®ïÏH¾‹\1ÀweúÓæ‚qeêt?yÅŽÜÃÆ‡ð]À¤æ\XäEN9ÈAÚߟõÃê~_÷)×à³QÀ“-2yb&Ý­Ð_ù×k°6óíÁO¶’Ù+«ªÇ#ϼCΜ@<þ½vŠÇ(Ÿ¿u0Ê!žÒÉÖ‹<ŠÓÂdø râÜ~wóè•8º³ŠþCÐdizbÜÙuޝè18èNánÌé2ï[qr$B­c–•_øÓ§g�îtÛDWâǬ–úg±ú¯¶½ϺÃeU5ô_[nXF›Ö*)øÔ1yðõ|mH½Æ·¸›ëš@Ö²3&VU,öeÕjUiëj¸b�'3BuoânÃ'©Ÿ�á™çŸ¯‡ÂbåiWfýŸ¬�ø§´ÀÕdÅuö³®Cƽ]»/Zº«®Js¾£‘­ÁÇ8ÒbM³ÔµÉý-Uì? î1Xîœ(_Å}¡µ98êºù«­"SD�ê“ÿtM^¦êm\z¿{\…ÓýÒæüÚǘ,<d¶Ðt¯€X©—æ»ÀvYO1â*»¹ÆçšuLEAQï5c¿±êÒ…TSh ^WÅqý* VPïÔ¹a›�àkWÿ?ìž”‹¯sþiŸ|Ö¦ÂýÜNòc˜&fXÁ�©ÜåFÓŒ{\‰T{{&„ ¿Ãm%jœ77à¢rrR=¶D¡ý,üúÄó­•}Ý:—à“÷RfSÕ„•v÷;ç+v†ØúëàP?¹§°¿ä©að–ãÈ{§ñóO8– ¼z;n’Û�wSJ_²uÏ)•ÆNÝuHnÌ�ëb)ù[àOG4樕”oàW¢!CC Œ¹frý8>ÏÈ~‹é+3úÁ5¶°^.µŸ­‚+“%â‚âORÖ·Ð}(_M§è7½‹…]ÿ�¨Ï�øV¾°U�ê�) ¼o}ý”mcùƒZü³Yã_ IÐŽl¸IÁ�î¿w'À:½µ>•nz?¨T¥¥[å>(Qõ3ÆÍo@„È|w†Ó•Z§¯Zà •®ß‰8As#Tj•#ÿ›Bë‘F ¥Q`»>2I˜Y`þsÐ&ÀyoïzÜCŒBµ¶k%ãšëuTÁ•„ý÷.®ý7?ëeY-8º:é^y%²¾½”ßýžyLÕ�c}IŠì:IÜÖpú¿œ'ÿí_H#Ó›k>ÜiŸÅ¦ôô@ŠNÒi•íÏöÜUT&ª©µÊ¢.‡òY%BN ¨¤Ekê5O]TÉÜ{úð)lµ²uzþ"ŸTE™AK·Ó›#ë´ˆð™�¹'Eõç× |à$Àæ@G�uàé ßdhómŽWk¼Û>îÙÑb±¾ýk¨ÔÛÏÉO=tõ¼žƒ1öŽ]{�"`n<ëÅÇàZ°lúç!¡ õ�üù¦ùp·°½lâÂc4xÂÒˆ—Ü”CËâ‹Cùçs:û$Ù›Ú~"\¼{10µ²0 L©läï½(Q˜µÉÉ:Ùhâñ¯Ûߊ%�~'¾î±¹JôÜEîÊïøáöq̪l®¬ÔpøÑÃÑg¼™Ø çó#ØV7~Ô{i1bˆÐÆK–X[û­VsÐÿáB‡Ù!ÂQzöîoT¼]dØßšÌJM¾eÿÕ‰`¢Ù$8�.�-ø .ÁrYh_ÈÛ™éÉ$ óë,3NÜ8›3Œ¬ßï´g:ÖÜët©�û¯Þr8*§ÑŸ¿£½<ÖÒÖ åæU¨`øã³ÖS¯ŽPÉlÞú]ª·ß2äp³äØU&ºNaì[E\ɺá0á>/χÀU�âä-F®}¹­éž[Ç­ö"ÇUJI s•o˜u‡müŒ�Žë[ÿ‘¿�eòµwulGIÿKí§¬w§Þ£ïµÏ�ÃÃvŽ úßß5¡ì¿Ó"Ê””ô7ƒß®Kì§¡ÑQï´¤*‚~ ½>q¨g.§õ¨çÅÙd¼²{j·wnu\´p+× WmŽVž¯s²Íit™¹?»nÉï9p² xúåÛAÆn’lÏÖîõüïS ‹öYë;Zݯ£2Al¶ªÇÎ_V{£�µûÕP5ÛÏ53IÙ4Ù¯÷]¾ßËIþšÌú¤èÕë1!¢íôsómX(Æä6Óè*µð=v½/^ \Ñ_�òg cþA­$5ø�¿¢�LmCØG€5ã`:Ìiü?óö?höñm gO[(¸Á¥-÷-!ó& #wW¼�tÕ5�þØóí¼DFQiÀýÓÿ³ÀoÞÍG ÷Ýpl¤·o¢ïÖµXPjøP�‰B‹å[é@ýYwív�°qEˆÖhCÙ5…»óZÇÜÇ`ËŒóï�<úèàŒ»;ƒv†ƒ‹Ÿ½µ^|r�2‰Qf/�c´AâÛ¬L¤†n±±ÁŠÚÔ\z!?à”º'³ m¸pwy`Š~ûP"жnxáñýâC]´a—cžO“�Û™2¼IÂilßÈw}óΪ·ß=ï÷èuc{¿þil‘Ïýï6¿ê=ñħf»v†‹Ý½ì#U'lš”v¼Ù9ñ ®�'†YÛq.çü䃪V¾=J—ôù�=I±á›Ò¬ ¿C`BÃÜ•î‡dô¿¯B¡Ÿñn³Oîby“íé@¶å [Uº…¶¤2„Œ»�šÛ*1�žm8oO—€éD'¼¤XüXÆ]¾?1ÄOùú üNƾ£ëX¬7Ã¯ú²ÙWq`ýÒSÏÐh†·õyS¸~cìóɦŸ†|Ž]~gä:O×TpH·þÉþô]²¡Å�2~iø\Õ²­|�'bdšÔÁ `ò蘯�x„L‚ãº7ñ%ØžÎQ™Õûްz_!smÈý&–r<(OggS@§Lm¨`t±êcÿÿÿïÿÿÿõÿÿÿôÿÿÿöÿÿÿÿz> ܹŸ„–M¨™dWô;î:9×L¾�¿6ûåR?¶q�Õ{Ɔ§c@7mB®g Éî3ùzB0Ÿj œ­CvüÁ÷=ûfC 6ÛÜÖôè"þýõk²ÛŸ¾À™Ìt Ülîí]Uà„©{�½ä °Àó©UG?;�ßßx­‡[ì‰æk<¬#êJ3_ë›ÌC[…¶ÏŸïëò@Wy{íì€Ð|š;q€sà+ȳ‹lR¹ :¢Äß_…SV€¦´œ=óÁo!t¥î´Ô¢ˆøô|ƒ‰L™"䤸¨8�¶È7Ñè©‹ÁÉ4dB$ȉ~ê—z‚Ó¿×Å|t-úz!'|æ·»TÕ©‹ZiD¾•ŽƒÊšHJ”ÙuÏD©UûQ�¹�*Ìy…[h¥L­O«’Ê£[z &ˆ³«!$tåÔIgš¢J:!ýÔª#I4 xnT¼L7Œvß]ÌooÁåK�ÏH˜@Rï�–ËÜÓICÆæ{ˆÀœÇC‚á=I$õjzLéXü‘ùû´¯q±aðÇ`¾ûù±ï£˜]åœKûý–œYôØ›M‹ÂpÝîe×Tƒ%6ñ3ª›Kú,OìNlž`¥MÖ :Uúcrõ­×’´-7Ï‘äǯ8›ìÖØù¨¶>™Ë),)]Rðô€eúÒ–…^¬»ÍɬìMÕ7ò þß>Î7ž'"s¦­Ð| W€~ +@£ø”S{IóßG|®×úþ¼±^eù¢>ÿø³áùã§/þ¬o,Ëdæ±QóSqOD;—H̉á3±÷¿xrmÍŒN¥-ü|…×Îr_=/¤rÛO�Ðé¦óôêìÙï˜�ÁjáøîýØøeW³³ÒÌ”‹xŸï½Þ‰�¶Ë+F”U~*Þ# ©‘q²‹zùÍ ?ßYà¿»¯?ËFwzàW…ˆgf·SdüŸ·¦�Àô¶"«Ê‡sqÕ_ ûœÝ£þ‹Nö3ôKxÜ�iýÅ*'SŠÙÜÃâàqzvµ³îŠØr�œ!÷±¾ÜÁ�é:AäO·É1©üÓÊÀï´�É”;¯#ú/sG§ÅRO̘Ì.àg÷´ec[!/+»ÔßäËŒ|6Z±ÀÿòfýîÝð“ÒüRyæ€øÍåä±hoýå¯[ݵF½„)V‘,Ÿ/ýÍŽ_Ùö¶>Œ¥NÓz^&Äì.üv›À“EÞxS³lÒl¾µ¥©Ï6cÿ®]åcâó¼èÇS;­ºvÿ=ViÒXó¼äÆŠ¡”�”¥÷¡pÉae­1÷w/�W??⯇2ÄAV¸‹‡ã»òì®¶jCmßi ¤8ªõŠ ² ~Ù›ÑwÜM»ÿC½#•¿ýAjÿ°µ’x|³ÆÄ×�CLåqæÙ§äò³[áƒSqŠ6ž vl¨ À¹ñ¥jqS×xüñån¸ƒù&õ`uÖÛoN “ß{mÊ}±_ü²€dK§ºçê¹Þ?ý—hê8�DùM9>¼%+€t*£Ïo¿ÁËÆ ûñ`¬ò[úõSêûçU<Àzߠσ PYTg_¬?¾€¬ùZ§Èd"$ˆŒ#šz�U V²îþîCî·‹+ññàsP‘$‘¥jUªÈMTˆ Z{úè"SsZ×�HíЬ¢]»çèLùÐ�ªTjêY‘vkµ!–¨Ùœ¬uÉ9ƒl…¢ëbº�€ÏBóq¸×?âé#ú`9Õëé>ç¨p8ÙÑäép4$jÈyU}j1ÃcªVϮ̞d}× “ÃÝ×óÉL£’ÿ¸ª™Ž‚‰�zC´uîl`À71�A–!@G6D;êjÂ4§­Á§Å‘;¦Fÿ|Ïã[¼c�ŠEëÙ˜ hð%ÏÓ�Ú”õxç-úR¼9w…¡rªUác•a©krÄûa‰féóËY‘ NÚãg¦zßíëF䵉lËô�:ÃÀ`~¹*KÏ—n|ä®Q÷'®å wD˜a©¶öƒNo«ãÊ&ÇY=ÿ[·´ù®^½.+õzuhà»é¿LߟØ@פ3^Ùuªæ 9gèsS«¾œ^H%Æ*ªOMGôç£õÑžCw[r‰aä,Žèÿ$ÌdÓV?ÏçþÄ>¯­f«ýÍž®Gx#FY^Š6GfƒÝ=öôaÙwto›ÔõË[°•X£(éç¨Zöí›ýŽVâ“íZg~]Þ³("FÄ××Ì]¤FZ»ÔàA¤f•º)©Upt•üª5TÙEMi$w!#’ˆ4Xf]Ûoõ¨¥?¿ä1W].Õ¹¨(y±þÞu%ÉÌK‘:±EVR“?�† �Š�–¤¨„C*L4×Ee˜Æ€~kÆDöåAæVÔ†ä8° ¾cùI¬(×ÜÏ ¿×p©]Ù Tѱ1¿Üõbd"üÉÁ@%”9ùpÌŸƒ{‹ùÑš:šhæÆv/óž´Q€‚~æ„{Ìß‘ƒAÍOIÞûåÆ.=Ø4ÍråÁÉ×ÄÙµÎÁt+v?/½ogºßÚq“æÙ«ÓÑz¿ì÷“o]Q¢šòWo3Ù +g´•w0þÿÎëNf’Mb†½±: ÕE Žæym:ݺ%Þ‰˜µs}\×ðéõ3‡*'î)ɸjÃù½¨ŸS ¯p£Z†‰Œ%É-\rã"§C Bä ç² qW¡ðS¤áq|¤Dz`uÑ[4òÑ@†šÜÏï|² þX…�7õ³©�Ý^ÄŠâÀüXc>éô™ÔKͳ±�Z1œOÃmkŒŽ~Ç„4׬õMòíöcòúO?U]ι ¡ë ·ë”Öònbö?[�Tºð´ (›ƒ^j-ÿÓÃÅ2²* SjâôÕt÷`߉ں)ŠíróB:ôé247k¹}Ar=0y€ÅÀÏùÛó0ްZ,ý©,!apY¶·ƒ&­ÍÕ7"-C·R#2]Ã�ï?ž‡§á•ð~IØW³gk¼‰xßY—œ€ÛqüÆÐ!®×.þþü{ÝxúÆ=™û‰êr'!³ç|8§Ñ��(ßÑS¤˜}uÛM#�¬ÙˆïÙ>3ÕRç!éÚ$­csµ¸Áîlð.И Nô¯œ.& ÷ Á:ûL–Õ‹…ÙÚKjhž–}Ê+�ÕÚð3]„nk“ï ”GBã¢ÎÙmë׫2“ŸôÏþ‚Dç×Ä˜äŸ ~ <é0þ3PþCÍä2x?¡*$ÆØx…Ç{ª¸}|38·Z¿n™ÑØ‚îÜÐþ8ñºr±Ä‚üCHW¤üå Ê&0ѧè'ü˜àÚćFf¥žÿö/¤X?Ý\€ µ?´¡žŠ°å*xs•û‡g é:¶¿@—g­æè?–€Z×t Ñ�vˆ«½¾Øq€þ‡Íµ„—†Ç²<¼ÌÏù ³»' »ÚOS¿›G#Å©yÔØÙfE‡Ÿ¢Åкp Ô½}<Çt®­ €êT Hyê,ÁÑx]Ù—ý1+£_L‰¾Wãð8ç?"T½[dÀuèk“HwÖ}ni %å¦I pò[ê(Z�*@-©BÎE¤Ö$Ÿ“ÐpŽ ’Q+í9Q;Ú�U¾J×”ÕÉT‚¦ÖŽlI‡—LÔ ¡[�iN�™7un¥®�ø<­ïø×åçUû¤$ZûªFÐ1 õÅAâÈ”ƒ†ì<*Z¡6ECÏ¥9)õлïA»ºáù˜ ©÷{»æû6 N8 €†f¾WëC¿L3ûe£¢jZÎ[ß¹EFÄYGÜQ9.Qû7í”-9»¨[¿6»)³ÚšhnÆ9o Øï‹wÿT˜uÜÒ¥–Ètä~è�¬©yÍ Q­È7ÛZ”6/Rm°Åó’Åç‘ìËÝzûØu?â…?ÎæeP�¡õñóc97ÖÇ—0®ÛgÂÃßyB9hõHgéÌ~úì àéo3ÑNÕNG¼O¤5öé- üº‹¯¯y•±~¿å}�ߘ ÄÒ‘�è]®å¤?36;«œhlÍ6KçÇÎJó/¨$²ËìXä+Ñ(æ¼%ÐÈz—c뮃*þº�g;›ÙþTýÏïâ>êßßqý¥ÇpŽ3`¢Ÿ%»Ïv·2ÓFóëe “¯Ñê[«¦ŠR#ƒX¡K6ä’ý´‹ÛBíÂ0TMsò)yõy4s‡»â9ï¸CAá}M=×t=Ô ˆQãa ÛKø ©wz¾÷”Š$Kɵ«¥ê:úM¤ëûûLèýÔª¹p$éÒõD 2÷VÐ*ÑÈ#—@a5²Xh¶ þ@³þH\¹³Ÿkòp)êQ»øÅ’1¾Ò}Æêg¿]Š_ø]­Ûzúú» %�“¯~çüŠe½Ó 7$Ó�ﯸÁ éZ4Hm8J{^§g�ˆ?R€ÔÁòï …ìÇ=Âá^ã‹ÎK“M• «‹˜Zå<ËMç_ø~-ûQ=­áž—ûÓ†Ú}[?g’ݦ8 vù (M’úp|xíÐk 85ƹ²×Z½Êp°µÎI,ìÓË�ýìHö¹¾ÒùöØ;åo°â§Ñæ µ’ÈàUü€ñŸ©1� >r“[ð$9bôqŽÇ_�n­ü•>Ïõý‡ÑZ› Å7“8�ößÞ{x…Oìa}>2³-�Ëv�¾Õ;%õ‹Áÿí\O•pŸ¼>±éû…£9Âp\³¶žÜdfÈŒÀ‘½íMTÔÙFìßs¨µBaGXÓíK�çÕÚ€Rád'¨°uSoï…òt>ÿ–ªù‹ŸýÏ~5]»·/×Ñ¢†F­/ôyÑM½:µwº¶n�µfŒ¥:ûòÏ7/¯ä:÷ƒ×ª¨Y¨S«Ô¾(é•@vãêv³RWs@uMyiÊÃ�´F.:ªGg¤¹�]fþøÎ+ßñ‘šS“ù¨á\SÊ%çA}b,]ÖN2pÈar5¤NÂÙéÉï/„IæV2‚íg­³Ö¦RîÃKx«FN)æ”Ý3½B‘ÙQ÷¬:="Ke¡–³.««õL‘óHGaúJô”å‘JH¤­IC¥˜ë¡ÝÌÓGU¡×ýàîfþžþ1ýh:ý`”»%«™çƒŸ_MPJ€Z5Kgyd‹zçmWÚ²&U�õlÖº�-.|ÍCz…ÏÎì\ñÐI§J̘^pëeÉk³>ŒïlÂrÉÀ‹¯™Ø:gÃíqLd-‘“µ%¿§\²†ºëvO$Ü ÄCüÏ|¹ãe6>�:UEáž¶ÀÊ/N @>ÿ­ôÍ‘×cKÖ#Ot0¬[?ž{—ë4É×CKÓü´©WóÎE0­£Óvî’,é�×Ïsåg^zo¸ƒ‹¦l¼D8}ÉÃ=Oû�žt‹‰ÞŸÝ%ÝP0ÜÌz¬o3–òý°ç´t>Ç?ÀïëHÑp,Æ/f7ï ç\Ô`žV }ë<Œê!ÏÔÍ_'õÆz¬5¹/FÛ쾃 Y²j×2—x`Ñ:UNH”uÏØ¢!9<Ǫ$ƒFeÄfzÞùÙÓwüøò®dCô?þû½ÞíãâHƒL-�Ssù�¼Ká�ñ÷|³åõ‡ÕŽÃùõ{ÌH�į9šÍ1yN×K76ÓøzOæþnä D.Ãÿ_µ˜þ”yþ–‘×üÄÎ^ÿ·#½êfäÇOKÆóù‘_û}Z¶M=døØŽ”GW}9ç!�:—'Þßu™X8…ªT}³ß#ôszZHÎÿ¶üœÊsª�Rçqýì\ø¼zY8£éÙ¹wP³Ì.x6ÓÈv“^ô1AáŠ�d •�«'˜¦”çM:@]Ü#\áÅ· åÉëÞ??ãyß‚ T&ó�X½P—•Îöè+:{ý9÷òWúí½Âí¹Ýi˜¸ÊøþÌo�FVU½Zk‡.gF.îó<–a)(�<[ZŽtë~:i.Rgþ$»!˜¡ ƒ–Æõ'Çø/xŽ·Õ13 †‹QskQaÉ¡`÷Ó±¶ï ù˜S·Är¾¼fØUcj¯ßUKÏÿ¸’ãò3¿–ÿý®¾ð÷òᲸT*ë?@¾¼ÔñÔ¹ÿíBìþµ}øgfo?ÞwÓÕ wëÈûü“†ŽW²ýq]Æ„ ƒ^ÿq”ˆ»Ç÷+*t¾b•b�©+çÐ8ë�q€‘ÿ�€KÃcßçÈwÖ 1Ï¿ñˆ]MwŠ~è´î{eúòsϱ‡ëíž®2?&tQÞCs뻹†a'íB¬}_&v^@|…å…Ij®#9Ƚk•Lë`·åk3î„< q3ßîówqjWŸŒ8“_{ãôÜxýûÍÿÙòÛÛçÓUÞšzœ¹>ûýÛÃe®¯óâù1KšÇ=»¾¼%bj|•/Ü÷˜ÔT�Ѿ2ºÖ_ü\"r;æš6‡ÏxÈ]OósmUëv8Ÿ‰ÁÞq9îRü?Q« A¡ÂtE‡Óri^K£Ç.LüZg5]Î¥æ7†÷-Õ ù³êÒ9³ÜørÐ+ˆûU7„.ã'_±¦Ç«ä•Gv¶¯ñ‚žnøÝüéŽ<é½ÝëG×þ«—ãÄo†½áÅ»ïö'·Ú‰goëTç¼–†–ä…S™ý‹ÕÒ�åAV€AÀ_Ügö p¼ÿÑZmÝ¡F=&åU½dÖîG›açðèíš««Iû +œâõ‹sÄÇPö…‘8û6üeà"Èáݯ¯g'ç&VæÚÞ‰tÞEü¾]7�7C=�¿G‹K’>朱´¨ÚHœˆ=º/¾:Œ¹F«iìt NLnêÚ:{ó²_Så—ö͘Ù~ê¹þ2gŸ8Ëè·/¯»€¸EmytGÄþò&À]€;ÞíØëÈÁ‘Ì×€ÚàÞÿ =ÍpE S�oO¦9à·w>À0†]©E�áDþëO‹üˆ¯ŸÖ»çª¬]75ÿë?÷«kW¡y@6:¶~Ôà–!ŠÖÙbovÀ  ¾ÚÀàýÓx¡`§ _ f/ §ß7ýwuÀ@“ûï-ÃFC0|V@�´âû³ª‘ HORðH†,»£}†#†ªl I¥Gùhìõš‰Ömo»G[pžO®Ê<ˆ£ÿiÞê£7=2Àõ§_/¤æ[bÔio«|k ¯©Ñ· ;åß»Û Fœùòµìñ¡c9Æ«OM³ÆÇ‹ì½Öéòì¡óau?ÑHçÿôgÞ|27zÒ úfØõnòÐŧ)¾Á"¾Áªí2f:Ö…÷û½õjIwóº6­¥RŠò�¢šðÏy]rlz»ŠXQÑ^o'›Ý9§&t¥ªâ÷þ@ÝÛž«oŸ‡�tÊ¿"ºÓ°òPˆåþ×»‹pŽqe<ÛW6e€�ÞmÏæZ™¾Qy£ËxŸÎôƒ92� @`Š0$A°ÜÂú}v^àÕ´ŠYªe–l‚AP(Ö`kºGFR¬„óEµ6t)$ðÍÉÏÁ¼.Õ·1ÇÑ׫ù>K— (à� f‹‚#¡ nJ_,*ÈÏiF ]ë$¨ÂÄl÷…Y,&ÞDår·GØ@®0CñBf×mkkExÃßùÖ½h[æZä¢ìåþ£}v¼ÛaLV€qsõ+SsÍÙ24#] ^zä`Ì XB>w¹ow«Ã7=L¿r_åaž~×õã0~?ú;¾ëb<ë†a{½·«_i%y¾ÎÏ«}מW¯ó§º¥>E!βn>ž¶«©Û¯ÎMs[ÖM²Êß2w½j0¹Û“Fçä“Ü]_îó÷>ŽÚK‘Ÿ?ýóó ŒÅi«›]ÈöûÿæX„Ô©ifçœF”»esz´ÛÍ}ý—Ûéj~öµßø©øåÙÿQ�çñî_ÅçvÙf¹ošvÈû¼ò�¹IÖ ï1 Ÿô­¾Í@òwíV Uyš–*WÙ»çÃ`†¶3ÿtS¹ß®ïhÿ¬“Ç?«÷à{ÞÍWvæ(Œ–žQ›¹Z}yQ&5Å5V9gÞI¼p×€ËÆÖ/ƒ�¸Ä5)œñC€k#äzz~þÛ“½ô,JãxÒïÌ­©ÐpàpŠIâø—wî”·@œ@ï|ýW˜üþ8+¼ŒíÜÂÑë&ègŸÀ ‡½B@mœéßÿETÙ¨p]À¬~ ±7…, BT}¸¨ÐMÐçe…M`^.`@æ»|{+÷¤(pê®í×ЬéREŸ=29Í ¿:>’gÕÚ‚Èžd',ø±™¨ ao�ÖG·„¸ìg­%£%΂Î~ €‹w6)¸™.y˜¬·q³ØÞê�Íì™û'€Dû^g€o{ Ÿ­Ç˾á½ûךûȆÕ*ü—w?€c¼{©÷Ù¬~[² ˜ %§êUJGønv“Š˜—,¿ß z§Yiµ·6ºjûăÆÊ�µ»²Ø»µÞ«ÈML¸C4 j'Ö·À/îU_¹²v—éeo%…ž¨ãÉq�{Í¢(j«z°x œX‡ (Ë9ß%˜ b‰8âŠ@¢h E€`Y€6ÅZvK hÑi@T.ª«jˆ)Z¶<¨13!cH¸Ža¡ÕÇ¿Ñg¢‹tµ>zåþ�ˆ¡96‡KÔÆH€Ìú8uõëU±vMþþ�N>ò¿V3>PM§WúMHf7ÝÛÍ�èr>òŸ$c:ùäñWÐ;|y˜“è~ã}¦$a{U§({ýÿç9V½_Oy——˜y´#"Ñô™ÅVb—¬Sö´÷ÓÜ™¢�^eÖú^ûêr}îúNMUG.òÓõ¿××5IÙñ‰ñqs(Ûõm¬Ý÷Un¼{¯úëæõ¿}”XŸ8£u1FQâmÄ~û{…h .VÕ³÷i^YåÜäò4Ί,Nîm\ë}ÓW$Fv×Uw‡f:µµbœ÷‘óMUו”M¬Þ¹(Ëóv)²äôr[ãW·ÚŸÏõðÙ.›(Äm0ÏbêE¬�cž–{)Ü3RF…Rv�ÌÖbŸ�ûñ]Uu¦r,üþ&ëßv_¸÷õûsÞÒ’.u¥öù럪ìöä³åVÌŸqûS Ì�ŸRJYPŒÿæÊdîëª<Ø?»�'6rXÆõ§˜6#`B>)«üïdßo®2ž9<Ñ# Æàõ;imdt8ƒWJÓwîÚ‘/€åƒg7x?ê‹íÕù•øà+³Nså†Iϛ׿�hY‡€èWüº¸Å©cJëwîÜòrG*@½4ÜÚà ö‹껸�àŽ™x[` g E8è¿ B<à«<::Kµ•x€ç>'Šo <°Ë÷€�@p h@ðj`(€g ‰êÀé¾E€i—�&Z#¡öòü�… ¹ðäÐá¿6ìQ‹ ihET9¤RTªÆà¿ÎËçbx}ÿR¹¯‘;%¨6OL?Ä4—ô (®BO¡Ey€"†Ìl3"›Û@-Ó�ŠÍÂÇÚwÔ`ðYŒl f»Z~ä� lÙoŠ:(A=ÂÙ�pÇ–�7È…ª„¿eK“Ì}Ë,ùÇc…Z^\1Ý‘ï`ê}0^� Àxm6º.�aÍ« Ò««ê,?ÿß�Ž6Uäµ®ÀeÃ’…!E–Ú·‚Úã$Θ±wþ>þƬi$4¦£ZœW¸;Ö§awñî­³ "e‹ð‚ìâ9CûU%¢@ÀÌþÞ}}¿½?5 }˜Øložl(1†>Qüÿuu^€åÖ‹lF, Ô¡æ¦$Z jÁ!œ¾wõ@¦(BT_ I@AM0MoÂñ§^DS$ãBÛµlnVýŸT�S™}1-‹vt”�dÞßKÖ>q5³— ë¢ÛøŠ<"yq}¯s�[ï¬/¼šrÓsM\»óä»§«$ÝŽŸ�%»±Y8ÒI4# $>¤J’þGä¥XµÂqmQ´ÞÁ�°«ßëÿY¾€ÿê‚7^ÄŽ�ô¤oÅûú¨ëCEfW:IÝ�öR™1K+÷5Ö­œO8Q«õñ›òó~2ùÓ�*]¶ô ¶þq+õ1/Üþ4§ÖèÙÝ—0Ÿþ´KÌ3óo¾ Eîܬ”¹õáº÷ÞGq–šá¹w•�š¬NŠbXuÙÃtåü¼™fcÉ�f‘é–$7®;޵u^�- ã‚ßìWÓrÜØ£lª]âù—Še_šSÊ]h?âš“±L{ f‹kõõ6Ë^¿ËØûzãw.^Õ‚“°_»°¯Í–vƒ· .Þ·‘¶Åž^ùG $ _Ô‰l÷1¿ZÀ°È8kåL^²‡ááüjîò+KôK®ÏŒÔTk½«Í �žÉF~#ªhs”5 ¦P2%Þ¯wX«Í e5ÄAå+‚x Œ�G;Í= ø˜YæúŸŠŠe_ŒyÛ8”ò+ÌàIò¥l½Z‚ ‘šŽI“�kݽèJØ& Ðë8#eJ�ÑÙ,R](Fæ vi‘;µ_*øXÕämô¼ÍijqïÕ=X6”ë"ÄVQ—}ƣȖ·Å–ÁwõÀêq>ŸNbUÏKg”®ä±lSng˜Û¸ÚÈ­%_tD±F;}\àýð, ‡=�™IwÜ\’ƒÉ´îƒMÄ6©ùzH¥êc…%ß×—Ùܭπز{~wwm}ßç�üPÃåÌT-éì-·u½¶ÁkÇ¡í � yú3Èþµ.ÆØ”’Ûf?u�u1Ó fÄ¿?ãж»œGÞ’?Õ-c˜ß,U2( `ÖX›ú¢(“íñ÷;öϤìEˆÚ6.ö;�užO×ÝÑÚ±³>ͪèrÙNI­êý¦êË.í%wÛ¯òÙ SYHôù_¹¼¨LÕ„*¼ßQ� µŠ\ª™| ô™0 =“imä g™�.½m9¬¹õ÷Ǿ¶(ò#¹ˆÊùå„[tZƒdýà.À€ñ p¢I€Ê (ä À€6})€ ëg(Ë™çG^ð°•(šR¼ÿ–xè;à?¢¬â@3ÚÈå�~ÄÑ| @/(€F(å9ÿuVý¶žö�m¦¡ýSǧ P%–A€˜$õ™ë@ã_� <~S8tûg_к§()W@‹ÛôÅßâN2U¥g›�½¶Q²¥2¿r@ŽE3w¿ô?öPE" ní*:~öšŒÐ‚Ô°2AOcLJw?!Åœ�ãóÄ`º¸K¾b»´øµkb> ÈÆ[2‘ç¹ø²à±*�òké³·´Z\{ø™Š­–fú‚ ¸|¡…}ÂÝ·Ø÷^âªjcø»y²rõ&lyG\ü·GG(ýYæ/ÒzÕ@Pm0�q›XN&ÉöŽà̹òUp/ºk^Ø^Ù2}£™ùR°�¯Ô!&›%kÄÿ:%·DÛdëHG)Õ�âjdjÂHÅnzÆ™µá>¸;½› Ïõ£4WI‚sxè˜ÙëÀ�Öv»]ÍæwVKcAwä&2Ž«õa-ñ‰ômË4¼ÊÀ>˜e—ENMØß:È+�x:‡Ûf¡?™ ;áfu¯~3¼É*¦<úìVÒÖæÃ_‡âyæ$¬±E«á ù~…%ƒ\wý½Z}—œ°f‹­1•H¬Ù¦—…��ù­Ù–·c¸Tb<ÙÉõ»ºž_ŸeV6¹è›ÉY7ôä¸Ó@ì`ºªe®›ËIœÑ3kÇ]Ã]:©ÝM}¤ßŠ˜ßî«>àÑPâzûðê™ÌéBÜÊûPIì²n‘VÿÏ’rèíõ{àFÄ—h3dFb´‰»¢œ÷_£Í¿‹†¨t"�÷ö­Ÿóh÷ŸÛú°/Qo=nÏß´p‰Ó�ŒŸrÝŽK{ü|³zµî‹æý¹ì6³¡»cë†C:x²<7ó=?ž¯bnBZ¦Öqˆ�±ZºiöQ'ëÅJb<. ë£f>]Úãʆäg¿–ö®±‰ânŸãÚ™´2FÅE¾G ÌÚ²}u7Ë“N¸÷+Ò|áæXä V`c‘~)ܪ_A£VWÈÝ$ux•ŸÁMÇt‚µ¦d pûC뿲ÿ §JXÜÝ>š†âØ ÎåúÓï9!2³-Ô2ßV…p ]»A†) pàÀö Ð HÞÐ ¬@Î\À´¾R€:ŸÎÐü#€#h: Ⱥ;C9^“õïØ€Ç Š5ï š“ßó?­¨’�LÚþ¦ü¹Ú7¹Ó0s=¯&¶–ùÕ‘­ze4ª¸– ¡õ¨ö3Ç')ØÁ©dͯÐB-¾.𠡝†?¤¾Ý‡kÔË3nIŽ]ï—ü|¦Ü?_˜/Ʀýš‡Ø›ëVúýŒë9�•íu[Ò]�A=„ÖÚ)…óƒú„û~D*ó‡.µnÛ/õ>73¢x 9Œ¯F…®[¢Py©ª–Ü€+�ÉP€*\�ó%Ý|}²§á `ÿ±]<õ¤°©§Æ4ÓWõ©V­Ï$*Þ»šrngJvö•ͳ¡ã>«P~3ñÃŒ?‘Ù§MGÒ6q·qSÿSyüÉ’œ?Q¦ç;?ó¶4š÷iXÒgŸ`M}R B¹3C~Õp~#EÎsÃÏø7g/d€˜ÅŒl� G/}­°CôvN3é­Y”Ý",ŽzºO´ÆÔl4œ=ߥ)ŠÊMHßôå5%¶ïF,%àŠMÐðásçè’ðêz¦xg ®ÿ¢¿^²—ÉæüšíÚxÝÍ©ëŒÙªÁ¯ß°ò­Â½³J�Kmü+†‘Ø/¹‹@é šÖ¥çFtØ‹]áÿ–*/دR5üùîK~nŽcš`£ýRüW˜Eî½!^µ¶«ï@»™¾ø{³Èw\™}'y« öæ\.e¹Ù䕉Oî¼ü/� .¦Û^¼”1×_k¹-½ Þ‰@·(�¤h÷ )‰WÔ þÇ}ñ¼|ß!¤™óE§ëw»¯wj‚ÆYdrkùÏ·ãç~kNï`~¿~µ}GnÈZ¿{nòÌåaª"ŸÿWnµÚžÛnUL•[Þ—67)ëi±Î…<²šEŸ[¶ÙΫÝe�ú¨Ë»º�B± }uºÿßÎZ£ê¬QêmN¶|üYèbÌW1ÏWͲúSÉ“ùøÈÒÏS¡PÄx޾ǖyý( ¾)ܪ¿1ê"ù´&©Å»øŽ&$h$HkŠ[€[›�c~�)-§owõ£©ÞÇË-¢æ:ÿYÂàÍH¦¿ý/Ø {�Õè·¤_ûw?™Öl³ëp@v€ë@4P€KË&¦›/£Á(±|ýž¿¸;«£�à¨C—¯_a‹`¿ƒƒ‰×À@8ÀðüVe|3( @{X1TgË4UËqd ™‚éCF·¾ÊL}ìyy ÌKý³7þï( È|KZ4®ŸõãîÃ#I¹£ Ô*¶ 4u‘:ïîç¸O–až(¨—Sw £@ê�6*‰Óú8€@8t ×îhݪ„Ì6‘ÔÑ4=-�úl!òö: …ü >d €ä ÒÏ´ „ïk‡çÁÔ[…¦e'�Wú#ø%'E#�1 #–&ÇèàÔbú®¹ÃµCÃh `FǘË6ƒ3åavYÜk=/õ?—åØÎTÚ`J®­ò˜?²þi/èÌwÈPÖõ=}¬-ÃjÅý[bþ]L{gßùmÈdÍ›~;‚7Û–�Ùxo“-ßÝŒ”¢®Ÿ&o< ÉUé:�Ê‘óZ#'m/Ö’Àþ_(s’Ñ9-ÜŠ ¿uÙKnœcIŽë h¥èF6«LŒ¼/æýÞ¨ ÆÅHH¶U?¨Üný'ùZ£ÃEµ¾æ+àŠ?Öøƒ ¬J�vú,ÔFò³ôÓ<‚^aÕÉÆWX?|cË-gØãÕ *±Àˆ+Êâ¨oåoþr«GGç‘e–¾<säÛ¯Ò4“„kxôŸ¨käâÉMÜlÿÍbë|úµÊ¥øŒÇ=Øè|skÿ`·&Þ›zÎ(^+ÁãPëüó°¿+ó‹ÎüõéæB†2'F¿Ô0›5|aè¥r²wC#Å„�}ê�í+g¤5?•ç®y_¤¾N+¢±å…CþyÍÛå\kdCbÍÚÆÑevÝ%)ýÐŹuuÕHâ«ìõ›çú\<»rrkŒ¨clÆÆi;iŠ<Á/ÏÇÿf&§ã+ÓqÛëð]gEaׇûëê|ì��"5¹ì»ȋ̬üùK¦ÉÏ×_ÞDí5\èk(©íãã~)¼Ú?AB¨Eø5ù$øWÂ@†žB²¹f²¥á¿<ùøŸ¿ØØC7»Ù]¾}sÖ%ÓrÃ>«cýöÙ€íBÒåïš~ƒtÚ ¡öñíØÐnqs‹ø•ç>‹µ¾I»À€»àÀ8×í]?ZA¾ô³¢á+}Uç¿ÿ¦ Mÿ¦[œâ7Ô þxbMýí«Š„HÑþ{k@HäH~5ª4$,³€Ž±Ã¶þKô š"à‰Iæø1ËÉÿê•hËÈðØõÇíC¥¡Ö/Q¹HçÐÐ-õ€ZâÖ’ÇH§µ¿žÕ»Z2qº©{Â%pš½vC ytÈäÈ OuPp½Š®Î°ƒ#N­@}j@£õª… ‘gÕ.„>ÒQá,¥ÑšÅ#[²¿^×Eë,ûÒåRW§=ƒ2p÷2=W «†’$¥æl††‰û ˜(Ô4iä@ŸÐ!Ä£¥ZïY|¼×™x³»‡8~¥Ió?&F ÞªŽqND™å“FuÏ(à2£6 Ï5Qo�ï<çÏ‚?cH•Ykè|ÿ8ܵ9·ÇÒy´žíxMÚEö|<8¿qìî©>ø=qS£[áöÏøìSÀºð‰æ–`Ömæ½¥^-È\KüáÖ=p·yùrPû�Ô%Û‡(,}yëEdwÍ늳 W¤PŸK4%éãÝdT¼qÖ‘T—­„ Üþ°Xô¹ùÅAãyÌ¿rÑ/Ù\0Æ=çJÕ,½®+N�6Qˆy\¬€kw¾5ATÿsh¢ñ·&VÂ&g®Ü�¢ãöïNÎ"8³þ»MøÞÜÇ‹³úmè‚ëEçý¼û4b‹I Nmr1Öa€FG#éª*º¥]}]Ç“EÏmƒïr^‡<ñá»ÖYìБ¬¤^Š6,ÎÁÏä€Pi9IJ»Ž¦çî2½ã4]pw2€µ‘“(¦�m ¸÷ÕÎüj°›ÛÁô_ÅÜäÿ…Ûƒ~¯Û®Òå¬�ò´çok–o>ÕF@KÂxö/è�ðƦÝwôÍÆà=d-�k÷\¯“ý)JõÂó¼·ï7î«cðù%ŽÒã}(^ê¬â`ý6hÊÛÑJù·yo&iî`WKsxÁ%p‹F’,-êc1çMìæ"rIXÎEèÏÙêÞL—"¤Q—»`Mˆ\R†Ä'Z¤VÛ* Þ&ávS·ÞŒëõ­^™ij³Ã?�œwÆeÑʧI[ˆx ¯‡S–ž{¾.…L½nL_’�œ~•XÆôà‰À/ÿ?“8_@OggSÀßLm¨`dòŽoÿÿÿÃÿÿÿÉÿÿÿËÿÿÿµÿÿÿËž)¼ð?€ÿÀúßœ§5“ÑâI~–K0ôÞIAÖ*“䣿ªÍ!£Øtíûö­Ÿ´;Qá8¹ pCÐz"ññƒ¸Np\SŸÝ¸êÙJôø�.o…àQÑ]Ü€¦ö@¸šf6hx·ÐÚNÔŽþÄ;Àœ‡*íÂEÄú lq> àDâô pÀômq"¡&�8öÐÊá‰T �:s/™~0Œ,=U­/)jí¢7­Ïà1•úV�“Rþr&o™ŸÙð§òré–ÇÔÖÇ�¦“V¶í ²›”‰»ÎÚ?dêéPfuA ú€œ @*5U‚îxø<¤æ„\Ò­¿¿Çvcã³¹âQ÷󄨆ÖH­?˜yè }·* Py:$ø� à@áÎIi7ÜL8ÏišÇ!£.ƒvõ/¡šžÎS�< vàÆàÒŠ™¡0uâ|Q[1Ë8”1i“Sßçz*¾e­".ñß°Ml0>Sv_Ò•’NvñƧô/Û"¥Ë�Äõ쩇`Y%_ìÙ�ï_c% 3[_×UŒFkRôµ/æ!jɪ cˆÈÙòÞUßd…Bk7:9nQÌ{Jây‹Š1%¹Ú^äp˜AÏ_ØãÜØÏ¹´Ã×|1ÂnÍþê«}±l*m¿;Ëø¥ÖÛk¬ÏZñëE²KRy¬]؆Ò8L8N1[–o¯îy¦.Í6Éß%ru)#–ïdÚwßÕŒ™$Éì¶ùÜcß“k¢ �%IåÞfy0ü�ú½ëŽË¾º"Ð.„¦Þ{#3Y˜V»œðÛa¸?­«ç¥³î­Võ®hŸéŠ÷mè(tŠhÀ‰öM®zq[X A†î[ív àÕ Ô·§ÿå‹÷ó«³,Î¥ÿr´jÿ¡X~RùâÞs�<ÖÂ×þ9�´|&gÙ” e˜[öÆr¢:�•ÊúoÏö« ®Eãe�÷ï± ïlÝö2ÏZ©NºmpSÂ×¥Þ²¸õ2ùõ5ËYÿw—Âidÿ>\ûPØ'=î³#I¢Žiy�Ee%€1¶¬¯ ªÃm»Äy¹¹È¿,œ†ì4eq]«Rï’Džß¯µQb¬õëxœ¾ûW «wÐÕÆ¼v×¾;œêÅûü»f¬‡ª¯lœéÖ�3N‰²ÃU^ñ:ë»´Þý‹¤-ª¼]õÛj*ÞŸÕëÖZÿÝÞ*1yEÁ»°l×ö—Ì8ÚÆIô-ë¾õÉAêÛ uH𯫾9<¸¿ñ‚8m%œO›|·à3!ˆ¦{;ÙZ5y@Ç€›ì]þ¥™Ñ>÷¾áuÃC»H!þ0s�ç ôÙ¯}[Ò�Èpªýã/j ¬ãš¾nµðìݦëE]OwX ‡,‚úMš¬·ð�äߊT<Ò§R+Zÿ³B¥âàT§Æ—š�ÒñUÀIœéÖ [øºA†hhñ›4< 5ëY~ïºÿ‰:D8èÀ;ú j €VD”¸>¤Eå,Jhºöý õ¢>4â(;Ý À Hƒ‚º@9„–ÚâyèÃç~Ôç­EÒ’œ—­ûòÉž«w¿,K-æñL¤TÕ‡ P9ʱÿ-z`Ÿ—ýñ÷À¹8š@*ÔŠs9µÀ©�TºUÈ΢R5áJ**:·Ço"ZkL@3W�É) @É×öÑ ú—f±Å¿œwâr噯Û7N@�öXàù¨®W�¢Z4¸H¸ï<Ê'Ké­u“+ ÷zHe`èÇôð¡jDü9í©Ðº(¿Çß�×(^ï5‹ Ážá´¹ý§½›ÈݧçÿáûÓ|PÔÄÜšAlL²…k=iô ·çÿ„ Ês• 1‡ ^ïôƒuê ¸3ŸÆt–‚b£N¡¾cÖ…­±ªïgJ�Iï›(³/øžË,?ŠSM¦�ûz›£Ñ×M�õŒéîS›Î´s¹l>3R²‹Fw(9m0œê3,;¢Ë?t– �nሾ,�øRïœv•_é±\Kô}ã¤.)߯÷žùTf}|MlìûžRÝÜÈ`]´—…[ÿä)Ç“?šúåi:WÉøëi›Zqê»Î‡p°ëϊʰ�¨ŸÏ�…Ìø?�Ôqó…bSºÉ??ç'�©çòš’&Þåe~žUݨg;|\Çàdp(ò ¥½÷ˆúŸ–6—�~eT$>~pÓ,ãBÙkèœBŸ—�š¦O¶Pñð:Š.Ÿ«�v� =ÿ£]PVoMž�Ÿ7Ôy´Aq±íL‘jþŠ+ØSšê´\ßô›pÅÞû&}Á+´°éø�þÀÚ´�7 5Þ¹¯�¢ZâÚä àO~MÛ¾MSO�gùôTþF� qªþ�p‹Þ¹ûÁŸ@à¦wÛéÉ&é~þõùÚ¸yê ƒ(ÿdÐÕÁÁbÕÿ�IGk­Ç‹‚ü€´•—8Ÿ]Ðvjfå?Äq*ˆ¡_Ö~Í`{   ‚œ~÷àI€ßn�€�ý~8@*À$NBqn>‘úGh:…¬€|u(bÀ�Âi”<×!fY>Æw7íwŠššEÌI7°d‰ú‘Íjt>x}ÐÂg�–®@1ñœÊSˆ\ÊÂÏù¬õ#d/™Çý˜¿CAMÑ£ƒ@ëš*Í*¶iïǽG%b¸ÿ}Ù«ßúˆщ­„¹uôñ5æ+!-”Q«ÎEAúT]ùº§d׋ŽÎÖZkï$ ’-0<KŒÌä¤ïÑ] ¶›ÁC—ëº4€‘ pU íqrtLœ47y¾�•%UÁÜ“r›ã�P´ei¥:_ñ!økˆÊ ¿k³ºè—ËN}¶n0ÜtWr|Gõ}¯iòg�“r—›(÷ìs†%ô¶†µ7ÂÔ»§4=™âÈîó_æS“yÊ´_á�³Úœv——Ûw5ÅïhÐyñ ‘’KiÝ�b:Å? À Cü‰ (�âJø®Ö~[k¹ù>_Û8®‚KØ…V‹|½ub�ßF•³®ñ«/}fÛWï>?)ΆݱkF)²:Uµ²«÷Ü€�ýÜÙŒeLg _—p:F&ÌÇOKš#ÇoX+s¨L#e¦ë­±|3ææ°çžãs¾ì�>Õ9CB�Ã÷o\ `ݯY×Ââzxó~×õŽ/ÞžxOã>#ê©rñÂ_È”;mo]ßx’“v)a)ráJrO¬lßhq‡§sÿ»º�gfœá¬¸—׆Ž.jÍ­ÿTßÓØ¨Û«züÐ ºžN+]4öIûK–¥3Ç{꜂¦`ŽMÎZ÷{÷:ÕÚ<dz̵ò½IdßÔ¿—k }~W’ÂIæ¦Â§ÌƒA$æGvOSR 8þäQÉȇfý�4å-0˜êó!ðIã&°dKæ²Àœt?ÔcÁ]‰±øÞBn½pƒ&a¢ñl÷;ö¢ Bzy¿ãÞ8í$Ö8³Rn—è7Ï«¦-Ò~J ¥êó±ÎÏË1O«óã¿êú¦®]”¾—>-ú¸6Ý¥î²ËI$ŽVS³ éX…̺¬¢p^Œg|š{)Çü^;r.0  .àÆË±€Ïwr·`‘Ó‚­K TÅêþI¼­~ u‘\m’j|Àß�…¸«Jà‰�_žf©šˆêCÎ/Z•¬ðσ{€è`µ¿÷üA7u}ªü÷ŸB¶¨õ~‚kÞS>3覼EO"ÈágçKª]h´\È1ƒn„x~ ΀JSà8¹ÝýÐ¥Ô¦y È×ÌZÅ!¼ß{%Aé/çÜ{‡n*­á,Àž <ü~€„ þáUˆxHÅÀû`�¸¥ M+á =ª2¿+ÛC4 d!¼ù¬žúïì2d ):{¾H„1Ú‡ NöÏÖ¡&�h-ƒ«P‚¹:N×ûgíJíà³ 5À«­º£4Ù&�&à�h)ˆº3Et¨ÖÆ¡Ø9kŸÚ$ÈNÝ Ø�”zQ+G)óu§~äñQ-)ág§Ìóñ¿1'b”-âñ“7—¸ùœéÃåeâm¹|íàxä°à”)Wç"‹FÝÇIÙ/w×?’êÀ¿¾N¨Æž¢ÿ]ZÿHqöo±ûöã‚í ½íÌ´†K=Æf:¿ß.pUäicùŠñ½U»·-—§]344^Ëqå§î•M—EÇ{óUƒÞþmÓ~¿‘xéf�ñ>ï7®ÅƒÚô-Ëp¼Áìç÷¿ˆ“Ç{vhWÃâ£õî$°§ãÍýŸéýž½ïÏß_ï6‡?÷ûÏÔ4z>ª5zk€qäº@ŒíÑÍø?7c*uùûîë¡­bŸ…¦8fyÓ»,ïu]ÚÛé‘ÚÍZLœ­bë³¢jÄ$ÍŸÏ}Qÿf^ºûØöV:w°ÿi(‡X_, dÙ-»Y¿e^Äõ?…ü€J|�›ƒÇ¬ÿð6)=¾¹ß˜ÆÇP‘¸�›?ÐMK­¦Ö‘³Xç×]C3 ¯ŸÜ�g¦ý¿Ÿ'êCÜ\ü¯�m�•âk�QŒ}ðù$ ã[Mýô¶"çg·¤Êó½F=ÈHÌ.¼qV/W¦Xð– Æ£JÇ׬M¹ß@* ÅÍPTš‡‘] Ã!SÉ[·$+d%©ŠÏçøúcQ«Ó´¶¤ˆ#_‚úNþ¼ u=¾ýß( ðª@ð¶ßÉ�¯Q¨J……ªü;ÛÓàÆ 85•ˆÖTÎødÈAa®d2ܵ‚þ…^©ÃbÝbþãç^³ÞÔ£Þ̤]�VGIFÔ¢SήEkýt�óldÑÂ|ðBQÄAT­N¤”éDS¯hº»5O%¥Éʨ£�xùø{ôË"ù—®œ :´�niá_æ{Ïžº˜bŽEG4g'�!³ºü{>}>i9ÈôYxÜ<’GõØŠ�…â ¤…’Vµ°Ù÷L¿ÝÞëö ú>-1Ô=Š(æ…={ÆÛ‰e\¤Aº ]*oâ¯PGTÐhήˆ2ˆŸ #2ê—¡/j¢áp|¯d{àÓeú×$nñ?^E6µIÓ-·h¡N¯Ôê‰ÑAŽ2·òg¢ËæRÙuêuÅGÅÏ{�_ªjC©æO5gÜ.\‘Áâ>Æv•]âªKРo¸�¦Ë<ÐðîÃäÁè>¼\ñ0+½ï·ëê×&_WÛÌ9öT®ˆÇþ„–Fªc©§FæI§©‘-�ÅØ•·ÂæNiOŽwé¥ùÿIì¶Ïþ�èE*Kæka!"¹-�¹¿£Ÿk®QÃÚ‚9Ëûc·{l•¿#ÒjØÞ«¦on/ÃvK¶”¹ü?ý9¸Î…ÌIŸÒº+Rc·ÛôB}–n¸Ü øOQ�óDƒæ#®­Ötψ3Þ¬¾Õîß~�]eÏ<›óïï &W}^)‡­lÏ?0ÉÛÅ÷\a:>on>}­yX¢ð{|ÿ .·G�i¡·éN;ééDÊA"ýÐ?V¼+ªÕ'õæi;,™NlO·KÓè%�‹„Žßób…8q¦ó,w7ñ{uJ@}|n�Ú´ç{¸À«n!OÖK7øÁ˜þ>ÁûøYé Ïdã2„sk”*êä·’MÉÎ8mOÌG›qÿ™ÌH_Åðà‡‰äLó=²$FÿçÓ&Ä]ôIóÍæ}-¬í£�Öe¥yï“\¾5ÿí3ØÚ¦cê÷Å?æîëü SJi‘9SÖ¦$¶aI«Åâûá»õCåOggSÀóLm¨` •ÿÿÿ²ÿÿÿÔÿÿÿ¯ÿÿÿ¬ÿÿÿÿ ¾Y<¹Í±>?úÿäj“Rä üåƒBh|€�ÛÜ¡k©Ã ¾†6~ÝW4›æ'7È–þßQçʰؿø§d‹J _*Zuô§ÅJˆëM_×&âi¸ÁF3ÿÅóeVàÊn}£ãþ°™kEdV@jÞð×��ß–6•–|†«K¤JN×@z²WP¨�E,ž‡ß‚øSdfd`™Rù 4ÏVGh§&ü¿h¡³> €³Ó[&½Ü³V�*ÎÞPyu¨}…B¢A8�Ž�»ñµNz/=^ÊIM¥�Ú8'÷ ‘yÕŠôNh•$d r€ãÈT�x,Å}lc92:)ÇÂüñqàW"§?SôˆG‡æ'è<@‹–ÖúE%I%p�ªU«VÙÛ©ô´n}y�®QݽèåÈZ¢{GërãøóøçÍ�Õõt�v ²� ÝCãým:éíñ„(ðáJØÊ¤#èÍãÖ�]J6öÔ{÷jøí=my›«úìæö´aÛö=3R·ð“j«ÀZuˆy>x”Ø!cS7Wõ¾ú­€kNYìLµùª·ÐÄ@1j@7 EÓïVFØ ¬IÄq,ÿM϶×åSÒmž•„SWþ˜SX «ÑÙ­�žÉ5¥÷Fñ%¿zÒ0Ìâ8©.õr)^^ê$1Ǽ] @›–òÇV–ŽžÈïšS%‡!iíAtGëN—{¯áÎh/á"ÙýY9{Öü\ËÙ³kͱ'pä…JÜ´˜Üß5l‚HÅGžþo¯ù±÷ø[Õ®:´x†Çj©é$Ã乫s“¥ñ�æØ;ëýÞÏ“á[üõꛚå·}BNï1Vü·®Øëw&ŠŒZMŒ�¢÷%’ÌŠñ4«›ô{¹î¡”5L ÿé|òSRrŠõÂý:QÙ‹Ç{ÉËÔXârjH�’Ž|wÍc6SΓî6~T ¬W2"ïFýsxqaK¯ÿt*éÇnGSâj_j¶×çyOWÓ#€nS¡ÈŸW¹5Ï-n LÛO56ã7a;™äGG‹ êý¼Ù4ŽÔžjyŠ�t(ßê˜,\¨þ$(Ï7}½âO¶råþ]ÿ6Q¿n€1Û_÷Ë1Á ê,xÇÞÜ)¿}ü1|+S� �øî/ÓàÄ ý$B,zaŠgöbÌUJ[†¢ølKM»ã}8¶qÖgé°¸ÈúÜMúFy˜âéÝ ¯þ3în�-7óí–-Óƒ�.GËÿU•ÌuÈ­*ÜZ|r€ú€ü×&›È»òé|º ÿ¡ñ Ÿ<à.ÂN%¹Ñü"†‚¼¹…'9Õ| nº>ñB½.=ªE ç¯[ßÏl»b—çcJ‘4¡Kî-‰óoƒ¶+dO} W^÷ÓEO¹�*NwêÐ8�:® Ía¸(ÑzÄá }¹²¿Ê±îú}2¶7_î¯ÐêFtT¡¯†Êá•bºýÈ\OÕÕ�1ÃGnƒÏÿ¯'ÈŸíJ¥Šµr{¯@ZkÅ© ùp@ 8ÀTÏþˆàóù¹¾ù’*ddõY’Ù‰Y Òé÷ªCžÚ¨z¦£g÷^ÿJú>ü‘%§û‰ëík^@Sì}vkg¡k¨¾îõ:­íö$à´P³žJÕÖöwl}óÈß—HzÕ(• çèZS£þAB«Öì†bX:'íŠG�âÈB€§„kzžåû{¼ŸŠŠïµ¤Îk†¹Ò—|¾þ«2:åÖ ý¥×…ó®gaÉÞe Ýt¥kš/•&ëÿxã½þ *û¨>ØÍž18D¹y�å÷¯=AúŸ¿¿ªÄÁIëÇQ$ă6¾Ý™ïäénelöüBÓÞ¼_爑ÌùF(ä–n³rf¸˜|aAs\<~±Ïƒwÿ°õ?ã¤zñòf+5•ÌOòUªší{ZE*"Á¥@9ösöŸÓB×MsG›Þ 3YO¾dR\GËf�«ø] &±Ç'M%ÚË,fã(Ôn’3“鋹N¤��ªÚ– ‰áþ•5Úgm€SC5¨÷^Qè¦ xS­Çç7¥C¼¬oÜ‘£6[«Ï�ÃvJp§¿­uâ=ÎOy*^Öñ`ŒÿVì}é ³(ÐZ¿ë}&ú«õdÝ7G/‚•ý�]JÅ7±Âë;õKv�M°ó¿QD¸�0Ǽ}{ó5Ž2mê4$•ÑyÕ,ÇÕÖœû¸ôQÖÅmYÏßg1æÒ¤u׌U\Õ<5&/-–²æõV-—kóW�EEý—¹ª&€6…²'ºR×eu�Zü¿¹×¯UùWþi¼òÿBë þ©Ðš¼�ÿ@óš\á™ñ+æKKõ ¯ÿÒ‘îxì·hQ[/K&À;"Oa¾�…FÆ\þñN™¤lïp«þ†V{;Qx>yÔJ‡â|ì·_¿t*\‘ÙhØ¿XVZrˆFvîDu@ׂ*ð}Ö* Š´¢U Æ�u­Â¤ýï5üþüuëOD؇Hmò÷%å[©qV‡üyîä�S…æC¥‘3ÕzFß:vÂÙIÌv„x f.j¡ÐYA(pHwz ÐU•�®ÂÔ¹ìfE�yÉh\>!kˆVè½ žtR멵¶vå“EB³UŽH2ªä|J+Îu�žˆÔ<äDT�‘Ç^ïqÉáïõ–·�S̳ 4E…þx¸zËW÷þšÑç ªBB8BkÜrÕWОÏÕy@—“1tæJvR¡f�B˜  Ô�  œ!€ztŠä5ÛJyz�½ÄOÆ×z~th_{Ó7á&ý÷ªîàÚ˜hcþ‡*NüéÂŒcë´…|Šäµ:ðvàá©´Ô?aWz§›,Œô¶ªÃÇWŠçpϹ87θæ%^Ëi&Ë> Aù|ù,ù2W[Òú{ŒpÛ½·Å.›æÂ÷w¦GÇãVþhdìIÁ1÷n @ŠÁ϶¬×adŒŽéhnš1Ð>/Ì@�Ç Þ*bçòÑg�®gD´Õë…µ?æ*õ4ïÄ¡ôáwæž'(å/£ø‡ýÈ•’ØÁVÎúÆkZF–·kõâ§cöVgNî[¡¿obên\ÜÞ!¦Ñ:•ëƒÞ¤Çæ ½'SÓš}cû¿>¼õݪ»Õ¿|ªÛ²õjîç&¹È+§’­'gªï'&ßjz¯¾¼‰HÇ8ªù.åÈU(·j/2nü‡]š6v¿”m„iåõ>ƒ±§yŽÁ­¢§ðÝëå•”?ÊÌÿàŠ[ý׉~.J0ö[ §G{Ns_U†}³ž‹û¼úø“|òàïÊL‚ƒÍä9ÞŽ��Œ‹ˆV€:8:ˆ®p/�q8êÿß•’`Ý‘w­ P÷ùÜ[Ô¹“–ÊÆ&+÷\¿ ×õµ]á�¯{û“@¹Yî�–ª£îIößöKÍÖXû¬Qá¡§¨?`— x"�t/‡ð>)¿K5e>®T‹åîn«ëü8¶qìëƒ�¹evˆ¦æýÜw›û®Mso‹*±Ý©Ï¿|(±¶®jÿîŽ?Û‰½Qëj¸ÃÄséð,–lô@ãú—û^j¼ÿ"{û@óψÆÒä üõ—�òçÆ+<:w¡¥ ™Æý�3í´ò¹rCo\ÿ)¶ØZß±°û¿ó{²-Ôgþ<9IýuÍNˆ}Žõö-ªju¡�_ç&…¸eøöy—¸"ÃÓøÏ§' ;—f‡ÜïDƒ=Œ@¿nõU¨´“»$UbNÉ-²¹\ç:Ï|®Gg}ˆ¯HUæ›Ý+×>_&öÓKñg÷&õ0dÓ|ÔêOˆÕñuŸå?�˜*0Q � y«V¨B"™E:½ŽdEe�é£Gƒ*wd§–ýô�RA'º…ª2ÏšU’ZŽÆ³tÐR©§ÃçC£.NvuûokªŽ2…FýË×Ã<¿Kîòóuoî¬ÿ7RùsïZ'·ƒ|Ê-ÿø·ü;ÝT<Ž*€j@݉žgç—�êlÇk$óñ` ÉÎ<Êܰ÷D²HÓSk¨}ÈàCrJ0a‰•ïäĽ)sÑ/¯ˆÿ°DäÉ_Î"õQ‹í’�?Ç�žÎÈå8¯_ジÒ2êçÔ]_¯³¹NÞ a¢ÓéL¨Á䢻#IÿÜFï2—Ýc›¶|ê+1ý�ŸÜž¶oŽ·1wŸ­ín̤˜ÄÖ^×Ï·P¼àÝé‡f^¾ÍpØ×S¿rŸL©‘ðéouë)ÞzŠÇWŒw°âOÄšW¸˜{ê›Éå>ñtQƵY›rt¤ß´\$5³ •}±ý½77ÇS½FšïbpЖ�å2'ÌSîNuèÐ…Äk¿({åic֯ɩ �jì„z­ÊåÍ©Y(‡;¹Ê‡¥ã�»lívàŸ_ÝÈŒ`uÃU—N-œá§áCaìmz /÷0v»lІ.w¥æþªëÓï€vþÇz§«÷Px•Ûš¤vçcøO „œ¯zÒÀïn˜7òÈŠ;�¾¬‚ »xš ºpõí[ëW6�_Æõâ÷x¬c„<®Õ‘_gÓ_wr\«¶'ºÙ©î¼Š»|°Îhé—gâËE°s–=ÂÕTü±Å B¥ÓtÛŽlïjBVϬ£dþ]3ª'š WÙ¶zÓ˜ú’Ð^Œ-9ŒµØ-"¡Ðá½Õ¾Úk«ŽÐ͉ a�«—GôYÇ™ˆç Æý÷Æ–Žpõ:ÁާÅ K/p–•E7à"Æ‘±ÝTÿ^ÿ}Èín�ãqþÖEOšÜ+¿äìf1æÏ}Ac:æ—ª–/ÃrEêû‡æ…šj®ûþ¨JªWîUQPÖY|°!ú‹�?h’™¼±’ûG£�¸V‹7™¹ŸëþYa­5{íG {úãÏÖÈ £}žîü´¬Ö[¹i­š^Ýó?ÿ#ÜèäùÅúVõ™nÛË­/·½d—Ín—~ÌËOöM ŸÞPíϾ:Õcü_®cíwãó¼œùc™jýùº-;°/3ÅÐý×ÙÞvK�Y7=yæÕ¬³ŠÉÓâl<þ,j—ÝóªV%–©FÕ{œjP~ô í¯�¬L‹ïs)pµÜú}H­ÑºCýÉI÷i™õdŸë¶Ìߵƙ•Ë›c¸>3{¿ÝZSkÕ*‡T©Y'g’ï¸:„˜¦Ïsì…I­UZež§>·g>ËÖKN¯jT=gíZ§²ÔÂ9Å‘úÔº”R¡Rßõ*&'ï¤.U¢îsÖÇI”õ¢®NKQ9Ô?Î�I(öåw™²¡Fm9jPCàè¬�>5g*]«P+LQP+ÒAm¾Øk¡)š\ T‚®H½ªjA�;æ—@dÐÔ™(§0?©™ãWï)F,O»¶í¯yp§§¶Ç®úE!r¤’e¤ �LÚbǯ¼’g¡g'¡yQþ³³Ÿ…�jZìº~¯¤U;å²<¬gžŽösƒ¹ËʈU‘�ý¾ÎøÄÌ�}õOUéM5¬¦û·=D+µŠÌ[±å7‹OÉRCØÄG¥„ÅaIÚËpŽØCÏ6óã¿ô@ãsÍžyx0è¡å©É„ ç8SÍiö9Ã'ê‚k‚ÃÆ+cd£|¢_©sÿÈ©§ôLË€æïösc2Ýüþ])¸Úïµ0~ha~(�¯/¤ì©°ýa�ìK-ù)dÅÏ.>älj æÜUVžýôyu×ÌÛO»ûí�w»Ï¶Þƒ”Þõû’œ4¸{ô5«Ð¼TJn¿ÌQõá¿Õ@q i_x½]g-Ëg޾Óþ9½"fÿùÝ»Ø'¦TÔòlÓ^ P¥p÷‹öK©Iîmç7ÿqò[?� IŸ_$õ>L¡õÂÃÒw/xRê*ÿÞÒfT\g�’Ò"›‡{Ô?'(°˜½‰jmëF1þèϽ�çpé«ïÓ }Öåq¼»Ç¦G+H{Ø-°Wå%g'³€•RUíÓ'^ÚfÞñ`ÉGš›èï½)£úÏK"ŠîÏ`ƒ×jIçrH³L¸u·nUÖ{WQ…–χÃq2î%c[á!@;Çü¹÷Jó|4úö°Ñv[×÷,Ú~ËâÚþ^s¿lòó¯‹WÇZÚ÷i8Ùïë½��¬Çý¡»½Ÿ‡9ÿ§¦þçyµ´uh¦ýÞ?̺[Çy“³cÜdŸfµŒÕe ´Ãûô&.´~Rº5þÝ‘MdüY“.`vAL^ì&ø7 £wmÈ®[Ô OggS@Lm¨`žÛˆG�­±ÿÿÿÿ@ÿÿÿÙÿÿÿîÿÿÿÞœFÏ�±F-öyÿW‡&yýj¡¢�Ö“ÚÓn¿—ò�W|,¾DÕóÂ˾¯ÎÛ(¦�ãYnÖ*™ËëÇGšªß»¶FTÈSéfЏ£�)/ £Ó»”>­ªá=åj.7~Xhâæ[óû¼ø¨‰-†�÷½Õ¦Ï»«,½Š�ï×|�ħ޸'ì×Ç=üXÅ%ÍÕÂÚyó×uʰ´HŒf;|”J?¾™²uiJ¬ôé—,Íž?µ§ôïÅoügÖYáÏ=ÿæêúßÿå3ö#o𜆿oíÃîyþߘåykŒ>›~ä%ë{Jy«¦¸Ôúõ·/S¶;U»åš ùQä$Bö D¼P›�ßi|U·J¼cÝw辞þ­7¢|ÓŽs¥ŠÃE®ROPó;j&ç†ùZ‡XN°½½eÅUJ©=OÑg":Чd”&`{Æx,L~\2Ç—Tä½þ€)…ö×u1·ñ™ÙÑ«¯¯ýîún·£ùÓ]¯oßV³Ô_óû·[7vyK{ÿâùÕÏÚ½ê_ªs½ÇÏÇ»k!ëñú7OùéMè9€3;ˆs‘ýÞóËÕ—=Þ·‡Ë‘x:OhÒ2\3Ô,žšÛïŒì;�›ý + Å»ºÕ•{ý3šÄŒêóü%Ï‚wPÚ©2„eÿê®t}ôzñáûŸ™díó.Ë=}T:9<Ñgº„ þý7)R](Y4vò×4 $åú£´ªšÜ¸ pð˜&öš‹SzæÿÝØF£Ñ‡SÔ<^:ò'?ý=‘‘¨�KzÔÈߎè^‰ôéû™©M­}ûof,À  «lö§Ëuö1†é–:¶Ös˜“ H­„;×|»ý‹—ÙÛYÍZbÜ¥VѲ¶óê¡iU ¥¤ÿ|=* îöæµ01åÍ{Lgwé­kÇ¥2 ~Š@ÑPOòCûDŽE꯯¯èAT ‚ˆ3!ŽnqšÒ)±ôg¼$K"dÝm—ÆIФ@Xgnô-¦Õ‰úp¾^‘ùÈ G�“JfD&QÓ[æÓG–Ä>D÷ýòPH†ôòíbOX¤Nè=ˆguæyu{ ÖÖñÏóøä¡9Ÿ8ÌJB:í@àhêíúð?n0 # tóLÃÍtö4�J�RºË/wÚ]/‡>gŸj}œf�æÓmpâAÝ_Õ3�;÷+ãªÏLÛGj(ûKqhéÞž¥÷œì‹ 5'ìõÑÑG°Ö‡½òvÿÓöYð‡ãÛ»ÿõ‘¨žÁƒŽn.~åkmæ¿Ì0‰·6hVëyCf=C:î}½Â¦¬ØzãiÙ²õÂÍéÈq¹êGwæKM×é=׳TbÀ\äsõ °»p„U­I——gTÛ±(Àpî¾'õ¡àJeFžÓÓòiOùÚRË X ÁŸ·!¼F�*Ûb3v<Øåë{žüÈât‡ËêÇËôövÑóiÃn·›o㻣OCixå?­n› „úRÚ" �úTFVTž«ü΃Ö,k¼ »¼Ë¹Kÿm«Qýgp�îM\âÉÀéØ{_è‚„\0ötg´»vE¸VZµvì{%v¾yi\›p"ÑWÍÚœ¨Ž}i>­{ðëq8�+Š%÷/�t�kùÚÿ°9Ø»0:ÃwÏ›}Ââè¹å´Ùßß¹3¾~×yOÊÅÙwiéáí⛉&l=9þ 5êØcgƒû6¿ùÇß~pÙ`Ý׌ÁS¤¿áñÄt9ËŒí?O¢ö¦sµY‡Ý ¾£Ž8z‡Ñê¯0,Kæÿ¸^ÝV4Ø~דµ²:0؇NæÆe´®) œFÌ4�VÛûé™÷§ï%yŒ¥l÷ý�l×nÙVÇüs‰~áÿî£ûþq²¯ÝxŽþ¿èQ «Ìþ^ǯvS~¬—dzóýúß~¸.«•su»½31?ïåã¼z=šºî/×õá²}ÇÏl ׺Évî½Ú¹·]ÕîYnò9:¾VÝx8žŸ´ÿýïÏ«¼º>Çù<÷�ÃóôÏwcRÛd{xê(oß«ëíõ³i6ÝÏçïp~õ¯Ë|Ë‹PV›ÛßwÏXòš±¬ýn`å¡3Ùý‡î<\k‰÷¿´ZÕ¹ì_Wá^:¼Ãï¨�„*½ÿ�ŠQÍäÓxEe·È®õ¥"j&@ããý9]1¶ñÃÀUƒåñjÖŽñ÷”L‡ 7–îò.À…ÿû ­P”d·)ŸIW2ƒÊÄÃä??�à"‘¾Œ»pq% Ð 0òc½<ƒ€òÍ"4Èž5‚jôã|':z¯M¹kÔZ!É·*•¢ÈZ_©5µ€Y/:Ø@ÕL*lî;gš‰¬äûYOçïUñýp‡Ü¿æÏPE¤$*…2ÕD*4a߉§üÞ]õ’Ne“Ëã_J¿9ý߈K‘{w£T �ç˜ïåyž}B­!5ˆ‘êz(œx`¥pEwÓ½ÿ¶VrW³g �{kÌG7OÞ¥†„ëJD�ÉCD�‚ERQ‘ã-Us Å©±ÚdNQ¤Hd¥H×0Ÿ¹·2ϹyüÊ®è~h«öT}˜N~Àu=}|pÙÙD}n„Ó \Š„ÐYÓ6{ƒÿíNRkö\G3‡‡˜QôùN׸π¼°hö×Îq’B‚./¶Éyan ì/§Ê\•A·¾Ü:"ê%ás$j 늉†ÊuÜÙÇ&ïZcb5½/Š#¢hä—,tÜõ½õÔŒ1Ëž\/%ÂØØç‘™ðá�ÚõGKé¾/ë̺.ì÷ 2-YôÁü»Bàí>PçOfc"‡“òñµ£šõ¤•*ý™Ö�jÆ%\$3ª KŽ]®¹L*wl<®»ÇnðÀ}åÏ%¤dN½n� ,AEŽ7}J/ëÝ�Qœ|ÇØR58ÚàÚ›Eºë«I,v¾¾ó³À¸ �.ú[$ì=ôŠÃÅ VfwUz¦ùÞ.˜2Ú3M/ñÎ݇¨x õîð:&ᙾ½¶ÄæT±k¸eq›}ü¤ùÏ«gúþÜÒÂ1ÍoÁËÐgz·9›€³f+÷Ìì>ʓЂ ë¼R7Òö.‡iï›§ˆÁø£¼–Ç{ÿŠœW›xu±¶·×¥ª®Ÿ×œý/IÙ%‰1²:–>©�sUoŽ™ý\îÝö1­ÛÕá%…f~õj⺎ó±ÈÒ$t‰uS²þ”k#ϯq×x™ÊHë*Û=†1ñeÚ‡.ôMjŠPUF?›ª~RÇr’½tïïÀ쮪òÚ½õ/þï�*Ü­kª :~ê~ü$îÖ%êFÒò¦¦µ'pÆfuµ¥Ö±å—«Ž§ž8ýöËwÊü¾/¿_Ak´{O'Èóq%xfu3Qøàµ=£VÈG¹©—;7ðæk $õ4ø‡­ï…n­ÎÎöè¾5´ãß;ps]‡Ön¿­f©ù�5 \³õ/?_ÛûÛx€#d±ü¼Žü•§^\oËF7É~\NWí¨ë*>ÿ§?¦\I CeÊŒøü­§';4kM‰C9Š„h¢Ïù“¦VpTUi=Ȉ�iÛ'ÏKÄÏóÑ }ƒÐõù°?^|ßÞØC![Ä#ÁN!÷÷P£€¸�¦Â›o‹âƒyÐ�K^¤©Nº3¾ŒOÕÑÚEHV<+´33¦áJKè…³^ý!¸VuyNJEÐU8Cq@‹%æÐrÕõ^h¤ÆI|n™ó«Ï™*vMò@]iœÈè¦hèžÏìz@ЬEà¨Bm’]¹´S£9 IÌÕÜTô¾Ç¨Ï–’‚ ;ÜñgÁ&uûkˆË‰ƒóš´ð5ÿ/‡ñŸJåt<ØO2ºŒÏ¥V‡“¾x˜Å¾ýF<¯hÜÿ$ò5]®û¢VrvÎÛ§AçpSé+©{î×”‹ï_tr_Ž7=W½ÛWköÈäÌ+ãßY )�ŸX$ÏZñH7ð¢4‹s´nuœ–"dÀ|¥Œ8É™&BW·•D\|ïÔYÎ#ÂÕ¿ß^ù¡mÖÃE™Rg}·@$ãYNGõ@Þ¨iT‚ÿÄIËÕnÿN»þêR®&‹úpÖÊ¥4ð0QJe5NÊ9éƒöšñµ—é§ÈrÑÜæ8ë"I¬I bX9ŸX¦áU[^ºvû™UÜ}ä ‰Z–U‹ÎqSzÇäù‘âšzœ61‚2ï–Åñ›¾+�#Ö·wãþëåáz½87Xú¿ó­û\´<Œ6#·ª«ÆÿëȨ8*ÙýYú(w&s…Ýýí?NmŒø‡Ú‰Ç6ÿ} §%o/y+ì!�gùÙÖ|ÖÑ[l‹zÎk[.D[ÆwÕŸç¾|&úoõúÿ¦­S ¬bÊg$7Ÿlâßš•ÎõöÕ¾fÆ ²Ú¤ÖÙúí6·”®`²™7Úï®ïÕŸé:¤ž†³'—ÓßÅxÓr¼K0Þ|ø%̃UFálµ3;Ì�§ºM¸Rt¿S¹¨‹‘ðþJŸ¢lƒÓ·Øs’ÈâÅš;õǃ�´{ןàLyÝý+ÿŸ ¨ó/n¤ u±’Ó½?k Vûêõœ€º�øvˆ•µVùÔÿúƒ™¯ä”ŠÇ½JPûõgH´â¨ƒÜdݸ8YáöýÕ­~é®@õñå®^—ÌBGùw”€†ñ’Å6:-#ÕáX¤R4ˆ4\²ö|x¢E¢Ÿ¤zž!þ(S ò Ù=ƒ÷ì°ûçYAà‡æR�öó?i ž´ôà8€£•vè8Û3{}>‡g‡¬:Š Òó÷~õ¬GÍ*U¥R‘*k&y5Ï‹æ=ªJö%Uóp2„ù£«B펜¸”ètPp®š‹8T™ï‰Ó8óûœŸµ^I•~¶Ãp¢nT¿•)wL?ÇœŽ˜­3âÚ‹ŠÃp6@�£üx’ñC(‹-¨­ãuÆÅe¹Œ%úpKUÇibÍ?fð…eÞ_°X½÷õI? §}�ä &è#ú]öÆC„Ÿ™0sýÈ´©gõãpù­¦n�’Ã~¶ìemŽ™a%÷š;•¡ã”x%‡ÖV•y(ÕjmÍšQ�yM¾-¿?¬aO×mŽÕrâí-¤~›òæ�›‚�l¶Ç]¯Aûɪ×ÿ�×á[Ûíåv¦œóì‘úÇ—7Ð9óÙL[üó“Gið W^ñ¿k¯Ú�ɰ¼Uð‚pÙ/#ýHk§;÷eÿë�ûí+½Ø\ïãê8:‚¥ò˜ª€µùIå©ÁûKÆÆÁý¤Ïðšà+ε&ŸÏ{|}â“Xü—o4'"aqðö €À»µ^쯫Æ~Õ¯øe¶w_·ƒx>ìdÖß‚ ÜkØ9£Jç àPjï=úˆCrFK€ù£� C>ùmóG�3t'ô…-×r¥t]Ï­‰å‡– 'Ûh¾·Pÿþzñ¤÷ÞaÀ-¼²+pà cåër ð/ô .üÛùT‘=})nx˜þ©ÛùÞõÆ…=Z¤ËçžÚ!´±ƒ�á‘Þ[ÃaOù«ƒáºÊÉ®j<íÐá=>S;²}¶ì½‹Žqñõøö¤54wó#Ñkp¼è:_Ñ�e¡éÂŮع¦Çñx=üŸk³éùˆmKÅ3Õþdv/LÛgº›Ö„³W¹³ÛŽ#Ý?84܆"²Ü¯¯$*jë¼â¥VS%ƨsbz¿Š–ÛóyÛfÁÅ>8#bmä­5b}Z|™ß…öËǵ>„òx±Î�×çÃ'ûÞ7%?û(OggS@Lm¨`\ǯ ÿÿÿüÿÿÿÒÿÿÿÃÿÿÿÔÿÿÿÐÞù;ÔGš*e1Þÿq¨ó“ÎáÉ_Ó“BÏ�#×FÀý½ŽË¢ã:¶¶ 0®ë˜Èzèö ¡Ï©õþ�é³Ï.À:ÝÚ"Ñ.¤É¿®çHDìçïr]U”;ck8)‘qÝK·oÞæj×hnM­©5¢‰HÖÛï 9ü¼þÍ\n€#@óùæ_s}4°hªÖZAú?ÿŸ|W¤['.š�(:qŠz÷gåj<똹YsÎo§JÔ9¦b;û›³ Ò @ š t½¾ýßÍê.ÐP@ËìP@ũмÌA³ C{Y®ã]?›üÿ…ÑxÝ•J (è[?��J EózA ´qh²*E×+öP¾žµ!³j�¶r(8] ²./gJV`'R“bV§óJÅ�âô4™¡ª Uÿp.RòWbÏC·GÙ#ç4¤ dnDÅ)* ãCÑ‚>drºŸOOVÓìÊ�Ìz�¨}£9ûË}Ñ… ÞHH8mÝçjbæµÂçf¿o¤•F0Tçüø²ÿŠeü¾Hnqòp6{æêN©Æž›‚ùlÎVÑÆŠÅ^Û¹‡.o@@îüýeŠYðûý+už®Z°P!ã™ÇÒç‘Ö½ÎÏ4��©;DZEs7ÿOþ‚OoÁ:Ô×3Õ §ÑW;ÅÚÏ rÐ%™2"ö¬A¶É†¦ì2¾¾kO¦Zh¨D‹ †,°_ˆ}O…r$á´�¥Õì�•^öðŸCZxÎ)SìÛ=ia¤R*T}ô~þŸmܬà¿c;ôô¨³¢ÂC=9¿ÓÇÓ·ô]#Žk6¹üÕó>•¶'*È_‹ÞЙþyݧàÊ�Š+ÄAí»±»Ûb¥„êj†Ù‘ÒԙݳóÛ/ÌuÊ_�§™yìÔàA]¿tv�4/š™L÷o\ºÀã+ÒdÓnÍñM)³$5uðøN’»½–昘qL×$å_\ÍØ³´õÔä»K2áû*6 ¹¿?Æ&Œ{åñ*ñ �¯¥êq�`+KX±¦¬'áÓ}�’¡±¬U²¤UˆoÍ7N:•ßçK+³­+zßÅßï÷ÓÝ¥]oÚ¥ƒªeRÅ=wýÒ[Þ~^ÿÀ¶\–?̾÷ѿΦBNfGΟ¶ó·>oÒÊ“¦u¹jªnÊ�ÏÚ$|ß6¶ýí7&ç÷TLÍèe»ýîi—xW%ÎAnŸ´Kn?×·¶x)æYõ·ú*tÁ›¯ç£¯`Ý(Ø^tª‹>9lʯ´Ž�[P3)-ÞÉW*#6åýß\NR­äæ=äª×ÚùPl³šh~<šýò¶=2©wû:û´Æ“}‚–Ž?¿ÙæÀl¤n}8¢ç ‚Õžü)ÒQ‡bfÌÏO+=Tà>-ºDóÿpk•~ò/Û•KKÍõe*•`è…; Y æqó‰—¬;&ÀVûþc¡p€Z Z£h¡óöÿ“‡¢©Ù‹V*@ªŽŒ×£@…Zš­Šäå JV~—ë9dW’#ª `éÜ÷I˜úï„Vù²ŠTª£€zº¦·Ž Ez`åK‰ÐË{>ŸŒÐ‹ìÒ¨>óz]ñ/}ûqù¥›éZ§PNJW ¨±ÿ¶ªþ`ª@ïžH©ùùµõ’P:´$Õ©@÷;{ê„”M(Jz J Ö6º×W½-øì¿•*õ¬) Cýü;ÎßËÔˆæÝ=Twshn ˜Œ�}$ökúÐy,ÌhV“]P¶À�Ö®µðf¶©]#æçñîÕw»Ì]Þ¦›È3ä­{ú,?ÖpS8Ö[lÿ\)O=Õ>˜HÄ÷ýɃ ŸqÖ†Ö ejËó}rãúè8ø¾K›;øÓÙýGªhÑ)~iï)’Þ^Ž2uyÍwâ»s�¼vÔláã{ЏT}ÿ5&ªRŸª¬ªGY/×ßµySß 3ö›<§Å…]•ùî©ó¶ãuJ@)ø>`íâÿCRÖЦ.¾”i€ rЧ|²÷{…>8,(µ0ó>dýr¹}Ëâ¬ÉD 2=ƒ°ùy¶?­¼)°ÿ´\@/�Ïî¬Ðu³s|âê·K$s£ªæ4�èG›¡ï›É5&s¸jk@ïãN¬^oô°|ò¯¶Êp·òöý�Uî–o´G?Òíï—zLA]…¬ß%-ðŒ.ðõ?5f/ zކKåóâ�ªÍ°|ßMƶ }ºØ¯ÇA¤ðe¼‰Ö�U– Bï‹uß`~R¿ð©¡×4ɱ·>E–Rjùh•(¶kÕñ¥æÖ(ÐtãGù%�ZÆo©‰�7|TîežôÃÏ2ãÿgª[eeUY·R}'_Á÷”§½™ ŸSöpCo£øZ›j\hþ–XÂ;ëM¦ò7zÛÿ¾®Î}�öd3îº ›ßƒä¬Õ-§à“ÿ&KKÆÖôi×�øÔS!û�ı]ª©ÇâÑ >æ’°u¡#|„à:˜a`\¦é}úUñxè·‘v»rÆ�»¼qDnÛA3ÍvSN”[îËP�r/:¼€Wh wP·’PâM}§CÛ-Ãr=(^a6ÈÙÌZŽ=¸¦ëCWªÊòã6ÍÏí¼Ýàñj(ü–и{që6ooë Ùï™Öz Àõg:èí¡Û”÷®ÙÓõî‘ëÝZè÷›­ûè§ÅÕê$Ð)w€@P—#ÞÅõÀ5Ìóï1t<Üó¬ý�nÐg*BÍ®º´tx?Ë׃+3$§vâ ÃGv`¹º.Y9ôDçQª÷Çé$è9—®É>„dSÓIïAftŽÈLÄ¿ã²ÿĆ(ÅQ(ÔáLEÉœDX‡îŸ��Y’ŸÌ³ö1<š| 6TÁ¹ÂͦFÔ½+ºÖƒ$ûq™2¯7Ë´¾�§Ü�@£é‘kñч$4uòôØy¹Û$?¥Ò4ðœØpê)‰fÕþ¬�E9)[»…ˆïtñ§U�)?áÑžŸ‰’ €‘ECM­«`ÿÚõ®ß!÷M›Îd*&Œ{Q­Üm¹1hiˆµÕs)g=—�yº�d\«ÖõÞh�Fpš¥dÁ> Ýö˜ˆ;6ü6•[Wùô.Ss¸ü ‚Ý÷Ú¸°xÂrH«J?F$‹ú”BƤùÀ´1ð$²Z½=tsÅl©o‘5>_~Ä7M vªES›ÓOá$"£Ø?y £ÛH¢&IRíõgž¨Š�–þò³(³Aíð`±5ô *÷’‚kÝÚ±ˆ˜†(¨SÌj~Ä;±{MÞ]~³�úÃ;`�oœÔhåþ�ÝGÞÿ»ŽÚ=»ü;›˜ºuW„·T’ñÀsËf±¯¹‰¹þþȾ] ;yÛõÆåTJPZ U¿q<kÉÏ;·Û-³îƒû�ëÎûþÛÅV­Úü>JA)9f=‡°QcGÍëë¯C“MMÝž¬>]7qظ¨a{”VçkýEðçÄóhQ½¦Mvà!ïò)Uï¢Þá&“Ç*®óé¿»¤ª%æÃ5¨ô+ÚÒItÂ~ ç–îôWsc_•® áÑïµÄ+±4™- ªú73ãÎ)%}‘ÊÏZð ?¬­¯ÑË )Ü.è·–ì‡6å:;Õoª…mdùZý®à¾>ê÷){qHޏ£úƒ±«>t/D&4vô÷ŽêK€­/3gzΜ“åYju«O�qDW¯C–V"Ii4’Ù'_¬¿ûœ}ÕÆ«ÏoxŸ›mïËÌE};xÏ�Õšº(ÊÿvóÊ\ÞÒ¡ü½•Áì À{ün6žOv7㸲ò8”ê­â~I<2Ï´F wP¯’Kâi½2%AÝNh¬ožòD_µz]*c‚®â„Ø^Yùþh-ÉyúO´Ï>;ƒ&÷gï\¿ Ã|Ïžu�©Ó/7’Ziý¿:·?ÞVÆf„·n:“ì„y­½xûÿJ"… áG-¡ÒÕ½¾üÑKì PQ€ ‰�ÿ3AihA´�S»ê%ý!ë^[Šât®À9é¢êŒ ¸Â¯*ÝàPÕ£ˆ‚Ó úÔ¼×kWj#×®â @õDã¾?{d¦£€T¸ :5Pª@RT& åщÅÔ¹R#—9´÷xs‡îZ/$+Rï·ù”vü�ÇïªF?ƒ‡Sµ[…¢ ¨Ð5æ×‘È ÅT-ºåóSzö{ä ¹‰ÊÌᳯ,œs¥*Îñåi¾Ÿ�MÏHâTN=PPDÕèqŸõ¾¥HdBo÷ÝUñzÁô¾=�‚èHJ´Ô×ïN±Nõ}n¬»3Ó«»hìóÅmlO¥åøò²Ð5î5 —ih.Óæénbç‡oTªf¤·{åJî®bVHjÿÜÍyà3Ï@húOIU=ñ!ïãÿ“5ÞcôXp“ÑuۚÝÒ³¡w¸î»îÍ…I¥Õldgž´f‘8AwKnåì”Áó�@Kì¾|aMpÝ^ú¯ò>$ñÇÎ.7Z|ý)7eöÑ;Lô‘&¯"bƒÂñŸ#(ù¡YyË«µU)á^×yÛÜìÚ¼stà÷u0 û~¢²€ìp¿D-Ùè}üÑ)¿;_/ÍöôÎqi»Ÿ­ÞéØö¢ÿÐ5еq ç�UâšÝ_0IãxÒ�սʃ=õë¡v½³ rFët‘åP(ÙP§( š)uý³'íìcŽ*ê´dtîGËî¤Ö‘øè‡|Õý÷X Ÿ�wöd¦Œd N%ÀÅ) @/³—æ~Gµ*ú0/vŒY é~‚Lž‚¯ÐÚŸ¬ùΩÚò4ÂÍbT£>®;µ­×Š‹ ôJ¼žsú'×?xÄWÀe�+·�Jžg¾’‹:|1_¼ûÙªßî»GZÅv?XLì“2WÃÙ=gwóŒC³Õ›(Ê™vì—7—`¶�·¼òpªhïc¼Iz®ãöǽ;wwX˜×aµºeÝç ì”äDñÕZµ0Í$ò|«Wâ™çø½%) §¾�°¤ðïã§B¿gBjmö "*ºÅ᧸!bª8IÂ6Ùy¥Y8óâï÷Gú'¾#–¹ù^§,¿ÅBq±Ièßå_º*žb‹¤ÿŠØª�‰ì÷èkºêºÎ—«‹sìk$Flóö È›Ý ­ÖR8ù?²÷)bw5þ©T”ñ“ŽÏ·Îæ´ºë"£ƒ�ëõ¼š4«žo47vGÚM~ñ'o”\ö—^Jp#Ê€û÷ ýijk®oüŸü·ÛÐÝû*i5ë§s¨ÿ\Â/�œ(ÛÐ Ð�³óÕôÞ¦ÔèºÚå°3~8¼¹Š¿½Ë EG¿Ne‘¡úºèv´ôÚâó ’Žíêf¾Ï™Þ4XÝ>†É>”09tö3D°…تIo×û(íÿ;গ*êÓŸ�È+.’–Æè/U M5bËÕ––ØŽ—ªàii ?jQë2]­ü�|¬m•´éúø+p"y²%¢ ©_^lÖCôïôø'=�`¶½Cûs§7ïª}_¯{ã-€”#Š^ª ž5À]*OggS@-Lm¨`¶�|ºÿÿÿäÿÿÿàÿÿÿçÿÿÿçÿÿÿÅJ¼ª¿ Íš¡¦dsxµ?²@hÙ2NÍäŒñþªÌ½ËÓ¾wÇ5ªˆ.c¿BìÛ‚Ì?ýEN@þubÄ?• »¹~cû³s5/ç#>² ç}ãÿ ¶IÓç䇭?"J…Xÿw‘RÖ4ÉÖÞ ;ÔnQ?½éD¼{ªL˜²]'ù×g&z·¬@ó—T@*Jäõíý.^¸ $©8 O#O|½^j´¦n`‚¡ ùüÅqÔl§%©Â"x*%ÉS; –x:¿þÔ4Àª �‘pî}é÷Q)à,ghɆÚA-²‡|ü½�c_µÉJ¨ž@½ŽÒÔZ<詎#µRªHvm)¨_—ÿÓ’=èo‘Q³¤8ïP…†>­µµÒt“Óªayaf~‹½ëwÜ‚Z roRúR)ZºèĨû:ùc›;Ÿ?™üKG³«0e÷ÄôÊUÃaÏ©Ò1kM*ÐtWž VbòP'T{¨ýkL’-Wú pNH êåxÕ“4K\jð±¹õ�<�JjÁ"÷£ÿ¸F@^�ÑÌߜ誈£@sá4GNw�(®Z‰úæ(�J­YH‚D±Ô5ûµî¨PwQÞS RLÉ[ªS$G•¦ S�’k Q¦}HÏÄr–Tñ -=CëMŒO¸@R€B§ëtw"6«þ7÷bšÊKÒ’¡vô–ÿDذpcžŠ¹v,>g]˜'rŒÙ'&äKBïFºOêñ‘Ó’nÆÐ_!KîÖŒÝÊ œ×Ú=ì }ß�S÷jEµî2Oĸ~_ÜSÓ‹ÙZódÅè¹»•Òe8‘/ªÞ'mnƒãùªºª}¤ŠÁÏwo¥‘üu_Þ]c_3q&l_¢L\£Ñ²Ü¶Is.›Jç±àG5íªPÜk¥-P6k»«Ë�¬Ž"Y?õÏXÉÝèILgoVâZ»Àÿ×.±Utiûwåý�.“¢v©F5ý¬÷ª¥Êãçk|–¸}6µjuœÏÓCù»å$Ôž$ÀjU÷tŠ«SµÍè{>ý•¤X>·"—&·a�<N›ñ¼ÌÏýN}ÆpfÀW~·ýÑâV:Ùͤ*õŸ˜x5æ-Òo,ûËŸÔï�p\®¾yáLzÞ€Ö76ž�¥ŒØ–o9Qß½Êêy&Œ´b[òñ…i�ωßuxHܱӿçžýÍø,û­Ž]Í$`Úò¾MÖôxàÉJ]Tþ< RÆxªØ¥œ”¥˜^z�ÃMïÁšîZ{ÃÄÁ·Õ®å†h½ÏZ:|€ª½ÉòŒÄEgÓB5ê¿+Ù¹Á@Ñ!³I×S‘[Q¹�Zwí}ÅÆ '~«RÙàùSÅèµ’¨÷’ƒÉö³ëîÉèJuˆ<‡S–Üdõi|ôø_o™~avéæÈ›rµß"íÏÿLŒø«ßé[WAOì/ìÊÑq�i§ûXAúøÿ¿û¿èª|æ^$Ê1׳—ÙœŒ»jwzÑ¡£J… ž*|_qG†Ú‚šIhpK¾Òo�æ‘Fžë6y@ܪ?÷ÆõÕµ]_Ácû Íÿm% HùÓ#[T}Ö¨�Ô Û̓{€+¼¹©½þÒEÔY>xP;…D.Á翟Ôå¸�ù@K©ÊG‘`r^›?>RŠÜË(:QÒ¨ Eó_¿\ß ¤[q%º�¤V>øRœU€(8MPQT[åüßüÙC³ÒÅtЧÙ5§Ö œT­Îé Úµ»/{ û_Ý?ÿD–g˜üžÞ¿ÚµÖÜŠ€ZÁ(ªìÿÏ©È/rT@V@ `Eöù³å–?byšJ ‚­ûz}ÉñI1‡®]} M‘IDLý4ÉZ™SÕ'–È:;ñ„“1'A£-Š8ÎÑÚÚù…0WÇÑ !*�Ú=“µ~è”N¬µeOºD«“ó%-hç4ˉŽlrIj7ˆéQׇ -2rìîIIZw‘#ÝuLÂÈO²ïO”R€0.Ãʽà†'¨k¦Ö,ð´x�çÄYQ¿k”�/A¹‚›&ge[ï§wÌÿæÍ.'%jŽ$M6 Øð‰>n>X½h±–'X­ý§Ã»|)ûnøM1ßdž€ìÚ ñ,ºè‰aøç¶âjßóûùÐ0·04.ú«pÕ£®ìø�æ[¼•M#»nWÉî,°Þç”SoI4ÐOW8æRYêW�à{ãESsåžT]ú`¼}Ô{ï ½T '›¥�àkܼ1Õÿ�rŸÙe,β¾­k+©va²Ÿáß&¸…ýÊx/9ÇÎÏì´ Áo6þéž�jäÚ¦ÜÅ•&úÊŠåeKĉžm âq⥼–[—Örœ%ðÌt®¦°bØSgü8‚f?ø‘/ã‚ËvÀ/ÅF}CÃŒf=A^û{Û/:`uÆ\tcxEþúÝsÐ<Ý6¦(k²Ð%ÈÙѯ7üœò\G¸JÏSº£Ì¥s±}áø«+VWb½¼ö{© {4EÝœg1ÞCÝÊÜj£%N¢©ã…§M6MùþØëúÔ߆¿1¹ž®î"μ›íÓÁð~{õØòâ5'ÇW`³ W¿%Ô�¸D©�¤¤oV\L¼6Ç—»œt¯?hrÛóòÆ ·±ý\u§Skó‹Ú|Ïé8N=~˜ü Á/š½‹FÏõ_ÊRÓ{NÃêìE®Ã�"f~7µ3»jïÍ+¸¼oðxÿìu»mf´•°¯ñó:Õ¯[nU5ôY¥}8TC®ÄíÐÏñK˜Ò»ú;Èôº]ÌØ¸ç”óKÙ¯²ªi‹Ð¨ž?ÌwNô«½óšzß_­ñ5“^:|*¿!ê§PýAÍ$Tø@�xg†ÚIލ®&[€ W¬*GU‰1X¨µAGþbÕÖüf‡k#ž©qöy.1õfýÅvˆg17UÆøíbþÿÿÜpéÔMb½|}l£íCÒG³©îÍD*×'›Zû«ÚW£7D�80è6‰ÇÇœf}Œu¤UØ_V+r¿÷çÉÒ­­DA+T¢P†ƒ(òÿuBPq²À‘D]?vëQ” BœÜ�Jѳ†d´æ ¯}*€£Pˆ"Íœ¢+‡ÌjP\µwDœú*]‹—Ÿ]íôÊïß‘W�ã34Ð]ñÙ™Û¿«?Ã/OíšÐݵ¢G¢Z¡Î HtÂp6€T:£yըдS!ËÌTCµvu&Zó#�Ö�ZÖÉëYƒ&I�ªôùGtd¤Ó•‚öÑ$NvOÓZÔ¤@ê@\¡�Vå¤V@eB‘¸$»zÄŽ01<‹$ �Ⱦ=¾Ûíœ[1% ŸÏUR� —ªö{6iûY€ï’=*R Ãêá,Ïæÿî¹Ó†îV2aõLžªï;\yÔe)ªmò`;‚uÔ'}Ê(Õ¥ÑÊ¢s6µXÛ¦_öñÙºN~îüMÈwÖÔ¾_»w:é;˜/I_…Áš-v£w•¼÷+ÃßÙ Ý «»#‡Åiµ‹Î’ü‡Z79p^cŸ3 �YÝLZ~šJüª,o… è<í¡vâvÁ¯BIS¥¾ŸiÀÿ¿&û€ÑW8n• ªKƒŠ}Ê·Xh½©Ùò ’OžùðãÑ«â%QͰÌG]çöæv¨+ž$®VÑSWë�»³ì{úŽnáêÝ#.«Ûû8&Ï·bc~í-§¶Ic¸öûæÑÖYê*ŸŒºuÅuÞqaml¿“qOßnµÇ�÷hŽ“H×Õýê÷¾¯ÿÆ*-ù�¿O‰:ôßh ìý˜îè‰û~üh]ÑWdt'!ßg°5¿÷•úÈ-$V[ùûµcú8O&ê–vsÕ�êýO¤âÔYxMŽo ä�¾Œ#›s${ìm%�>Ißkå×#�´Q/ d�Á¶´%ªUƒ]®pªÊAR¬ Ú&ö£ŽfI‘´�‡x[˜æý÷KcÇ]àðc)#™—öÜݨYÇÎÄ�(‘£÷áýP»¯Ã˜íw®L\6–F¿‰‰l§¢UòC(2†“#ý§–ù{¹¯nH¨–£‰Ý¥ümÑßCúñºˆË¯¸~uµ>É'™ÖU÷ÁfÅB%R4/EÍW4ƒ(_ðÃY§žñ~8¥øsÑŠ1Œ@˜ÄÎæŸFgOØ5{ƒŠG¬S�‡úëŽj«ª²püð¾6HžIÜÕ?i¡áµ1r¸[ÏÐjTK¶8äÛ�~çõ»8¦÷‡Ñfpt£]ë«ÿs‘¿¬ò\�»°Ùÿt ìÁãÛŸÅÿÕêâä¦+äþß7 à8ÿ7 B'´ûæ…ƒ#ñ¢@cÅAÝþßJu’ÿ²õ…9ÞÕèÀ¼P4háaúò;Š>WÍêH8¨Ê%"o—ï’�„’•lh„Á|e:–à Mã4�´Wóg¤¼ÿ7yK—ýPçL/:J¯¯)5f‰uè¿§´SP›Z#›¬Ñ$ë«|@²RF#gk2Ð@­l^ð±è *§ª:N@åP©‘“£”?ã�|ÆÊÄ}O×7NíH �î#)*!Z+ηRcÝ«(šé±8IKáT-jjÎ×".àNž3ÄP%¥ž<â¸Â¡¦H�ýšìçŠtËÏ(×wÒ*кw¥%®ì# è]æž^Ôíý�êîå�fâ½éa*¯‰öÑÙ¸É!› (dNIé~¦¼ý�¡ÿn’œc�žèå–Ì9Ögñ·_‰oÅ3­:‹mÌN+8|Û3ÃÝvÄH|é!m°'€†7M�¿5ýS÷ÏCÃÓ˜¯ÎMܸ”_›>» C:7ªý3 n×ïEî/Tb â4¯EÊFÖÓÌ+va¿ŒnçTè+>mý1¤žRF´°ÑKÙÔkÊ…ŸÉÅ›Ç÷]“ ÏoY§™nЇŠãV[Ê %|¶úFù¾Ô6P |Ö|£š–7ù›ÒÍ3™Ööc\þãŠn=*÷†‹öQ+ÿZ<Ê êý“�âÏï®ZR»ý œ/ÝŒrŽèÆÆ'³{ƒY9Ø.XòA¾_òN]åSÞàòøÙ¿+ó¢­¦_¼xÅ|G #Mi®ÚÊ(sÂ>Æ|R>1¸Ç…÷‰î4ÜôÚ•¡L>Ž(&ÎÖÐimwW%óWv¨Ç÷{þÝÞïÕÚú1ïmx~»xÍ£’f¾ï3>¥¤kò]χч–\�KJƒÚlfµµÿÑUPùN ºq`?ÏCM|¤È]§§àF¶Ý[#®èÍ©ÎRnw0Q#yJ*HÛ—v‹C´}}Q7{a¥ÿ=IÁ�ž&òaÅPÊvEV»G-qȸã¾~á|Ã>ÚêÁ;¿|üÌzJÃîR‰þþ[©ÎcdxgÁƒÖXÛp~D^í{[œù•­È%ã-T¾œT>ß,Qí¿s²$‰÷8·\#t1©6¤6 6ÅýQ*§·åœ%i“{ /jQãq¡ºzZôvI“Y”/e&OggS@ALm¨`WÜçÿÿÿÉÿÿÿÈÿÿÿ¼ÿÿÿÙÿÿÿÏÞY¼(¡ü§©BKØM.‰Wå�&j–qã Ĉý¡»ÚBÞ�6ƒ¨1=ÙÄK7�éÅw˜ŽN5k¤®Ù¿Ý¼í›„Z'ÛºðÿF톬æºFFýÞ¨PYæv½^/jû—«·ž¨y�¯Î@ÏõUæñ½V§>[pd;  âþG| *EtS©Ä±Ï§ßjöë¹V  ‹•tªC¥"Ó8)k·‰íaz¨Ï£0¿ô&/jY��àñ‘ÿŒ ™h§=¡Q¨kå÷l²ëKßÑp„Ph&R5�ç2}Ì‘·ÞªƒtÑ€ô µ‹½B3ù·çŒ«©j¼}>ô©wöýOͤOžÝ HB/äÈÊê£iî9Ì©'µ§#Û›?¨ é»ê™Ç×X{ų~ÎÔסnòy8NÕŠS‡<ãêz�<ªT •�Ú�<ñkJ^sŠ…ú)‰þiQǧ¨j‡ìt­Z£ûã‘påì*ñ@&þ¥¹#P±W¢ˆ´¤$€§$jîa†;.ÄFž*š½:O¿ö¸¸ZZ4MØâUÕœ[pE\»o·}iþÿJgtÎd…öüݤµÏžð—ªØeÕ§œÔ™+ö¼pØêLÚ|9ëJúÓIÜã†%\Þó‰Pådû¯]¯"ÿÄ b´2³É„”Çîô÷âÛ’"é¿ÉëÜ&zbΫH_wÓ/P¬�à+¤û>_dÃ&eÞÓ0óôêUÆ=•oÀ“Üx«N‰óÖ]¹­UrGetFœ”ÉA�ŽZYµòÛC+·É‘ÀÞÛŸ³¤ò “ç¤qök•šœyÇM†¿}·“åÌ…[ž¼pÁäjîZK´Sœ‹½°p7ýè=–¢Ê "Ó•Ä2D$Eì­2åÒïEÔo¾h»�2n_^ɳ]òIå·çÛôzª‚Ç ±‡’�°¿Ä;çÞ ®râü„ÉDŒjš²Ù*LD¿¼'±FÛ5ÔêPí`YokTB÷¤¼R!Q(gp† þç—óm4Uü;ÝÝ÷ÏâdÇM¬kÉïçó·5ž¬ºòãìý6¾ÿ°#æ�ðRG$4»“Ã(Õíy~ G+IB9ô¬‰õÂb³Ö®æTÍ}L*íIÝ ÍÆS8ô×ìÎ¹ŠŒùØÇ}Gßÿ\Æ}›]®Ûgÿ_¨W í‚úqJÖÿ�‹\6£º±Hÿ,kÝîYvnÞýªÞ«õ´©Ó×7ÿx©³:_Ÿ§Ýûˆ±|å¶ìR¹ ¼jŸë;a`þi>Ûp›¶ün›µ+ñ¡R¾i¼’¿€ø€ñõ3‹7å•ÄPïDZ-^Á|ýñõüF`™–[•væßàÿC×)žý—khœÓ'��Ÿ;’kÏï7·uÜÔmE®²¦ýÃa ‚žXOþ9Ôª¼�¯¬ù^ D2jÈ®E¯\÷]Xûô{O;s»ÉÜ ˆñJ½ïAbܵŠ€6E­ú¿Î§- R ö¬ÉÖå'X{Z?ÖÞgy=ÉÝXöÿô£[1…"«ÇB]«†#µA]¦e�ûqœ"¤®Ëš—áûB SZ‘~V_5œšN»[Yk“íÔ2Ñ.éëLùo•¨�l *Zg$�fæÖþù“/£,ñT½Ÿ’+u~rù”<(¨ 99-•êÜi´¨B.c77Jþd~åÇ—ŸyÈ‹á2�ª©rÜ¿µB­5"ès¦‘§âè¹H|ÍI¢ˆ.¤4[VªvPÃÙYÓÍø‡Qr¬‹Ô€îcγDo×ùDBçÈ&ò™õîOÕÃÀq†0i‡8åÙiŸÏ&CŸ0€hŇÊñ‘´íyõ¶„ ì®ë]ì�YßrÔ�dèØk¢�@QÈ{xç2;ØN‘ò¸ð™–‡J£tøðôŠMþy­w‡Vá|9/;�ÝÅN:­Í×¼Såê7U'Þ=“šË£Ó`qr “†>Ë1g²Ç@wë} ãh½göwlÌ Î8ò2à¿­´aYgYÕe³ŸNbpåYyW5kBÓŒ©ñ=a?Ü‹rÚûNý¢‚æª]Å\Qo„ïQ·óÇ•×ﺉ ÿÇÂï««�ßTË@8 ùæROù,�­±EÿÿePozŸ�YùP/8õþ0Ù«æ¦ãè «ØñTÙãàZ�óÂ<ιÊ/§Ùc?O` ”<¼Oy'æøÚÙ£@äþÉ›øE@瀦r¿ ê'¤Ýz6ûÜg0"DNïÿ!þ¼†Ñ‚º0¶î0'‡±Á'ó§’O»~n&'?Ù”“¦Àe?ᔺõrÎü‡¶¡^h€ñ58ùÓL|ñ¬‘ö†ÁWÏßãR×jÙÎ-ÅÂ1a¾h» u{Ò�»¹u .Tw¯]^9S {Ø•§þ}?£GD¿Î?ÝõñÂÅAäל¹¹èÝM‹÷½ü}Ñ.ín¡úHn ã»ÃÓ³ »úR“a…Ö”œ¦ ‘Ž«{ÓÍΣLþ¤u0‰â÷Ìί¿‘Ý�ºÖgÖâho:�Ûž¼ýâZ*¿q´[*ذðö’ä÷¯ÖÃïæjÅÇÅM>v?lˆ{þl|mFë…Þó-ª5¸%®µ :€ªT1Èoj‚ ^j|п@| øg@“GâÊ¿ƒ#ÔvÜõ*¹��óù2µ»zœ©æþCUã/µè¤Ù‹ÌH­DAVP†’ â{é@ôŸ‡ØD�¢ö2•KӮĬwÿæîá2̵Á¡%dk4öÿnÏ‚\�ÓÒ8mOFh·È©¤ö[àâÖ.±Û¨EûñS@žý¶¸ã{úWpWf…Ñ'ÚÄšwÍŽˆ™xÓª–(ˆ ·k#ÃòÔþsÿ 0¢ªýÚûÄÏzØmyÝL÷äbüm7 Áó¸cl#s™’æbÓ¬?äßÍ÷|X¯½�X—ó•«j× ¿Åä§–«¾Ù]nÜöÿêß.´qŸËRݪÁ ý=m?“mþJzúcŽàŒª0¾½ÓkâË%vÓ”2zUX3y¼Ú“mÉOõÛDß{ç'ó�aÍót+¯Kƒ²¿±¿ç÷²'ƒÇ�ŽYS å­ßµ�f»ßxVp€¶³¾ö8GïaP()g²ŠŒ÷»G\“ ˆzK\¦/5þ0DôuÿyPál¶NwÝ/OIÏE}—5jb‚w%»8-6v^�w›Ý´¡†R¯ä”DÍÚ�‰¶�ÿÖ¯+þJdq$èIO[~àq¸d¼§nñ§1�Voÿ9Â�îÇè:Œ™(ÿ´ï�{-VøJîgU¹ÿ©þÐÕDøUŸ¥ñG™f‚ß%5oˆ[t•2ÃóŒY‚H" nCgêÆ-Ǽƒ_F]ÀbÛ—³´ >:{ì_³•ºËÚÎzÇ}à»s3¯ÖóˆãÙȽ=Ç¿Å&ÉoÊ7šn‡»/‡ö0P鍊ovp€6‡™1ù ™·1·ùÔ¡\½žÕWIÓþY|Âßàþ!ãŸ2M2‡wðˆ+Am1Ô§ä´ˆÝf‘ÇÆùq�醬ýJÚþô†Z}.¾ÍoMŽ:Ç·‡ßÁÌÍ�ßÔÂpº¡ög]€Õ­ˆß~£s�ªR{¸;²/ß*SPÏ= NîTóhb{Iï4~èý~4�î‡UÄÄáèhœÞ5§÷ã‡4 �4'™(µ®F×0ÿ£¢•L‡u€†­¡Ï÷“šUC•nóžÑ§E´ϸ’t‹ãœµ³%£Ÿ³ÉÇŠÿEç-²ÏÓ²g­æÖ¡MQCô,•Z›ª3Gž¬Çþå§4JÏhFs=£ë‘¾ž>ëMs-`€ÕÚ-ÔZÙôPi'p‚§f;±« ¯ ïW‘ï÷úWÍû�Õ|¹nwÏ|K>MEüå™\/2+ŽVuÐYƒÊ%AñIOu�™ª'à0Ñeê¢TÁyåT˜B»2T‡.¢*L$áH-fŸãW’¸Gª67vDI�-»[úF܉h·‚¤Ô†¡a’5é©®×û¢°#¿ZïÞpÝÃDL ø~I åEøÂlTÚü:ìøH¿¿÷Ž­êÈÆ­OÖÚ)®Ïcÿúç,"ÒÝä³a÷O&yÙª¡Óä%Þ¿+ÞùõB§UjtQ¦f1~�Ûý Ò[š.ûÍ:"�wkþîØ<Ôìÿ /%÷®Ø'É`ùù+¹ÌhOVR|­À­Íχˆt%\iJ*ëÉ?hþͯ·Öœ¤Åúï5šb¾Rö½ÃåUrðZ¾ÿ/ס7z|TùëMc{paJ«ëh/Ö‘IL­öLÏ/°7Ó­…ùÚn”kVˆÞôh357o˜š‘ÖúîMF–ŠÄt /y>š£A Ö)KÒãÿvû+Í 0DÞº1i©zþŸú�ûÚ»œ»¬9ÝŸ.ìÕÒ« ¢Ãy\„'¹œð g]Þ’úç0f£•‡2ã΄¨Èe…ŽÎ®ãÎÃôÞFq5-ϳnïS]ó›‚!v5§¢b$lúçu2A|µ<Ír;›¼àv•®üYW«ÿù%+«+kIërÔ‚{ë9—¾ÙúóäÃkŸä?Ý졹�35Êïi ÙƒÅ÷tõWͶä´Å§Š“.OËÒeÛwM9q˜¦ý#Ù¹EAâèd%lž½Y¦¹ñH.aÄ–Ö‹OÌ1VÏÄÍ™_þñdnëæze]§ÇqI§_Ýn`�NCÓÞáT†œÝ°:âBä?|—Z¢¯~ÕÝ­ÉÛu=tù±[íæ0ênˆçtÛ•¹±��—3Ù½}›óÅá<ßv4­cˆù:ZŠd<�ŸËÁ¾k£Ò»bÇ� ­�'Šº ~I¼r¿ýÿ Igð>REP› õ–\¡÷íÆ,[®CÿB”uûqþÜ~@$U‡¿ôŽè—d:Ý®‰oüuþ|gE�´üÛW6�ä”I=øëWZ+}Lô£¥ gO ²þßKÁ”ÿóüsΈÖ޶쩵(»âÔcúZëñîC4Ìb=jS5¢‚¶p|Gß½9•ì‰.*”ÚÁÆ�� ‚D‘\3� Z9jœẋtÖL5�H‘ȱþ�îèÖ=š NtCð¯0íÔìä˜|9Nw×Îi¾ *bRäõŽ™ÛHãºþ�w½BCSÐÌ‹Þ-ý)K÷ãÁq¨õ µ¥Vþ¶ž¾ø]}.QdêC+YÊzª-HÆÔˆî…ª~Ö2ˆ¨+âDA8‹SÓ‘%ú ãr”Þ=©q—(p�ZJ.D“Ítc•¦ ™¢ŠôEê@^ßÑj´–9­»®B¦ˆÚuØ/ÐР›ZÛEÛöœû1uázIBAp‚ (&yT›mŸ“„+ät|Uë›2jH7æÆÅXÍX}ÆPäž3ýäÚe�Ç0{œ~oÐÕ¥Ð�×7<1¹›dZäB͵§G6DÔ†øøsßk°5Æj¨¡î(ƒÍÒíG. yz~FÑ—ÅK“ÚzÚŸù'ø(W[,w篛›ÊÇÂuzJy½ ,§óÓåýJ¤-‡i |e”,®ºt uH}Õ•ëxJÞéï< f¯Å•£!Ѽ«À²[O05}·;’UœÆˆ”#\N¾bŠàoªª+ûÄúå°8’\ÙÿvÙLjï|A�¬²sââÀäϧ¼Ÿ$÷zS©é‡ÅZ�ÇÌ8N|N_è?cºçûðý_7�`˜ÔU¾vq°]PØt6b>•!ýlü}ëº,)PìñVÆ}Ph$|ŠÞÿ.yïû:oCD,·‘1§«mSDwdT ïÛJÝâdÄX­Qu+>ñΗ«ÔÝ]�ÕûÕY}¾·B‰þÔëÉâ >¦Vz]“ø;›O¡ýš•BÝ”÷°IU»õŸvíñ› w#vÒi*øqÇ%qØštägŒÔs/ˆwù%Ò²†?�ÓË‹ØÕw¼p¸6¥%çµùcŸIÔÃKÞEê·þóÓþíÇü¸F\WOOä÷4Š'�ê²¹p¦…[µb¼÷õUuܲ’ò>>¸ò¦f}5rH‘ºFJ’5£:ŸUæ 3hZ[ÜUIZÓ‰ºë‹eËpÖë�_þ>ãdŸ2)»Š™½¤¤þL€tÒ]u®5´+“Q+¼²©K?�}õê3Šc1%(`ŸëÇ]UòxìÌ”<îáE¶ˆ™ÙT*¿szçTÔj!)À^!Õm�æ2˜Tñ£ʸ>+×É]ίsŠY mŸ/\h- vŸ‰ÿåú9âõ îkÐ_ƒ€ÂÕ·V¶U;sƒ^ã¸þëŸö=u—é»§éá‘Û^ï[¼ó�arYî 6ë“—< >ñä®/nRº÷[¹AÐÊWUâgÏ�ËîÚ!ƪp�¢²µø…hJ»ùêM¿Q)D>zˆW;�S“$B8=mVäPÏ|ú“˜WæMQÅÝU#A;Cäw(G…#J?âÜè½MœõZ/àÝKžK�ì¹¥Wù3w�jœoµ[˜ó ô¾>Ö;‘÷ºö›åœÑøŸº7Ç(0 ¥ã&O üŸtÕZrûï§ý±¹CÀhyù{öüÿýl³¾˜ý¿Š”å¸.>—cBúw·f­Z‰ÀÿiÒ!—tÖóÒ§óûhÚB2Õ<_JàM>oëEÓ®'áÕrðm(�ø´ýšÿÚ|ïþÕÈEÎuʹý׊ ýœæ`ܺmm¦å<…[À×]ñ[ƒÐµ¥w7exöm»tZÔ³ž‹‡•):XZÇ_FºG­Áoð¿çqe6Ú¡ÿ“ÖAUƒ7⵿’ón GÑãøz»ZG/lfÙÑÅ ©QýMq�öÔû¤µ¶hŽ3ØGîWýIªLrŸò“ä ¿®¾�ê3zÒ^’y»ÂSÞõfñúw~K‹ ´-U‡ïpôoŽþ:Âý¢ÇT‰ÔíØ ¯’sÄcnî’&×ÚtVÇÃ~N x)kÊÖøÿíºÝž!m«Cït¡ö�Ö¦s¢±…iM[–÷S™ Ê�z¹uJ�6x*Í;»Ìý¹ÊzÂæŽ©º»ÇDNÉœ ¾9¼(¡êCÄ�jjÆLá…ø ã?ÔL oÐuÿyéé}L^פC»DŽÿØpºøóÕùؾWЯ¡Â¯¼* Ç/¯Ëñ�M¶FmÔT Ñå�£ÿ3™—£Ðè{öíkR¡Ð¥¯û&ììß¶¦7ê¹±hBnt’ì/Ú?ÞÍ1U…q£:ä׺Ûyüðšp¦ÁÄi„U‘}ÅÁ8k:\ �#í¦°‰ýC‹-Üçópêz¯J�"Vö§~ÞGÍæqz0¶ïV*Ý0AHiU€Xkï=IÚ®Ò<Õ€¼ó H†p•"j¯Ç*Ž*¡ïÍŽƒŽ W¿¦•v'U�ùZe=ãÒL¯ß6Nÿ4îûþUlÇ9Ÿnʽ|ymóòáó az=Ÿç*¹ì»^]??ÝÂí˜ßÞè1î­æÄ]F½jÒkÕãÁ~âÁ7‡òÿÝ,—Ö%» gæ‹Ü'Õ$.Q·©>ÍRÎ,ëË›üF¤'�›pæ˜ëÿg}KLj ¹¡i÷nÒü§Ó(î�Ž¥l¡õ *ÒÝ4oêð±E*c´gŒU7^©IFꋨ�úøïCkó·(|ÖúÍéÿ\Œûþ‡íýôÁ‘«ceê"æÆ6‡­™³É²Â=ÿw-_ß=&™ ‘ôjv}‘yIˆA€�ƒ�Âë¶¿{}þîûž[ÝU5zÇÔ»C³–©2Ów$::~¼òýP3‰®üwfƒPƒP3^Á§¯Ù]^;Ë~¡¾ïIÔóÉÞÊuû:CÓÎ>µhÎúZ+œ ÒPþß¹êÿÍn¡Â²€“ÿñ?QÿOWϼ5`'œÿµø>dá Nu ¿—´j9l8ˆþù¿’±üýxÕõ8Ù¢‘^¤Hä&ÈíỌ­“MMâ½"ÐÈQ¥þ—-'  Eë^ éä\¹’pÏIæ k¬\‡g0W®±<Ícpç—À%½*/<Áד.ùöžBˆƒ+µ€f1×—.~¿æãÌãŸû¼LAzâ@é*§©«¶ÓêÄd¡N?CLnj=/ ¢*…”:9úhãÍýcæ�ççQU§v; •ª”Ï:áRâµf­UI9´À9´û­ Ê7]µªà¸‘B5ψJtËÏù¾¢R¥r†ÚMNMÍS©em�¼‘îZ�J1í‘’zT&-$U¨Ýt‘ý”Ú�ËoK½:õ–Ûaæø˜…­¯è¿ãh(ÍxÔO)ÔPN‚Ýuq×´çT3ùé9 >Â7Ü-A„Îú& dr~*¼íÐ×ä3 ¦„\Ä_zczœÖ ÆJ¯™�5�©t6ÓF©‹ºgÅ‘[–:^{8³Y�ø(ùdE]}–Œ»»ãð¨< ïãòȶÿ&U“ ícI:~Kå�—BªÍöÇËÎÿÊ{YÛ䪼(º–xü»xhœŠ-€�rË]|&Þé»q¿AïkMm$øà¿süƒZɆþ$ÒR_F;>"Pèß‚ÆG\´öö kBîÕ©…üÿ )©}þùñcϬšo·aÃÎ¥Aë’-âÔq>ý_µ{ÀI"8òk=ŽCu6¸´Bz\÷žêà1Í Ã['­N®×5Ó“N#´¶Q£:JÐÎñZ%þÏSP”*�AÔh Ì/©rÄÿÞ«ãÐ ]¥’$ô%@SÎI�Ps¨-’²£‹¿O…¾çïÀð¯ºG‰],q왨ZÎNöËçÄóíÑx©•«µW'м’㢩T”ø9¥?6Mµõ,ê°(�48Ȉ١K³×‚Åíåú­ŸÆA[ßöc/HÓ�)Ž£k­ÒÔDmô^ÿ* H"ª§ÖèVŠPbz”ä]£ O2Ãëž 2¡ÆNÕ³#éÈ5K>¢æÉ=Ì¥ÇíñÓÿ÷‹yàÔîB»3MùLS~¦Æ×ãNsL]¹Í~-Oâßs£w@$2é„ù˜·Å°ª~¦Ãݲåz2�νG«t\�r¸ BJð� ’ |ÕâÍ€9º·¥níð2_Þ�fŠjb§j§YÛ@¯÷ßëþ™õÒ­®*{ö-p‹ì£R*x¿VmÈ“Æex›Ãðì—ÔÙyìáA†Ô-�æþÏäLZϼÐìˆyI4�Ý£§ë¤QÔÑ£†…eKÊP•t©ªŸ¿ù�£c”UåáÔÝš`Þ¿<ìí`?š,µ€{mÒUi“Þx’¿^Õê×yN q¸×ÞϳoFµS“;wo÷Ø·�RŒñúêW:!yŽrZ(Ü�ÿˆ÷´(wä°ó;_ÖðŠÓß´6eÌ] ~�ɽYD¯•Î's܃[{êà·5<Ö_®ÏY[¼ùáÇÒËíßöµ�„&;Õô— ÎëO¿Ÿn -¢É‡;ƒ |w†!¹µKôâQánËÑF+hÄ­GÊ÷T‚fFŠ­f"¶¬Ó_«øÃ[V þ‚6ò:³ð.ã–*Fî2. ăLDëÛ?ŸÈ‡��¶žˆlSG*­7ç‰JâK²\?Ïô~ÍÖºˆþRÉZkÍ;Çg˜fºx6l?^µûþt‰ ÿ9Å’<ðû!í¼‘Šw„S'Üšùd{†Ãn¶hç)‘•¹QmóÜR[ŒOõy²•Få>== ÄÇ5´½W˜Î�_Ÿ|ÍbŽ‘ w€Ýï ìHHÊ}ŽÚüñ›Þ3{1YH$µmòN�Þ×¥—ˆœŸ~Œ‚þ¤˜nx=¡spöL�’ÝAd׊ñªÙÅX# ÐØoÙJý¡ÖŸ¼håÊWßö×ȃíæ�þ(º õÝ@Tõ ú»BAÀj‡¡Á÷%PÓoíðñ4ö�{Ö1�¯–æ¶84‡±’ÆÏkB÷!mx:åS]X»~»Yõ¾QSgÐë¿'‚dªƒiûð;¡!$Áéö¾ØïdÊâïZãÅSQÝσ©;ktבºƒÈµt^¨?þj•È‚Y—†½D€Ti/ûG”œ&Á©áD’Nä�[ÔGÖ|iA‚$Ñ!I®á¶jt&�“ŽñÂiÉ:I]4a„YÈ9+nç"]ëòH'*•ØbQâ¹aZÊÉ£˜ÿ:'íU;f'?r¦ç ȲfB‘šª�ó'ÚÎA•f €¤¬W§RëüÉÜS$r€Þ;šTpêk’Y“UõrÈ®©A59cµ¢ŸñJ†êæ˜s†V"┹z|²^EíhD@7MQ©’ù(Cƒ G£-L *í®Ì^bÎÔóú¼¢ŽçËÇë‡�ÌØŒ×ÉåS–˜øwéÏý¸Ç¦I§AŽÔ~z!¾ø…åØô�O-”’ ÌÐq½&v”k&ß]æ.P²ÛÅò¦Z¾‘.7ö4bذÖc®úí3™Í› ¿©m¤Lßõ*\®Ñxü{š<–’-?z»_`ïîðš¦Ìw4qÛé,‘ÅEÏŸ;Bܹë[gS¹)9*ù0E•Œ&ƒÀsT§ê�§,$/ð^Z´�7n™ªÈ†¿Šíü.Úˇ0ðyUŒÇƸÍÿ…6×щSø{oþ‹Ù4cýÕ`0± Ouñé(˜[z'i�„ásúO{ÛÖ‚NâŸ�ÛFÙGí­}ÔèŸÇŸ,Îu’Ú{#Öi/ëj»¤žð®¶P‹xïŒ:aKšžRžéÝðöŸòw&oP\O¬Â'ÊÊÇ_ äÛ¿u­»f-Ü“±ìМ0\a�¸xX”…û\öÃ+XOáu[ÿµ ¼îŒ–7ÅŠäÅÿ$Ý fzµêMŸsRÖ«ßòqÿ;ØÄù¿7ÎõI‡Yd¼Íã¯é‰Ô½ó5&œxIÏÕÔ\…²Šc§f³¢�]Gáhw‘÷)Œ-× /¥"áÿ�mûÖyMþ5èEx²ÃK.¬‹w æÓÇü|¶³ÄGÎü ¹»†Çã1—›ÍМ ?­ü&ó¿f5ÊFö“U«|çúºù�Ÿ¸D ÔL z®Ùøàq¬Rhfñ¾qþ;t¯«q¶A6©âó(L“¡ "‚ë^·Zo^¿jtŒŸ~¶x—5·žŽQX8ÞFoò:kù_x†¸&’dä7ðâ¿éF.UÉGP6…ÿV­ßüqýp+ó¦ZàPýWµúï6+ë¬Qæ�t]•]kÛÈ…:¬o°ú·ü$z/•ü+÷·É§—IʺŠ9œö[¨—7�][f9š‡<î{Ž…ËÔܯz9�>áïù|šcÕ¸P›jrܽQ}Àâ¹ò~ììø«ÌZe~9Ü’Aõü@ͤTø¿›Uðµâ ´ð†¼Žœíó7ÄŠ„D¿º]vâO ú†¶üzºõ/°èwWžlV¶ã«h¿ \/]ràŸ¿PK ˆZs®Îòª™ÆY‹µŠ¾fu´ãyF>ДìÕS‘C |½S‹¿¿¡Q:½°Ô{íf=éc\®C]ÎL  k޽ËßÙÕMóÛs«MðgQö{[i©u�Xæ{M¡6Ñ�E "3¢…@òí84µ^SC :\‚ âHî÷˜öÙt 4œB5’œ¤¢¹Ú”/¦±¡�Ÿð±}BÔé0Õ®QåeÍ¢¢š�R])"Z‚¨š;ý\QµQMT"ªFÔ¤6‘GŒÑ¨I‰ÌçÕ.êVf„HäÞƒô= Ê´ÇWá²q‹~%e¿ë—¶/ÁKßRºŒSwÊ¿!mÔz‡Rw¾Í{7Ù«]k(mß÷ˆõí î´;øw«ïy”*3ËÊW�h¯Dâ#ô'��þñ�ÏíÑ,§ÉM )鹄j¦w6UÇ­ÝV]ßYGMÛÙtþ›‘|öXMÍÓþ}W÷ GU~¥2O•¼ƒžáC³©s}}a’ƒ�x¾+aOáüa†«ý”Õ£´-<ý½•÷:a, Ôs%:�‰=dfÉ×W!~o„UÛ�¿Ãä£õ°�Å7çk�«ò$U}»¹Fªªmו´öä±½ÎÔH‰Çd¾ÿ›°�ôåë%ûám‹«jóv–=½ŸƒÖØÏ¯ÇGÜEÖ×ó8çZŸs†ö/1‡‹ZãÚ­Ìs¤g¯µ«Œ±Ü¶w—möNAvzQªƒÜÌÆÙû9»x\lþ÷·0B^FÓvq¦’&?¶…Ì([íë]ê/ ó½êiZúÁ;(¨9’E2Æ+†ÀaºÖbðéé`…ózìÿ®—u¶'  fz0¾à�LÙçxÞp1oÎñ#ü¬°óeÚ=˜‘Á½˜M¥—Ïp�P>éWPþI¼“€øP3fOò/æÔ‚FÔL…�ñç¹ß°.>içÓ´a €êÇ®�‰ß é¶dö¯‚,=Këù3<yÜö¯pÃ1¨¨úBöçÿ†† N»>u^!%ÍÍ\Z©-ÿz‘=4š¦D—`n»©Ôî„*õzÌk7ÏÕM øñK€2�ÞM3U)”¨P�¹â茒³‰ˆBQ;˜ZkYq2¤à¦ÊDñü0¾ÒY›qÚƒ!£Ô‘Sä–Ë{j…¬¯ D„F¹ë ôÒ— ̺ÊI§¤JýèzŒ·J­.µ&¡Y�Êlª§ˆ�´äuTÉ””Y²ëªÄΞ´ñt�„‰É9ôhÉÐÓ£ªªÇ‘]Ë/ßÒJwg4}¨³èžQ»ƒÚ¯¬ ’¢)‘K¨f’xŽ„Î�{RÁd*«Özœ9:×þÀª]ÿûÓé£V¡ž÷ˆ¨¯);‚#S…£D…ZWºÖ÷Dž�ðáWU“úžCÆ%7!â UíGê�À&¢Ï.«õ•—£œÑÉ¿K�ñ$R2¶ëÉ€MSZÁµ¥ÂÐÄB+>Qºu“ïÑ!½Ðršfì®Ì%’>*ý¡WÓ«ðpÍ"ò'‘‰d¡ãæœñ~G_k¹‰Oí3äw`ÍâKäkŠ�Íž¦6í¬TkW5ÌÃçcŒÇx¸L¨iwåxr´îÑo�äzp‘¿Ý¸ÉhuTà�ª�»‹“²¿2ठøw¢uÖºzÍê�÷�¼·_ù=MΕ^î_äLÐÙYû©.„‰Jas»íËoG9_8Ébë|,xÓ£{K›{mç8·î¯rûáøJëåŸ+å.ÙÌ-®¨¢ü‡I s¹"Ý?øÌ†íÉ I<Ç",ûúû6ÍoZê‘á?ÕòæIûÞ>ƒú]nÞ~íï6îL^—¼<ûÈ‹÷ù”o盟¿.ø—4v!Ú(£jâÁ—p¦fŠÝíèþ·¯ø²O¯Žÿ¾sÞ¹lÏ `þ9¼Š¿€ÀüB­$”x?Píüƒšñ qÁm�ùÐiÿè³VwRØÓ©Ô¹c5Ï>Þpz”€ñøQ‘�™üЕÙqKS{1¥ÈGM€ª¸χ¼¨ÿ'D ¨ù)Œu]k:õÑ~z Pˆ«Eˆ–Á-íD ï²_R9Ä£Èó}ÍÚ»¶['ÄÚ˜)k!䜆wWÎ+ ¼yXÊݾº+gÎíÄ�¦û,ÀYxÔ‰yòû`>Kôœ§VÕ”¢S¢R™y~Ê"ÌÇßÊ›7Qœ2êÐÄÞ(¥|+=Úín $­•¦�Ü@ã)�=‘Zœµ©!*!Ýó$µ6ª_ˆNºPA´»¥q9ZfÕªuùúL¥¦I]¢“Z‘zuÅÑFû@Mœˆ."ªôœl݇%Œ–GE;O�k QÉDkY›†âñü�–¡²ûwÑÔãh>æ€ìâVG‚—®ý£•ûÉrVç÷!'…Ö(ª Uƒ(`yìF }ÞÙ/ 7£UKÖ§úæ \  "X±X_p}¬Ë¡{TªºN¡T¬]ÛKìŒì�þèëÖDôŕΟÛï&Æ‘ÁýÏ»Á]ç–X™B{Qr€×ÈY'˜^>½¿%ÓÆoFù/Ó‡KCs¬�¥üfɾ°qL*pI¢®iø½�ú%YÙïXšqµ9õ*k's"ϧ/$ÞWy\Ê+G…žBÎ'1=b­yîüëÀO‡LTnÒ%²ëÕí>$ævž;­ôq’óY1ôt|(uº«Qd*T6Ñ–¥àªLÎbïÒúûñ!'Ïï×�O–ÔiÜÚUº­µW‰Ÿ5^\)mÏ—jÝým�—üp“~Aù¬Ê `}‹FòêgûMDúDîr ÒO_ ¼uã[KŽAÛë.ç¯û»G\­:WqGí¨•õ ’}É|&jC¿°´i��Ø)¾ögÄe±¾çšüv-¾8×G¨èx¹ãZê|e .ärq«äáy†›D�~ÚÑ cE—»Âßm0™ÀÜOA><šÍÆS ™–¸Üþä}úܸ�Õ¾lɇçÝqþ±d¨_M¬®ßKœ—>ÖÃh]nç:FƒG½©¨jè(ÿØ£Ÿôô£ŸG¿ss/½�uÝ"ªyÄšZ³Ù?1îÏϰe”ÒFgÝ#c…Ù@úÛía6ø…t$R«†Õr´Ò™ãÿÆÆS÷B»êx”ùOm9«Ö™ÉÀ9Â#sÙo&å×Ó¸;ÍbŒêƒ ÷új…õ �rûgŸuSÞÿë/s—hø-F¸KŠ%߇‚CnÙ"&ñ�ÛMø´÷»Ý}÷w:¿u§[ÖÙ£ëÝ@ ÞI¼ ¿@ÿP3~ ¯àDÿ‘ñO55“+áþq>³úñ9Ôº”•úÔ@uÚ& ’78Vç&â;B�¾lï]šºÆ�w%òyÀnùì³þw²–�¼]æÉ¨=4óà}ÕÏgPéõD%³ÁWž‚äªpºåßÉ�þ6U·§(ÌwmæRœ�ùwM¢<½„ zž8$íe½2§9·Ó«FÅ ´Ð‚#ïèq6BŸúúØÍôñsq�jrV´Q7Pô¯¥\Q2÷¢%^¢pæµ ”‘K™i'2:”q;Œý òÌíãxR&zG÷““X�£$#"eg~E \ †ä œ„Š*wúî|X‘¨•4¸dnç0þó˜Y‹ Ëw‰IÒˆIêEîpW¤Yoïþ¼kºÏ�Òl¶É<ÃR�´Ø0+qÛ¶9ýåÖãNCnß‹ŒwXn^ÙøÒÉÍM+™ÊJ5gqå|þ¢ÿÛ>a ùÚ\�c.»2÷ÿjâ1ùÚú¡g‘¼Qk�Þ í)­y!7­3»÷u†æK¥CÃÙJ]3l™»÷FÛNÛ%îq’†Üè¾ ÂÂxê[gl;ý”hñ÷»Ò'IøÓƼ]^'Ý—eÜÅÛa-ùZ—¤>6�IÝôLTüïg"wøÿñ†Öü=OÂéR¸#y!¢±´…µ{¯álÎu¸•X®çWºýDYµxqüŠ«.¸‹g0k}™ý¦¶*4E"ZÉÓúÙ_yážcì¼²‡ÌS>*V>ô%BC©}[ÿýƪ£~| è€Ðµšïzd[ËÔ¨J•ã±7I6|öSaóƒSR©>Ërþ¨ùÍÞÚ,äæ8 ‹Á�_Û&ê‚>e[m\õpŽœ/³,zÍU, ÙÔ_?]0/˜jÊi�{þ�zPˆÁ§‚!æV|Ÿ§£õ™gUN~�š5z]»ÉËÞ¨w¿2yiân…ÆC¹@Ðü¯ÃÌú”±í•éãùÔñ1Š•8²ûî0ÇüØ.�þ?ZÔû¼_ÛÝ_daA9ì~�ˆRæòåáòOiÿnhæ+9t -Í×6€ý@üYßñ5í·Ãs¬f´<,_²+©qc¼)0¿h –‡Åÿx}þOggS@}Lm¨`"J¹ ÿÿÿäÿÿÿãÿÿÿÜÿÿÿçÿÿÿâ^YÜ* ô³ýà\3 >ð/ ÿ ú�ZÉ2ý™ë~¿µ½†#Â�¦²#[UÍó#u :רÁŽà嫼¹M[÷2¼é È1IøZ‰ÛŸDî¯úZ_µ¶×t¿hñ¹µ)1q圩ú‚òÿ»SŠÄŽr֮ǫ{T/£o²^HâTœ~²¬ÿõ•ÔåX¦¤¢�ÏTe›-'³®Ó£9»<£È%�K£ zJ׬È<ÔÃp.˜¤ÊÊ<…²1L:â’­äï£*—6ĦJTΚ¦� ÃS%úˆ.‘lê^Övz/‚œÞ5^³# Ô¦‹ß^æZí{‹ Ÿ�ºB Pc‘ŽÐh)•#iâñ\(jj­L/©Ò½ äxò\˜¡RÓ‘V8´!§Ä©Ôº·»R??d"�‡)>2åzåN,Íž‚Î/E"}Tb:˜QNé´û�†5k4ӼЄˆõ ‰Ž5æ·—bI.Ì�­�gN ¦µ3¡R�ˆö_¡ctP�2ØšÔÐ 3QI  Ð…eôÈï)"¾U´5V¸FË[Q„àÚ�¯ŒÚ\LÅâ ¤SKXºìMoÖìq”r ĺ‚/U5ÂãßDØê% '>ãV ÷„àܱ>ª� ëÿ˜ôZ-ü*ž£ä®ò<§!«¢ÆqŒ£¾à�î->›éÿÃÇ ·ähª©å zwä[ÆÒÏ-•êÑúzà½éÌLëÇ�ÈÙª^ˆ°æÛÓy#“�Zõuoħvˆ´ìj°jMøÆÿEõ§È©6%þDòÄ®…HcQ|²6orõê{ÊJ»…L^šT1.µÝN}ÿÁô3lv×I{�\´¸¨)Õ ² ø=*ñQ_ÌBg¬@ óÑØ<÷Wìé˜X¾_x—Éë÷µˆ[�Ë›Êû¦îš®VôaÀŽsÛsîû°"щS–ú’5-_öñÍÏ)BŒò¨L^7Ò±q%À’ç aœÖýNáÙäÓeR8ãNˆÄ¦2qûdNÞËÓEôÃómNÏó)P‚CŠ–hÊ‚ˆªÑhBxaL€�Kîy_9ÔòÜÁ«lë´ä‘ =渖5ßš9UAl„õïºßšètûó�ò�FŒ};@c9ù üÿv÷i©ì8�Õˆ�ÿ+Å~UÒ…ÆÀIII²¯ÈÁÛ;�Äæ6}Ú ™š¢F©§¿gãKèM5ž‡lkÚÁosË>—¤Bü6­ŽM<ëT81Xøæ­±>Þ˜½{÷‚¦·& NVâÓ`ö¡°ÄCmÇ®^çéŽþº¥ç“=5¾Ímÿ-˱Áû±•½ã¨÷ ½ËiX>N³c4¢/Á�~iܡՇÿ¡±4øÂ?þSP¾ wíð¢û3/f§"© Ýõûȯ_®ðô2»+DlàÄžùÜã{Ê©IÐ2 JKÔšåÛ™Öúp—V”H‘`qpw�k‡e>’Þ^2 Žjzäj{íGäh¸¡žÕûRôÃüšâ|R 5R€Å\f¡r= £¾¾j1Ó‚ Ò �ÆÑºŒÃßòó̳„¸VŸý4ˆ]ˆ¤Î5áÙºÝQ«8pF=Ï;ÿ2÷¼�_[%EÉ©’®°“‰º&A 误Ãi¼<…3št¡‹@OâLÚR“ò©Õ8ìEþæ6§·Ñrˆ'a—Î ¡I�E:S²³EË“NMÕDí=úÜ|©ºëûÙÇž_�lê¬ÙáNNí™Z‘5$³‰~ºåC\rîH�Þ*/­‚,@9¨l/Çsëþîý¨¦?Zzðè.+­äXë’›jŒe¨¯o]‹ßg‚JW”‘8«JþB+pm›7;6~¡ëêùÉh·ÓÎ|R]çœÛØõÝÛ®7›Qw1éx[g‡¿ËVVõªÑíU9“H.!mV”þ_ü‘Y•Ù¬ãò¤×¬åkr~Âñ¼‡æ‹/ÝðO�%ö û°"jå¥+)¢Ã…UWN‰é~°‡6½¾˜ü|öj -·_µÜúãn¾òÔ*�Võßò3™�ÒÈ„ ùí´^8:é§øJpEȉ§¥"øl²1£È%&é5ß\Ô'�4—‚¼+ Úä÷vÊÚ¨òôe®’�ÇÝ{T½šã â;éŸ6GÔ_Ùß^e�£‡uX®½QTŸ¥®hj×mHý‘—\°›r,3”pþ yÿKvîtMº.»òÒ¾˜¿ý2»(ÿŸ`¹Õ2\l‘Ûìì~ähô ÑêÝçaàrôBo)W&óåaŽhLß'ºÖÄ]¡�Sõ…àdÔÔÌsʶÉÅ*3¯Á }¤ ½OÝßïä”+áZÖ€û+ w…Ç/0ã´Çš-×¹ùéñ?Ö_a™lš¿É7ön§¸®óG¶«­-VZ“_NçW¾ÓÊ\'lPé‰d²SÝ€(Ø&niéì¥4‰ãŒdRYõ»“¿MÊå´ !æ\å$nU¾…±µ:AцtX…Õh÷OQßR±Í5y1~[²;½Ðá’Ëb_v  oÓ\ÂjáV6÷… êJnë%ŽY3EœŒcÈ^YÜ*¿ â‡j„ÆÏà�ø�?àÔL®G§·¼hÃkO\Ï�›M×}8Tˆ­š<1Þ%Tý“:ÂúžL¹CñQü²ÀrdþêÏcÝJ ÑúCÿõ+dÍtÒÖ¾q™ÔYGmMÝG½ßÛ|S×õ±J `þ²X ŠÐÖúuKþ3ôž(Wj¢¥QhAŽëoÆ× È*4°·„@E @ëYºJjv§¢0¿ûîn"]lz¼�Ový@¶Ç%Í`;îOcIáù3ŽV¨sê%(Ïi÷ÛóÜÛHù\,kuž“ÞOÿt>vɹ6©ÌMzïrÄT8 TUÐŒD2×Z!O;š¸ž<štŽŽ¨&RxóL�\†Ì«!ñt?Ÿum:©5”AIô½¥§Xª¶ºQ#Í”ƒ¬UN�ÐG6©¡,G¯ÄñpÜãïätyÖÛQ¿v�ôäp]*äŽ*…HîŸNs£)š’Ô˜âd"rµ s¨ûûƒ9Î&úçŠ1Éá#NµÑ‰I3·ƒKqh$D㘓GU$"“`9 lÃVoú¿{²^Z•4dF¡>*~WjÙÑ4Ó�z)ŒŽÍ©N˜›ŠT1iPÆùã‡\ö]µò>3ì¶‘MÖ9ÒæBʸ8Á jç.Ò'f¾ˆcð„€~çò�±qT½çÌR£|è[«‘"<´spkwü݇c¢4öZƒ™k}�4Ÿï=ì׬æ' ·J¬�œÄ× ßnèKÕÅÞ”®ÿf/uBv©¨õ¬ìK½×îœú››:†JåôåÒº-äµ99gïÝWiTöÐÜõ¹ÿû¤ãH•#34˜‰\CØc·;¤ü�‘_ìŶŸúôŽ[\͵~º×g&y} à X‹bøŸâÂo>â#^3 �iššõÀ²VVmÞ�MÿŸ“l<â·îÙÿ9±¦òÏÕxá“¥yÄ«>'N4ÇçÁ7Ìõ«!¯ØÒqîÎ}îÉtáèÔ³iâ—õÍêäöÓí;¤Ì&ÿÕXùA�õ#Ø”'×ß•ôÆ™a ä[F–º·Ú¸Sç~�§d´"9ÂÒì’–+ò ÛN çÆ &vÇQ-!µ{§Ëúk Öqëq×ßóè­îÔŠ¯xvO—Á¦jxÇ?ÁÈøs4|ÏÊÛ#±Óìíò?À|º]†_×hêEMÏ_39Uð\—| ·üPn>¯ 7RÑŽsuÿþ-8V]鮈`=t²…ÛÛÜëÏç³’7Yf·š U:IˆJΩ]�Ci} ª$­‡³« µ7œ®¢�Ðñ"éš•#Îh¼«ê|¦&5ë#±«FÑ¹Š“©L©¨àPÌ ]@"(\�&ó�úþJ�p K¦p!ŸŠøà±÷ãtÛ¦!ý;Ïm®—ãO!!wßÖxïú®gëaátìV‰<«Vnï݃§DÍs‘áQ¡ÓëRðqs¦!Nsr_(rÌÒ„ü·æ]½N|Gé�ˆØ¿ŸT‘Þe/)¾nÞ΃®¹—𣹹ӋMeì�Æ im¶‹œÂßÀß˦#|6M"Mô6…§Ÿ»‰ôö²ˆÙõç›ÒRÙÍ›…ÂÌkÌŸ'm=YÝ+Þà«��×·+^óËOÖº;«_JHؾ~÷¿§ü<“Ri¢öL6¾|líO8K/³ÖGʪ9¢ZÕ1wŒ‡BM­=õÞªlß^Ož�qð�YeqxÄ,RÇÝÈ­¬ùAúò†|ž¾ôQ˜8ÊéןÝiV/Õ>wbùR^ºÉóú±Ÿ�1…ŠašK½�ÏìöÒ¨å�ò~+±Pºôü»ø{k¬å±‰(ÎPS|‡‰øê_ë)þ2ÖU£^¬Æø§5'y?ì”]ݯµoÊ÷•ÙäÛ =_&™ :0€˜Ï\õç™×Íáuíw¤(�òeþ8Þ.—FšúÒ¹Ñ_„*­Ëõm–™q¿­�]Gj×ÍøÐIÉ?O¶Û¾;‹Ãñíµ{8i_F~Ðf¸> öל¾Ö6Ê+·žftþŒåÎ:yÛŒó+âŽÕ>YÜò@ÄK#û1¢¦¤ø¿‚C`ü3¹ÖJ®°º?ó¢ÇͱÖ_ÏŸhº�ž‘ž?�À¬]•Þpá§· -*ðßäó( •§þËnªÿfP‰u#™Óÿ÷'H•Ξq´WÔ žv€c—O‘ݽ'¹U«Rëi2àD|×xä 9¨ƒœT{3‡îž×âß„€¸H ‘2kNÛ%ˆ¬Ó=¥(�^ÎÛï{½šEdÍHMA™Y�F%—˜ó¶â,®Ö¿†sTÌÁÃßç @dˆ’Ô³ƒl�ÂéúTè›9%#ç�YzQU@ã^@<-yMÒP( Ò\•v>å v¨›)u*×ÜëdÖ¨´Tçc¯NUÈP%�=m%„žZå[‘Ð^¨$¢eœV‰–yi<‡¨u®KKµ¢°L2DV‹¯'ÇBŽ=‹J’YT9¿‰Uk´S5E®J$Ð¥T˜'bE}PÄ×¢¥�®"ÿhqÃýŒ-Ç„ö"þû_s“”€¤ñé52h]È�H ¶Û)¤»‰ÔXøÊñˆœ×‚úÓ•è‰@#÷ù¢þUŸùùS©sÔt›=ûé4^Œ‰Æ ˜ -bmS3�Ÿºœ]Âß# wS�^ÃÅ3}ÝCË Ú‚¶¿<‰�3';ÉÓ)Ç $­³þL“—ö17më±­·j¯+þzãSô)÷ ²SÔZ¥mbšaRŒ˜;OÒ?¾4X0XÐ*êæb´Cu²¦'œ»›Ùüm½«Ü}j£ÉÙ8µ1–†­Ý§?«àŒò÷‡Gäɶt²˜{ûeY²N+œ­{aéÞ3"‡:,VCW~Qƒcn<šÿj¸šðõê®X½›®é¬ó¾¡õ)Ú™d�"ô¤Bƒú¿4N„ÚI%ûÓ/õÈN©ˆ&Í>í–�œK¿xìÊd-ÚíûEá Á·Êdú´àýy÷ð˾ÂÈC'–»nÑôÝgÕ>:@WÀO™Ê›óª8W'?nÓñâõÜó9Lþùwµ•ìgáç,æ{>XÇG$� ð9µWÅ™&oÂÝh2Voü{“Ýÿ 3º]O+tA¥‰?ÒO^qrŒŸmhoäåiÆKÜÉÑh’ž½ ÏÊ×=.tXµõ›—X„ƒ±«æï'—Šî×¾$”0\ òÆ�‰â�á‚éÉ|Ý:˾íefsYøÓ¶£†Ž¿é¢é„Ë]w6÷ܰRïÒv L�æÒj³xn„ñ[Cã8÷ÇóE¾/±jÚÑÌaomÎ,Z«Â™êÙ€ŸÄ´1OggS@‘Lm¨`#ºGÆ|ÿÿÿßÿÿÿÕÿÿÿåÿÿÿÜÿÿÿÞ^i<É? ñQà¿™ÆÌà–ü §ÿ øƒZÉö£í3¿µV·'ú«êHV´yUT~¿éNÑÓF{F²Þ儉ã¼n-#2?Âvˆ×!º×¡¡Ah×6zÔt¤7¹k€®õßUZ£ÝÐ÷LŠn%�©J—î{œÄ_ª[Ù(*JºqAtŸÛÀƒ@ßÖ®‘Y+š¤#úP ×·†å3Ta{¹ò‹ŠãP! „Çt„3H"ñ‚€ßy”ãìAQðW)²T^U Aî)j7¢Þûðl›ñ@çxùZ‡}ÆÁí¬¯@³Öâ +wéƒ!Åïo~}y¯#²Ñ ¤N•“¯Ý´“äDmbϽV³â-…ªS™OB§ ©ù.—ŒñG©'Ÿ²:b~ù EsF%©B Aô€B¥³~]"åiœ*Á©ÍSk�C¡Îá¬7?Wvhã+²½þÒ)Ô̺:�ß™åôôeœSÏ<�œRI*Ò'z²¶¢¨S�'¸£^…ÜüqöÑØ##‹J¿ÉÏTÝ © $èT$Ñ Ró ‚€À:ܼÄwûHö×^,~-LW˹!öã¯S"Jû¼[_çíØ³þï]TѺ˖UùZ“>s�íR�Óã²UÙâ-ï­y¢éÚ&�-Þúp�#=QQvæ/æx®X,5+ÓÕ—ý�^Þ±¡qòeavnÙø/Wc*�=ƶ�ZŬ¸[q°'ÿOÕ÷yìWk�žÞþ¹1¸ÒW¤MŠ©Ymº_ù•…I]¸*='xf7¶-ŵq�5KÏ‚0ý§Àª�'kìÇ>'Œ¸ž…Ç«žÀêW¹:v­ùJ¿ómN-ŽŸ�ÍûçÊ™¸¿pFºá›çÇå íF´±õ‹fI¦¬9&³&_³¬2SQY>ÜßÃ\“Þrµ&_ûÈ4ž'½æ}6<çz¤÷'r« ÞÆ[w_& 1/ú»¹ÿpÝzŸ õ‚RMÓ0¾ÿ«úÔº("$:o îCj7Ouà¹Y©ÃÇsÏÖÛÞß¼ŠvO¾Iè£ùõß‚§ÅQñ¾;Zp‹:÷QÓÔç÷�ŒçH¤AŠ2ÈØ¯ráèfªnn•ã½þIQ£i§4^ï¿€^rÞ3ÒXáyµ»Â|ORá½åö µã’å3é„Óˆ3šýÉ�J˜º¡½�_¾1³ ç …×¨xq?6½hBUdVÈoß·AÌ^ë}þ�ð%äî¢n|Š«|=e4ö"gñFü¨o=5{ÁàZ™…?°Ô´#�j#úÔ|@Ó±ï´G�ýX\ö掆ìoxº¹cÙ„ü7×Ú?Î9¥t1ži<É͡Ͻä¿�ŸÂ;þ³~�ýGPSr…㾋¾µâ$_º�é¹(LÇtü#ažt ’¯"ÆE7šGg“ ;[ïiuWÙødÊ¡ƒ hù;] {žç+ùz u_*B£Aã !Ç#•X_Ýëð,æäotV 5ÈNö,N*ýœB£¨^�QÌc1ª>!z~ì‡N* \�üO‘+�6Y%¥ éEñ}á¶�¼˜oÜ=sâùÙ–1ŽOAdgvBuŒ�Øk�zoÈxj;k&73éZw�D+âHñÙÞ�E× o8[*ŠÖ¢g­’ù¢Uª†xâM’@Å-+µ–Ï9è œ™ 9‹îQ%2¿³ M�Ô`¦D„]ÜÉVýEj7GõÑ3©3µw•ƒÚ-r¡NÑä„�t´r�q/ éž½EzÙzŽ1tge8C2sÙ°ÙB«@w\ÆËZLT»÷Qá�©O7?‘”]qZ^º{ÏòÀE¿}—Îa«™hnº£ß⣷J�Š-¯9h»ž,ytº¨‹Ë§EЬ`F>�!Œk>îé¼987ü±¥Ñz°w)œ®²ýv‹îÐvåœäw—KfeoîÝ‘‰c@ls¤ÄÞº]ag„xp¢WÞ õÃË� Õs4†Y‡Òºž®N›�¦)‚ø‘"hÖ5‘p˜¾Z·Œ3J£B8ØÎX¸Î�Î9åÝÖvžÃŠ`‰ƒ‚›8&´¹ð#3]ÔÎŽ‹Zj]©ß¾½©Ý%†|×ÈÇ–_K.çØîq)úÃë�Ä®¯ß3¶óÊ�–$Åâ½ãÛâŽJKXSøÞ\v.9\nü¯n›ÎJ\ì~ÙLMÁÓoÆ|§Áv‡6ºòc——Ðö=¨Wäƒx¦#ØÕÇÁŒÖ xœÑgM­xŠßõÜÅ$&ÝãyûUËwñ~'z<ê{DтǘÕDjÙû®mäˆéÚò°+w=¼·_·ÿhvò�öØÒ”'º kÝ^!JÜü½7Çߘ6‡1]q~†Ãâ__cïLCÿF y2ú2]�øP–^¿òJ&ž…]YŸ›ã=%99©žI<àæý‡*ÄÛä3ø ¿ÿP+¹Bë}ü·úø¦¯z¸Ã“¶ªâÍTþþZÁ ž½ã�ÂßC DTÔÿÊœ½¹º6±ý¢gϾ)¤õoB2Ih53{½&Q·ö“šp¨âü¾9s±6­­‚4}¯„¯_uÎ\¢fÕ2£*ï[M…ÆÀÝã´ ð-#錹s¨ÿn“åà®”ýw-‡–i¨‚ÐÚJ}Í©îòýxŒ|9³¼æ«І �¾ºS¶£;u¶˜Ï\�ãí¦ÎÚ+�¡"è0ÔYèFÚøͼJ1ÖÑäÈnfÑZ[˨Ê\BPAiŠêjÆ©«$ÉSk¸ºÄTs7é3{ Rµ(¡Î?©h˜3úSMÂálUDËàcO”}íH�Ö˜´¡¦àHí’ߥۡÕ!�vÐ]C$€Jk­O©tÝU¦¬=Çuw&=ú;=ðÐrf"µ ÔZ®ÐY‚J}D‚Š“ÑÚ“CÞùeGÜéÉ–‡2{ÂLÕ* µûÅ JŽFÂ�­*€°0álÄøÇ&ú³ºÙûíŽ#)~ pÙ±}RTSÈíŠg°´14Ð=�yþ?o¬ôUà¤}6¯Âôx=ó~Ÿ)˜äõ–ÿö°ÿ€B÷mª4êÑ÷Z#CVBË-Ô0×Iå¨cvDgD�a²„Ò²šÊe~�í5<¸Í—Úç&UÝ‚-/­šÒºâ¸£—QyôÆKf=iÈ‚¹žOÚöõiÉÏÔñÃa›» ú¿t8ÁÞ–7xæD‹ÝYm,³Ï Û ç³8çÏk&þ÷övö²ïS/�pHѯL‹u‹¯e|›çRpÏ¿½ÊÕS_¿› 9›CrÕ/{#¡bwýxô½?5á7oRT&(‹Ô ¢îÿ^ú{8=ÊñEÓ¤¢Ûôn)ÿº*ˆ]¯Iñ=?½ð»½eC›<¹�pïkµÉÆå»°ý¶gþXx?­—÷j°„fá‘WöŽ�3Í ?rÔm!�ð!¸+J�Fô;ݳmÿ_õ[béX³õªÜØVv]95ä¸?¾æö;þ`RκÜýAйп¯´às²¤ÌŽÖ-¦j¹q'åÃ…�Ö—E¤Ìë¼lF¥ç¨/As|ΧwÕ5�!”–殘á$ JÍòGYL=ùâGiœ½ˆ�éÀÌÎZ³ÁÕØ;Àò8®¹zÉ-^ç/¶�Ù•kúk7[WU5§N/$}RÏåÍvEpò=îf[ã,—¥zñŸÎ.£ˆ|´Ëýw�ç÷V»Ú¤Ú—÷%¥­:Þ¹ EA—/`i œÆ–ík¾õn[87Žb ÿB[Àk¾NÇÐd:–kGH^i<Á_íüƒ&›Á ù VÿP+¹Â:óü²#v®Lâ‡) ¹5ëT"õYY+ômgº’¿ÕJ8TÕ�oåÌ0©¿_¨»h|.jlAQoý‹L… 5Sݵ:ñÔŽ”(ã—=“+ïá3\•ËÒŽ%tÖŽ:üPë{îYET"«¦þb®Œ’¯¥ÖBŸ»ã(�ªFî�¢üä.J J%Éù E…�h²£8ô‚  ±¯U·ÃÃbù:!2Û'ó@i`PRCMUÑꔣôƒ4n:¹U!#‡§¦R!•©WŽÈ›Ç—^àÇ¿Ï/%GGWu<ºö3TÜÎx�xußi™Té|Ȳi©Â1ƒ  º µ#ºWH¿v=_ç�Çêš"¤Áy T$�ìº Dj•¥Výë~Œ÷›ù¸_Ký>4ÕÑbIOPÎ?sïÍmùºäË�…ï>G{G¢rM=—°ï=´:ÂtèE“qè�¤û©¥"O·Ý•²’IäÄ*ðì x€Ì�� Ð×P®þR×ö†«Ç=+¢Iôò¦€ßÌGÛOAEÚºj³V ^(Îqr-BLp¦š§Š7ËéÙá-9rë´TõöÜÊŸžÕÑýS/¦o€Uŧ—«‚fé.¬f˜ºï ɰFwk{\¥ÎCyµ/˜”$˜Ý·úr™Ãñõ›k…•ÔN]øîj޶ îLî̽Eé_nýïGǹîXÇÿ×, ’sŽö°×ÀXîWî�ß½ÅÿZÝHe®HÙ×é”ÞQ�zÒ5¬ =˜—[‡%,xµ'¦�ó¼ãÔ½Vá꺟jªFž©Ý½­q×Zt‹³Vb±êôr/N;ÀSÚ„Æ÷|Ý5|‡ Bd¿ Y¸¹äW-ñ¡n[ê9Ï3ù//ëÌ«gÁýðTæn�m‡\ñÔÐÅ9¯@Ó½"Ðut»=ŽÃ·š„Ó³ºáröοïù3Ëz³–úczž7ÝH1Χ_SˆEáüd0Â÷`ôÞóSîÔ06#*î‚3àgŽ¡kߌ’­|yvÐ’uX‚’<ÎdÃŒÕ9nàQ%ž›*‡C¾T[»s!/K¼‡Mù÷ D ½œ‹ºÓõk6ó�c)ããΛiñÇB}Ô*}æÒ髜jEåÓ»ä6hû2įðþgš—Á_–íÊ™¾Cž”Zâæ\o”7‡žë×õ¼0·FâeÖ§ªÂhÔû‹3ùn�&ô‰¬Øý5dBý£OžŠ,jŽeÿ>÷�Ì›‹qxN›kZ(ßöDÖXYµÜÉ·ÎÀ\¦¸µE'{ÑýZ'¾y¼‚¿àúç4©^ѲÇO#û3¢¦ä†ýfôOöøµ'çÖ, ýCÓ¿×´¸DªÂ?d&r¯Œ_×ÎŽãÝc½9±Ú­ Ñ¢õÃ6 gý9T¤%Z&†é““ˆžÇ@òÊO7æGM%ÕbëJ'�LÅìúWÄ'&‰pƒsö@9€¨nñmßÉpÆ]£Bã$Ôªq€<�§)4µ· A”YúÔÌõ”®ˆ+`®ÃÏy–Ô/Ýf¡?�ïS  Tq( ÆtzZˆO�oå5L§'@\�EŠjˆ-ït!3"šJT� ‘]Õˆ,v¾+•®ªgdù<îS6‰nÏU_Èì~1›šs2CvÖL€¢ª4’µîs˜z«4y¿d?ì?cåè|ò/矿/ùú¸žù-2�šN’š=g.Z8%‚|H ™J“ÑNÃÑÚ D _k¤ÖJ^e‚µv¨hA{ÍIé ‚„©Ã ¯Å=ê4AWPoå5ËåŠ\€ä$gL;i[‰ø®ê›-üÑ»›føŒè$UiІÎ;u·�ϬYs�L-änõ�Œ’øÂþX¼4(,üú‹yŽ�‹ËÄ8ˆ+Z|²U&ï°ºÖ&ö âü©«¡2µ�²ÍÆvt�›:yXë–®{šŒÏëôpûKt–ÁA§ö¾éåû_™Bœ{Îþ<¯Kè˜ÀÈÛ7·ÒMó6ÏâüÑrL•äb‘×�ÎÏ‚¾«cü~ Aί¤8Ÿ*‡LÀÎoß×3š"÷ÍÂÔদ‘úV7L-ªUâ<½׵޻¯a=þøiÝñn||•ü_]±n´{ë£4üg­+-”ŒUwE|«'úD©bAà Ñße»Ç›/}ÀOû¨ŽÂ�Ws ÷UïÎñkV^µ[Ò̺Uçìh¢m/z‚ŠÚ´HXc£É®kÁš/dIâÿƒ¿ }ÿðBˆõÇŒÒ̺¥˜ŸÁ7�×{dõÎŽAi&qó1ÕÂ,¥ËCÀŠé›yw"qì7}»šøVôV3Žeë‰\¹²[£èˆx}èÄÇ¿6´»³Ÿ·piw2äµs¢Å9Öî[c°Bò8õ…_mØsûˆ'�w�M}ÐV/cççm…P³^ó9³¯õÞ4• ÐŃ¢3�+v�„ÿÁèšCë†) SǘKfdã¿ä-¥Ï W]Lø¦OäðuºåŽQйbE“­û×ú©õ�‚[i•XÕþ‹û1>¦—Ñú/0#QRº½�-Y^zß7[˜”. ½€5>µ«½k=7ИæÀ^¿OT°Øžè½ë;ËC~Ü«¸Zعק…(€XØFOggS@¥Lm¨`$ñ:ÙÿÿÿÐÿÿÿÛÿÿÿöÿÿÿÞÿÿÿê~y¼Âß ÚÇ„Ð89Ür¿`Æø5“ôùßùÿö‹´¼8_XZ;&þäs†•^-õ„pÇ€é)WmÉÂìdãͶW¬Œì*å“WLlß›ºåãЈ8ˆúCºÖ³P‰iÿÅξÖ_BbŽ{Ý9Ön¥}~ªÕ'<`šÿà{­�²DÇá�ðÁ Dâ #§Ö‡¨«:‰Þó”B¢ºÓ]}kåZ[.õž—±Ÿß?ö$¨Jª€dô£½¤PÉ"< 8ÖÜ›Qmn-Ç͹³(ÆÖ} OM2„{ 8Ô<öÁEp*Òk8d�²,œDq" bn(…êÈ�J7‰¬Å¡ÂI#δhvèòoÒ-RÄ5Ý‘®*´xL5Së;Ei'(ˆz¤tJ’S•ƒ\ûeb¨¹iÇmŽBVP�tã]|\ÆoáÜ'›|è„©A' ÝILÅrÉÃ?çÇèáÐBü­Y)NR È9=¶$?]W;~ãšCØéÌÝÚÑxB#¨$'÷N � À) �YL—=c$¿'^b×OË>�MÂmVêý{[ô¤¨'èQ­çæ%)½~Fͳç, Ú-Èk`mLLÉR³uÝðüý'lá�Xy|ï‰]ÕÀ,/[u2Kïò»îÛ¹›&ÜIÖÉy…ו�Á4aqðµ=Ù›bJ=߹͗›œÓžßNÑ¦Ü—ß zØ;\87‡ ÷Ñ¥ß·Ö fskƒØ�µQ3üS�&œÂ}ÈuÞT´ž·Óé.ièóJ_´"[òn¡ A_�è×wŸÏ¦‰Ê0Wð¯Üù®Õ{dÞ`¯}°+`]ÇÞªL7-ò¯ÑcEõñlHUÛé–È´;³Q}Ìk–»D›aV)\ö½†Yµ›�FûJ¤N@{‹Ž™‡¤lS€%ïÆ©Äuœj+¥ûQ=®? Ȇ·›ä»¼ùõ=qé©g¾¶{¬~—¤o²ãnÓ�ŠZ®“Ó{~<ƒ‘e¼Ý>ó·ª*’¯¤U~ÛÇNiÙè<·}ÇèÌÓ3§K6çÂ;üýœDÏÖ«=öÞ?—Ù ÒN­—�ëÎ_q�ç×ÀÊgÖW>ÖJ` F]ÐÎZ'ýôi¾”ã´tp&6^îþ‡,½ïAø¼æØ³(Œg1÷ª4[‡÷Ùe“ìY^ÿ}I[r�>‡êîEoæþ½<‰Ø<93yÌ d×»íÕ¤<·þšXáüŒßABƉû¸ZâÁ7†ÙX˜É8òôÐRŽ×Ù“±ÙåùâÑçëwüî3l™™žI¼ !꼡V¼^Ðo ý€P3¹B>öWoÌ£ííúcÔ±–:þ3³¨þßQž>Jð­JùS˜§ÐÇÃ3QäŸÿ¯Úû Cöç·(´¬áÚ£­Ä£%ãA]jL›¶Tè·ü<ïhÊRuqƒª¨{›ô§zµ¦¬<ŸŽ0Le‘*&ªTfÀÉì1=+ŠjÙž³¢Wë¬ô‹ö¯2?ü÷ôÉ ·L À �¦þê¯ë>ÞÿŠÇQ[»s‘4šªïü·U�O®“ã¯u[ûO |‘©«'sÑhÈþzá¬Ó­šmN“T@&é*ŸÓNqTQjù¨ÚªÒk:q*{¸ÔzE$r•µóóïð0Çí°?ñ ¯áÐ]ºµ qr¨‰ê]Ö�J!QȪ¡H×Ä §#ÃiÙ¡ŸY™j�VXj ²f%5¦¼)\œE%¶fEs UiãO´øtoáD®k9’{º¿ÅlâºýÕÔz�՘燈J;§î_. ‘Ì<…ÒÏÙØn�“"ÉäkÌ9]I*¡Õ´$0lÑÚ #‹?²zïŸNr#ñZ{3*Ä/›``G×Þw{K¸œäsf.[MW¿ûÆh ô×ÙNÜÅôÊÖ-Ç®¯ÏŸ?˜�¯¤Äš7x¤&�÷GÚt¯[òøq ®�Í�TŸ>–Âðeë*7ù1œãùÏcîÌ™ÛïÑ‚ŒXe]€âun¾i—t‚ù¿Ú¹¨n¯cR~Œ_DžÚqÇ9½Ê•øÜôðN-ªÞ5‰öwõỔÿ?Âm¶ïß­l5•wÈè]Ô ˆF2ÌÛõ»Í”®ŠÅi_²¡¶Fœfï(é>N eÛkY‡›ÃÏ‘e3­éNU¶fu½ÕF¿V×?µê˜¯È9f¹nŸ¦_3®û3 ­®›‰Ôª)¯¼à±øZQí£=¡1YÍÞÀUúÜ�™#o«?6D*Såk~áz"NºÕKÏùsÑ«ÊVEúg*ÜB·ˆCÑ<$©0ŽŽ÷Þ}ÿûî»Üý©«Š-9&‘”’†ýŽÖÉ·Iˆ—Þ¬É{‡×VÚx_Wš+á|ÓXÍJzv÷ßæÜÝl@u�æ²tÐ:s3�øm@œî v).ÇE}+%Œ?o9c[ÏÇ×9I¨ç§pÎÑ|<ÿ¯¢Êå[Œj§Ü?{GšÈ˜Œ¿ª“­žA˜ÕÚ�éOsaî¼.•o÷t9à¿?^ëp'ïgX ÁK-_ïrkÈúÂl1(®¹õ‰å2lþ¯ ”\Â+n=‡x¡|÷'¹Ó¬\_`:¼æl¬ÔŸMk9C~Ü‚?õÞP9ŽÊ > üá®™Ü|tÜŠzoìýO«8ܪæ X,DE�àT!úÚmø‹¸¶6J=5½ ïý C;Ðc˜/öG¥ t[ÇÕõ—!s5{ª™­Ná®aöNšÁõú’"îs8gƒT8ìKGM'¯RûøSèž‚"Žayn‡C^n±"o~‹Ï©�RYDkìA:ÌÎ'Þ€²¸á„NíÖ)@ ~kVa†ˆõRGæ®ÇÑO i‰Œ©äéÁ­(áõ<Ð^¸3K A…ZËiÁ!Wô¯–Ni‹+_Ý«þ¾0‡do‘Qk•~2Z­È* �dD£Õ©EÏó÷rÅè¿çÒ²ßü(B¨�›�¸q?¢dÌâe‡’ ¹’¡±wf?Hè6Ú^Gw9­Nˆ¨€¤¾@6ìNàq’‚HЦ.`,Ÿ†v3�ùxŠþξݱq$¿ß¿õSó8W´v=wùÍüd÷":H�þn�}<Þ’’ðöä©+Ønìý‘™ _±c®„XwQ‡ï€eËßàUÅŒóœF´gŸV}©\«ºé£MoÚò:ŠßM zªÇ›Sæˆk9‡r¶´ÑÕWõÛ“�njX]u>S‹éûarOŸY-F}x,1…·2k²µÖÏËØjAËà„1òÞ}=�ö;ÃËoxª;Ú�vN0~ž›Hÿ¤ßÑíC»1­ý•·…‘ëË„‡¶Ã8túÖ4,«eq51³>rUÐätðañ.ùÓú˜RÊswÝšƒæÛMüŸ‡KÞEJƒ\-}œêS6±ü4„]”pw7î²k…l› …hSÜ\é¿ÕƒÞ¦j{[^�©’jvmb-ðRæO�옪�{<Ü>ad@Ù&ÚMbÇÓ‘zÌãHUj¨Æé�w6•Oz¦†á´v¢¤ä`Õñà¶ü¹ë‡ÍB¬®[~¸E£˜´�»Üž«Ù1òsW?ÇÆÜ6§iØóó×ùyrðO‰Äæ›ÆÉ+Ù¿ îÆòþ¤µì8I?«Ó„7Ǟ؜ö}ØÈ58Öü¦Æk7F¨™*¥òÈsD¶zd®{U\_ó{�íàG/ º›>[á?õd½+:(yÝëÆøpêstíÑsà2îð Wí›×7�ËJœ®·•�'åáú\‘9§˜} üx›80ÄÿîÒó9ó§|¶—õÇUÇš GS¿6mÿ¼ÝGíz-é�™Á¦|:ªi/¨^ÖY™éí»˜¸ÞŸ–×ÿ=/û÷³ÿÍýºÿ׆m’�mÏNÆäÜààWýXmm^5ݯ§û˜>_Ìé×Y¯|^)Ü‚¿õ�âjÆÉàIüâü@­ävÏ_ܿ빗|"ç7 àÍ� ù`ÔVQRˆYE` m4AãÊ´^~cQ�ÿïA�xADÙ?Ñ5`ˆçi=o"�ÈZ<*ø¸�L=¬š{m¼ _²j3Dœús¯¯{O¢Ï@]&¯JCQ÷H·îë}øŒ—èíM6pPT9y:önuRvuê*TpZ)˜HNäT§&`WoHÙÄý¶ºzÖ�%*“�â°±.aªp£,Ñ AÞ¡k„ð]{ O�hÿ#3‰Îµø¢©p¢Ž29rj !Ó)u棩’8NÖ"9ÐàÊÖ~gn™%4$´;@ª[�œÚ"Ë’š4­ÇÚYeªMwkŠ�4Ñ“S‹$%ÄSˆŒï-,1—£”zFÎý¨�U¤‘P‘~È}ʪÐL]:„"Ù@%u®s\M‰•qî{žÇiž{ë�‘ñ¸Z1½�îÎg¾†L<é÷É+U{©ö : ÎBÔvOà·Ø|ö>æÝ\TÍGJ¯“ö�=S.B"aâ w"ž8š šº¢"ÑHÞ3 W—ç=Ÿ…ßÙT2¨^6Wº¹Ÿ=ÃþÙ¢ÑyöýËj¯C%ö�Ñw²ê÷Ùï÷ø XÅ—âÏNª¥iš+1­ÜR¯â.¿~ýÅHÙàΪÿá…ËÕ•oÆ[´ª+éI¸”Ì\rr=â’~çžÕ<ºôOF�+ÝüQ€>d>N}”Ýýá�æ]wžûåRpƒéa�'yñŇúޝÂɓƻYØþ\³O¤&kÊcŸ`‘<Ö™×ÞåÀKÅå/çéíõôæùô)¨,ÉÝKíΤwËLPìq6+ášß5&VïqJw±Â�x}ÒÖù÷èÚCXœl;«3òˆdÝœr6û¿éþk…„|�Ú]=—ˆØÈå>&×u‚²®€6Ö=ñÇݨßÛI�üð#]¿á]01+ÆéŒ/ä¼.½¼¾üë¸ 8—†L0$—0Ö§£~Ð?à7nªpà�ÂiGçƒ�¬qýõ)³dåÿ¾ØÅçEÒšáGÿ+VÇO¥ ÏËà!uÐUI Vn…Gè¯wÁøW¦íx{6ŠW¼ÞVŽ^nôÆžø°ÒØJì„ðÞ¹ÔC�Büæ.jçu6·%8û¾åÞ“øHµ!¹Ë·˜½ë£‹óÄ4öÞBª7‡\Ä—Þüéxtˆïn#|µßM²·У öU é½oÒ ä}.ø3ÝÿPä„nc”O¸”¯V¿ÌÆR?ÈK;žÊëç� µ?}ðr2ü̼mÞ¹€>N�cÓuý±\Uê  ¼ƒÍ¡úø�ZIèï€ø?P+>@\úgËÓåÍö£ªiiÐÀƒù‘„bÀ÷ŒÇP+¬oçBCôJ´)e=âÏ ˆ:Õ¾$¯}øƒ'’¨y?ÚË£ªó•¤¾úõRøh½‘¸¦}P öUÄ댠u.¸½ìz¬Ú µ²k™BMÄÛ2ò1Jºö(‚†«À0èˆVœA�£óA¼Ÿíñßö/”H/Æ!¯™É>Z¡D"õZXºG©»p�1[v¯Ø>k;Tt¯Rº�*ïSh§vkׯ0�µ_Šc±?]y†>N1Q;C†l"°>QË‹êó“ü¿;»F× š !% zÖEÔ åˆ&£¨ÊÙTvmU¢ŠüžªÒ‘•ºà’‘.ÑZÓéècîÙ�S•¢1:¶/ìÉ,š»žÑQ;‚¨¡±qKã×#.Ð;q¥aÉÀ) ˆ¢^Ûܤ ÔCUÚn(,:‘æÜžyö*¯©ø|ðpY—Ï[‘=T“öSê2¢7íP(0+<ê“Ï=ŽjiÑ6í…†ßöj°´sõ'7“%>YÂ]r{�iÙˆó†o%± ÏšÌmÖ/†0|Ø^!Xß, ZzPbeãË8ßÂí3KÕ¡Q•²¦`�MŒÎ�W™P6¼&´}³[� ³ú¶hW7Ï]�¹Í€Z»k¡\u9½*'ãú …_cq[÷»w1ôGmµ®Çñõ¾Üú(—*”W›&ÃF}éû®Ž­RN!S×VY먷¥èÎi¥ayOÒpÝß§}Ü_;œè¥é³·K;þzÆ»ãqA{©½¹ñ{ó³�Qè-ļ~ÇvãHèâMgþ:,†iè7]a;›÷}F(Y@}ÿ·¯ðŠŽ„¹G<÷ä½²¥ë*C>Ã^ì¡”äÅýøÄ´š»Z9�“6Žº]oUÞŽ3o5'—>—d_¯´ÂA _zt‡!.ë�ÈÏo5M“诽—_ SÝ­^YgNÙëöœ_~ÇñxŽëD§÷»JVŽ+cµV¤�vöN%’Ý|z¼C“ #•5!?—&La´ÇŸ§woÆ]øÇã\Ù¥]v¶çù¼À�4«äÚ;Ù’ò«ˆE„þh×úWÑÙúS¶ÛåÔV�N–“‹¢óvì¶ÆåÌ0súlU³“¶g-Þ±úÁ“I¡¯p÷žmokñZhñlá³aî�¯RÅÁÍM{þÎçu°¼�j6Ä _û>&UüÇØ|óPWe‘\o%2OggS@¹Lm¨`%Ábÿÿÿîÿÿÿÿ ÿÿÿîÿÿÿÿÿÿÿÿÞ ¼Ð¿@ûAôµP+ ý½À/ ~Àj#�e¿��-»¬¬ô‡�*$f@¹õ¿h‰‘Û4°¿²:ð`ñé‡+µÖ�­©�7• Ðú6–ò+PSÞe-îÔìÐq·â°üȦµP!¨ÅÌ �x³á8éªæWøZ‰š5$‹”xÞˆÖáeDÌ 5ÒmšL¤_kŽ$\ž Ô¬�¼ç6áw~ÑÇdzÖκK„e- Äa (4N§: ìí9œu¿ ÉgÉL÷*òïôðÆö5NBÓôŽMsâD�õ�eWœ¤F`0U„ˆîÐ(晲j×öžžê¢µ™�Bø£ÄTÏIW´Ö 䤒âiæYcæ°“ÒIýׇ}чL›mÙŽ‡ç~¨DUNœ8œ¡&ÝTYv4–¡¼´åìÓ¸û8Ñ«]9£DV9 ‘•©òÑ=ËÍ5Å‘.œ½3œ¨ŠÖγêÚÐ]ƒlgÑ"ÊSç‘�½æG Ñ?~Ôè-ÍZT¥'r…¨DäÕýû€‚×IÏ-Ñ’!©Eá@c{?×§¿&¥òO+[¸�~¯ À«s)n]Óy’ºfý\r_©lêØ”Ì7o޵ú û. …3rØØ] µ`r›—Åå× >Ê{ÈïÐ ˜_¨ '}î'Õ àj%[€úqíkü÷™Örd(Þ¸ 2ãî< =:k¥Þ" \T¿™ ÑGýø¿¨ þT ä ŒS¸ÏãPù\™ê]`NWä ý4Ô©IŠÐ³ èójº¢ã¥êl͸�Qâή º�ä*¬™kuÞk¢kO™µVÔ¡‡ãznxH¿Æ4��¡´ÒŽ&Ì-dJ—¹;’’ª1U`†ê´®ü ²õ9ùêz¹–H,>©EN!ƒOPÑ,[/q³J8£>•t éšQÔ�’‚Æé «+ ä4;_DMDb&çÚ:…:NÈÙZY÷#…çâàθuÇ^£J6“ã¤vñZÍ2YEH�NÈ$5º _C"GYB›*3{ŸQW±mòM¯$êæ*j­Q›o… �]ÉZKX{rˆ&ªâdÿ‰Fw%Ñ©tjt±£¯‘Ð*W4$J@$M!ìÎÈöÛCÏ´·>YbØoÕÖÉ¡h¨ 0œ¡¸0,v6gtßÿñ•³ç¥ŒÕ7e}h?FÂM):¶™W*ò|š_¬§ä-”à©ÇBÕWt{Jž×àcNÞáeîcÊ\>ªÅ(aô»ç´ÃÙq¨orn3ø`~¯êë=~kåéôµS‰u §n‹‡Jæót/мÆvé·ˆ{È«Û'UyÁcs=`ÎZî"­TÌW·“&áÁÁ½Ê'_È‹»@Ugš¾qñ7Ñ\;˜Êú+ÓQÝaT@凸™ óÂ2aÙ o»ÖO€™S•êüÙÓjno¦T_û-×Òúçj&ú[Ý»«ooÿòîJW#&ª;ú»à)âƒÝâÍ(_Ÿ&æd]ÐÑTÀº•ã÷eüÿD‹¿Þ9g �o 1<ôs&„Å-«Ý{ `éC¼‹ä»­Kô?·ôRr³Ôhv¾ã•Y𬿏<ÄëKˆÔ�1â%®SN¤ª¾ùí·Æ'¼wŠöQ€„„ƒÃvÕ›¨o~þK§l!b¿+æ`'¼WbL¿ôÇôèHhøM˜C¾~³�'•Úïµ¾‡~0ƒy.†Ã‰¼÷Öttü Ý„µŸñˆ{é|MÄ Õ¤—œ&ø–ÿÐtuÀ)÷§‹Ú'D dosp}²·¿Ö˜éwåŠÊ5:VÁ­ç�ï«jHpÒ|ñ« ‰n9ôžyœ°vnuiÔ‰”¹Ü‚a4]I#•|ÑÅíÔnì—”�®ï¹_sžÿ¿ I®_¼ð8([‰�·ã—i„Fæ¼,g©ÒÖ·½�{Ò=BøíEÜCbÖVÞóR¥‰Anמ^^¤>Þob�öc¢8y¥ÓÜØc^™Ú?«f~Ñs¡Ðן{áÎ)Ö n7q•·Üm”6ÕþOÿp ¼¡¿Ð×øB­äÓ÷¤Ÿ¡!�þqkÅ-€»¨¿1ø†EdÈSÚêäzÿ\úði€Õu»2z�+€>,‡ù»9@çß8tU7'kð�añMºIiékL¼£ÿ(3Î -Ö%ë‰è¹çÜšK ü®5Þí¸i R„W*¸RHŠÍ—Z=º6ʤs5Ú9õº'Ú‡˜¹*¦ödƒX:c7rûˆiDI¡½ôH 9€ä÷D€$P‡Ô©¢sÅ wùp$=ÕEÏÝ¡Íàž€àp¢œ¬Ðu/©/*èŒê“sà¥rvÓ5*àl´2Dt”EïÏnÙTpDM”S¥`^:¤e|É|äo¶¸Ó�ÎÏØæŠp˜ù=ðø~‡pT‰½«ô‘Š#ˆÆLgkó ™È¤ÑR‰¦Db`ÚYc_úïë§êãw–ûÕâ­L5OÒP"wM© îY‰¿.ÞïÝxþžJBìPT»>?U¶g#Åd‡NŸGZÛ“�  ²”“ aFVßèQø0ŒtJýb«d„ÿ;c¸gÒ÷�8¨�+«DËV;ž±îV�ªÏ„ƒ©ÞÚ]9£rÄ‹¾¹œê¬;mÖZÔႦÂ�½Ì¯¶Ç�§«s½@jĪ{|bî;²±¹ÀžG~ñ#Ôu�bͽ�+¯Eò€NR™òŸØ=—¶ù{Ÿ»çˆœ>Éwˆ[y5­^;Ù�"·«¶tT7Bƒ]\*“ÏþŸ³\ÿ†B^�§RŨiLl¤éz¶w,aÕÞ=eÙë•U"}iyª—d͹i~Á¯T~ôFçìFE36€Fçê;§¯Äöº Ò|�×PRoÜvi@¿QE¾8<†O"øÏ2z\Ê�6l„͉wz/~ë_ßAº1õ Åo•kW¨ñ}Š ñId¶zt=Ç~9·A¬}I¹³±Rg˜7±�ŽÿtOÉ®ÏÙçûjÊZ•w•ÜÃ�î?=è5íh$æïµ”Õ¦qØœV±?¼{ëy÷‰*ö6üGU•j2özoÓ}à…Ÿ±µ bx¶¤½¿‡ž«Tÿñù>¶b‹âV�[ì=¢ë´~ãd½‹ÉÏ£ydädP¶I&”¾Ýs]ð^±Ÿÿûô³×Bë9‡›Tèÿ“ ðáO’¢,ã}á¾ÉóG8ä×ÁúŸžk>Qù±$§eì,¸ ¿ Š¾ç™¶¾wOE �ú�«Hé®Û«�Wq›ga¬†ÛNU¥âI+CX²ü «ºÄÇk&ìdäÜêV‰ý÷}ºÚý�¨‰ $”¯lã¿P?[ƒ¦-oÍÚw”ƒßáÖŸ1Áç΢€i#%¾ ¼¡?@}€¨•tþîøÐÀj#[ÏÏ6µÝ6ªeL•D*JtÆC ³è¾T^«¥:3áÎìcq·Q²á$´%Ï{ œI'B§Ú7JärÞéµÛmí�SP¤Ì%€ Å]úã÷úg|ü<__/³NFŠÖŒ\‰3$ÝùÊ�i>J‡$÷6N ºÒæìÔ¡_æìÖ–½©éDA2ˆ3 Ô£kÖï« (Øç Guªsv5²µóÑr­E4•Z{ˆZ�¨ÅÙË·iöA®~Æ——(¦kPTéÈÞµÒ'E)V'Eu’”þ~üý§YÂò•ÚýQÌÓ8âDœyw²r\ŠC�¦ñØ`È‘Ù4fR–<ÆxÍãÝLôÄx¥µRA €SØ&\ë:~^¨üq˹ 6-÷U1¡ºß_uO†%‰õû:¸q�Ó 5íY4/ÿGÅ�sö†M÷×kBÿݰýݲLÏßd(;UûC‚gM÷8ÉÂ}(±û•Ù?kPv-Ø%~‚zðòSã‚G’蔞¢¥–SËû�GTU&äQÌß8ã¥û«äÑ÷ â²;¾�ï' ÂæØkžJµ§‹s¢ÚBë1kž…þÓfC`�›g'o“uy… ~8}.Ã…ƒŒýÚµ©i1öŒ´ÉÌüðmXDUØfn�ÑýIçÎâêJ+°Å=§ £ñ¦;s´Ùý²—!+y½mN”o&ZšßÓÅ_Lš=õ%©èª¶šú×)ÉOÅWÙ“¢ÍG™Þª(Î ‡¦Ö—½CžÇàÞ0“Õ è.%PÏÖE}–‚ý€ÑÝt2Š=WKâ�{‹I_p�ŽrÏùY}î9Ó·^›â¨€ý\ЃnnWx¨Á�ÒbKÌâ‰KOâÔA×ü~�™Ú­÷d·=qçÛ~xܸ»XÛG�‰»œ»\Fý¦3Ûï7Ž|˜®ò›¹ÎšQÍàkùTB-YÇ’¾˜R�Öç¢ÝubŸÞuy‹ðÿ•y£e›ûllH[KŽænøƒ¼"ÂÌeºZ¤| ë^ÿ }v=Ø-,öÌï½2Ùñº´nÞýüörÝ¥äâÁ'½š{ƒÛíY¨y8¥ýû¼d�íò°7›ú7@ýcþŠUÿk¯BMo06>È‘çH‘ žË֪Įb?GŒg¯;Ï7¦­&**^ ¼€ßñ‘ð…Úpxò ×�‚/ÔJn`_r{õÀ™Öwá–rÎâ>ûY dæ²2òÚ˜›ZD¤;ÉŠr庱¹þS¸½=!¹?é'hÈ7ΈT@‡ûk»÷¬”‡\¿L*j¼|^ôKÅÁsH•ç*¥³H×cøúŸ©Ó£Ý^™pYæ®…*éíÂK$EkŸM!©9K‘Dƒž%œ£@›5(´vÞq×y¸äع�Z¨ÒÒk*è�ÔYL‡Cî_¡€(´ûÒÄÁéÐ*�N sŸ‰V'Ýs&Ϙè›Â«ÚŽˆ¨ýK?‰årþýÕÇÎLõš¥ Ií�ºäú}¾|Ýiöúç—“GW�~פe×øš·BÍD„t¨Ušž:hâx¤Q»�ÈVv*ªó$P‘Y–<—�_·>�x=#ÙeÞ…èD—a¤³sÿ S zK´`tç¬�Y‹'<�š=Ï™å*º"ŠRò5ŠFöJ)¨¸ÿÏÍ—Ÿ ½Qåx>TvS©…Ñ�ç_½ußøÿù5�<€ŒŽÈì_ÅMÿ<=ú$$û3ÏÆñ¯cM5¼›Âl$ $¾K¶&öèŽF*¤^ Ö�ß½IsQ�ÓÎZ¿-,ïæê½JQU«Ÿ›uFKåOn©zIqšc•Žx�;ó¥B×�M,'øxûŒSY°byp�ñ£.^&ÊÂ$¯‘k¾™Ú9óÅp7ŒÝFœƒÚõkM>­]QstèrD"Dmea|]<Ÿ‹ºÁmýõCpëÍ ˜ç©ßv"«f7à ö‘¨½­úéO ï6š>;NÇ|�úÕä<ãÌ�nÌË^¶¸|&qÓ�¾J‰½·•DV\Í@þNœåt™§ª÷Úà\ú‰‹»sN¾² ³pIÏ\?y›ä$*ÿËÑîà•0ȸ�+XŽ&_¹ùL^5ìG@ ¾�d3ÓžvOþàéÉ®çfÝÚ^)×MØKެ)ÞsŒõìÇF„‘‰�-'¾‡EþÂùþÚw0;ǹ�nâaU£ ¬u{¶ÚšÝƹÑ\ÓO'Üêh¼‰þŽ^‹¹ïn;xí+VÇõïJç-Ôïù˜sö:Ɔaþ÷„‘ê…©æJ•‘+:°Ö/^ {Û£¿Î‚ÿÙ›u±ÞËäø[àS¹ÇaW‚œ:þ¤ WèÛî�¿®qãjõÄ)©Æ)÷X㦃]X¾¼>lùü±ñ”¹VYø×Éïrà…ÑÙ‰®¬¸ëÔk»Þ®ž–í˜[no7à�Veíì…ßX˜þó¶nTY£Ðt™\ÐÁOggS@ÍLm¨`&L[�nÿÿÿñÿÿÿáÿÿÿÒÿÿÿÈÿÿÿ¼|‚¿PíCÄ�j&›Áþ�¨˜ÿ ¦äÆÞ¬›n GÆGêN�ÛcÝ5V²�Þ ‹Ü}«‚¸*kÓÏ©âÖHØ·wÊÄ©þ§@ØñÐn±[ÿD4Ä!.}ËY8 RÅ-½Û¿®¨9G‚Œ sÃõãÒΜºë‘à7…î£uÛ…«úéôß."Ãâ~v¿ẋGM("´¢ÈL}Ô ya­·¿¡‰â¨8BG6IæŒñ޹Ì­™éõàU2›œ«D¢ ôùÐ"j’? ¾Ò’Žj&ªw$0¥« �‹v?©©Â«B…TÙéZT¤ÐGjWÍZ‡8ÃM¯fÁššLß‘{jd•)¨­59<'P¢R^ö©kR{Í3u¥ÎÔ**‘,;Á£Z9ÜE$Š>²s 4ë%)gÅÉç"©";ÈÖo?0¶âeŸ³u ­ ä,ì|9hÌRdð«W"gq Iª’wíÎá÷O™ã|�?ä�Ûò亟EKG=²ßÝ¢ª:�§2·‚Jõ ¡. Rd;>Í)¾„â<¡‚Ÿ“Ïe´‚IሠÖaví±ä~ÓÆÄÉ™2ÙzóüÃý.e:¢’z¾>¿*ùøV?kÏoJÓr_ƒqì¢ÛÚ›2^ùf¾L~þÓLÍúB‘9›<ÄîѶ‚ˬœºÜz'êR¯åyÞ)�i£üû¢.’v»yæª~ ¨{ˆø¿[.•»º‡m2ëæg ýW÷Í1 ÚFÓ4!å"Ï\šÚ÷À.1O©ç—ÑÔóÿþŸ)<>­_ùZêÄ5ü 9ùä\1'•ø™ÂYªÅ:kà‹.ÖÆ³0Å+�¯vÀi %�x'õ,s¾±éâ ?K0±\Õ~øë?‰Ž†YQÕ2¶±¥fR×-fv £»{ã?;•° k‰I^~{†S«‘ü ûó³­=*mµÛfä¡Gõ ëŒÁYµQkÇ—…vG„*öb‚dƒ=-d \ ®R‚X×+~‚/½ÚìÚçN@›¼—«~r…T}ÒŸ×ÆÇ=©ër€ôË}�– úˆµLvÎ4þôºn¤i½òéX`Æìc�¹ÅgCö‡�å—ô߲ÁYÝÎàåÀâáPQ¤Ëç—ž9¶ß· ÃDŸ“·(‹Ø©èûruŒÛC°_R Š¿£‰æ~=¯øzÖ™MÛ3)b¡YïÃ}¸(:gjóì¾�'`N–é[ ,¼ÑâñºÎøäß5çåÛ¯¾úÿ²Ÿ‘»»³ü‚c³_àþ«nG€€ ^:|Á¿Ðû øƒšI¨ð©ÿõåjJ`ȧOõÉ�UÞ û˜ »ÞòÜú‘ ½Ê¸U+àûˆÃAnªIô¢ ¿óy× òW—Ñû� DÏ×*rŒVÐÃ.'ŠÉt>”z~¡#ZÖ³~DAÜVD¼v:qj¼b†Zg¨è¯]Üó-5*ª_žÖl ¦ç]É“sE*A-$c/©EäçïHëùs`~:Þ(N E’@ ™‚X@ÞÁ{ ­hH˰íE‘êd¡U×r¨Cûï›ãŠmÍÉ—t�®:ŽÔhOžq¾F¶ºêU‰eô4�‡—fÄ,F‡ëK¶<œ!žËäæ5SžR¼Eõ“¨AÖÉÄÉ5н½º·Þ3Ãé™×>ЍI8”Ýt÷Ž#�d®ùT2DôäNó¸e“P¡é*;òN«R�ãÔ$#ömæiÑ]ZXøÔ�ØSjÐB§duDÚif^5éU³u�»djjg$•@¦3 ‰&IíÌ?k½µ@Ó1Ó²4(*SILgæÖ;ZY¨Õ F†œ ‡ÒÇu¾”ô›l|É Uí„0zÀÝŸeøžÑ'Ge&n|­òyªc™Ã÷úw»Ë‘\èaHîq˜ëÏéØf4•ët½�‡ã„‘ £Êõ^U÷òh Bf]'ÎgJXï-o*2ǪKXkÒÄ�ÚæßÛ2̆û„ßÅæ«S_&òðPlæÔºû¸ú ~ñÏEóî×é_#ºˆ�äÖeïÌü†LšØÞsæzȲÌår^®:_C·[ª7úñ?zàia­ÊigáÁ@ã¢éÓ|™  *Û\ºOÑ´Û�·›ëW>â‚NG²c‹eáö57},¦Ï_“æØOboǾnO“ú¼kÝ�ý™áwqͺó~®cä15�R¤Õî/ÿ£^ѹ÷Ò¯g ÅHÂ3hŽ‘Úæ]Þð¼•íO ï¹e[Ûžñ‚ý4 ã^Κ«©,ò„ýý”°Êwë?«J¤�šŸ>VZ^ìšdˆù DÓSJðÚ/wéÇ8‘(ê÷!²ö^×ÜŠn²<:KòD¼ß⦉ý:?Æï«&‰òÎP/èï·#‚÷c5·=8¶ÎÁ.0Lzî.æ+ªºö8T\Ã{ˆ“ä#L×NO·E q qÃñè‡ëÞÖoÍ\¹›÷³Í‡÷·Ï£']%©UOÙD[·ömßÝæÍ\'ú½V•Û\ŸäÌc&}{_lëÉEsÌÞÒõ9ìeîâÿñø±ÇŠ4~Û;Óº*“ƒVh±š¹aòDâû 1¬òñMë)¹~yžŒÊþÐ×¶Vmž}þ¡ÍðQgüè˾œn:ÇS£åÈ_¦�³½ýˆ1³8¼Švôy1ÔРdécŽl©q4ßh9�h4è„Óu-‚`�ø@SR“£ç†O'—è¨ߦõoÕˆŒgXŸ­¡uåº5Ò¹ÝÓ[žüUÏj¢Ê`Opº\q‰ÒD€r  cž]ol듈;RÁŽskÊÍ&~›ù–ïv¡¡µž2xädý>ZãQתj<�Þ>jvœgÁô‰ðΙ~Ëß‹R63ËÒq"lIVñ’dlk­ê"S´û‘ÅV¦B>ñ¡‡>®yüjܯþh’ye¡ 9Å5[¼Ê¨ÖédïíæˆTSù»^Á‚¿„¹ß´„¼»ònáípßuä/ÍìÞ ˜-å¿w<½¯ç¡áÑjrÖ‰öC«‹šV‹kQ€óëÔ6ôÛK¾H®FŹ^ °p‚.)‚‹òuVÊ“ìÎä6ȸ•IÑ΀Í`�¯[9ÂoG+i ¶åçâ.Ô„ö79BøhÉH øp©U™ÒV臾¿c×Îí@—/åšVÎÃ9ùýÞ_ryx¯L¼:U"!ýÝælc~'1>©è«ýkƒJí‚j’w}üz×åN»/Vð<îOXéê³-!ñJ¬[Ýþ,á�£óNò‰~~°÷cÓ`U|�ÏÒîÅhWIQ|…é5é8“B¼c;ƒs"u-Âÿ‡�%�•å˜K9ó­ãó«´ {/ûÙl$ø-ø¥ªÄCXÁËÍÞëáP&”Óý’ÝD¢e€/#'IU>»’GtÜŸ �M¶²Në°æ2î’KžIz^ýÊ�Ë\^t…ˆ8 é–ž’€I‘Þ£c©GØ¿¨ûwf×àu_«pÿ6ZÉÝ6©4óQÙwÈf.Z|¡ÍaÕ ø��Ã'ü­>ü‡&—]½ÍŽZ¥ûï<Å÷å&¾³oîéïõºÑ»‹Í„ulf²n‹�Z‘í+í:笛7•ßAÑ"�ÛVr¨õ6ˆÌÔúŠg‹8bŠ3"xFù»ëÈÆGE‘XZ#¨7ITs¼!5ÿ õ2$Ô ‘ºm#Q�$̈—Z‡ˆÄ©§7S¡ôªœg™*pPö=§V‚lBÐĺén-?É@ˆS³FBE„†ÝY''ðŒëZúµ$ÒïЭdRÅóÈ郴a¿ï«M: ¨N+‡j@M§2ñäñ¡�náqD?¶ïÚHuêsÈàxµ »‡�9‚Þ9«VÖ„LР¦ê)/©ÇÇþtÖçé—ÀšEÉ%¤Fuœj�»~S%œY¯è¬S›�Zç¤^çk3dÕ &¤îÙµÓ˹“zék×õÕWKe×ÈDH×DPŽAg+që@‘t뽚`Ÿg3¨ÛIß4Cf ŠÌ;¡ÙÇ À0ÃS)cXˆ;z‡t©²¸Ú Ö`4?ÿäøs{>ùM&@Aö§Y*0ÉnN¿x‡uu‘2=óX\ï2ð†ÇwØ$81qÖÛY) Ùã�ýNsºþµeÝ;ùäüS©Ÿ>R´—ôÀÕ¹�ÞoñAÉ}?÷±>’W_§º|ø$ë¼u6R÷êI×¢G­§~J}úRïXo4ÓÍŠšFØ$‘M‚ÃÝÿEUE­8SX�§¦œ¼¿7”®äW—´“d^ΰé-ŒË|£æ1s˜MT‘NÃ4¡o¹®‘Ýîx '­ê�óÛâãü5>iuÔœ’÷zvÖ–�ú¡ŒÓ_”ÐÀ»vs4×ÉíïR?¢ìEe}•‹Å½ç:“©j¡.óý8zò–sTRÞÍ,Š `S]ЩyßnÙWUÕòU¨þiü€ÀãÑ4nàx|˜øM®0²n/½dgÛÕ…½qA•] >øSሴŒ+PÚ'±«âAe6®œ·n›®~Ž˜ýŸ •–°Ã#Bã(kb-«ýˆàÉ­)3¡Ì?5^$åÝ•tAcrxlèœ/Ùå�§ Ί  @ÏÔø…õzhUh‚èÊÕþ’ ‡!è¤È}×*Lòú’�ªÌñ>Zë¹÷®Qý×1eåä¡wýù±Œ�üôn{ë²W§RÉèŠjs½h¨C·yg_Š"JH“O¥N‘…©ÒZ�qôP�N'ž(ˆ @ì'ûCæ�|Lõš’ªòËC‡ŠHÕÛÔ)RS%r�Óü§HšNT…R¥†�§ OÈ\5t®dÄ Ž3�¢ÉKDh­¬f+²jwêôF"Óy ’iŽ„Œ˜ª#8ÉÌ:Óuîø µJÑúoËdîäAÞ @F €¤$@˜@[æ[œZÛ‰“‰ŽôÍ»o0MÛ•–ܧ‡ŸåT•ƒˆNbàC|XåÖ.á²;ñͶÉé®ÑdóYýì€'M,hO™õÍ�åVŽØÜ·à;¥C7J;2¬ÙÏÑfµ“ñ”Ü ^kÛ}˜µþ_1E¼«Ú—²êÛóíú1×=¢zU=>H¹ÌÑüÿV‰è±Æûä_’z:ÏÞä5”ÞC¿±ã«Ó´sÌ¿‹^[¬-æI–šw <‰j|²Í¡­$ÿ¬…š„?ðˆöþA“+ÄhÎÞÈ2z´ÿ­ˆðÜ¡–Ëo¯p$·]5 ÇÜŽ ¡*äÞ ÇwìŸÅ¿Îñ/ͪ¬‹$Ú’Ï ¤ò�”ZÅ¥R�~$yÒƒ:ôÿëÏ¥Ž{k¥È%ˆ…®Ýó¬]¾*·ãÚL†gÁp[ OÈÕ¨G׳„ÒuiFÎíÎæÛXžF•cùj©¤–3$I6 ¤#­¯·˜aÂx- ©çg½´ÙŒpóò66Ä8»g�"\›É?.7£¶éJîÚEùâ�G­RŸ†Aç#U5!g�Œ�ú*“T–™DòmÁ©!žÈžO€› ¢�2ßC‘©½î�n>žOãRЙµ¢Ti ötâè„jw@àÔÌã”ÙÌÃ׿ãy?_£hMfOZI:÷¬}uÉÊobû§Y¤ûØ2CP*S�€?ºa'kÕк×Õ 3 ÍÈCéë±ÇiáÄw7Éûu2´z-O>È;â’Êei#ü¾zxzÃPzo°‘¦+ÓÓ9ܾ•IßãWÙŸ Ýh ½¥ 4–#±qÇmˆy�ûÿà +7©Z’ÿ½8„’®Þü¦âáïÌnE’—õ»Â÷áý1Êþ ³{ =¯uGÒvx—æk,Î w‹‡�þ²KçóùGó»M–ô©2û–ÿgÀsAÓÖ¤óh¿O“¯‡¿ÞC­c:üuÓû´.-žã{]ÍÂJ>³OíêNý÷ð÷{ósH䦂È{Ö×’;ê^ûÕ1dÈuÐ\c·ßûeÜ5)ƽEhl:K¢çëÍάt¹!ήžz™�1kÞ/÷r™«à�Þ®ÿ¶@¼w ¾¢ß¾ñÀ+,e�øîEž û¸²Ü�üæºÃÿt8«.b&E®Æ4G‘9_w±øX{ãÔãï³¾ˆ™Œ«>ŽÔ€!âÊÆ“‰ /CMe“\¶ß9‹ue k‚Éïÿô oÖ¤Ãé“”*§„ʼn¤ùM:Ãu²þ€’ùO×xó_&¥aAáCnòÕÍ1sÉIýF·Ÿn•ô!ÔaK¿Ð¸Ÿ½Õ�Ó«&_ù“ç’•cg wÞ¯3Ø”3¹o£6mÌK ÝøÛQ~ò¡› —ûîïc¸«\�`<»Tíc#+Ϋêù(„±�ˆjäØKOh®¬›ŸÞöm!Æ"é~(q-{žçõ­¿í%·�œ)Ü2ü—�wSZï(l>Æ3н­W¿`nèênë¿ÿ~} ó¾­àÿ¦ã�”þi|€Í¡·ðšŒßîPà4¹B9lëó)š ùö_¡Õh©ìháëïnÒ`€.¿k ³¡•\rGëSÌoÎE¼óÃUó‘{^à Lô+^)º¸�ÞS�'U¥D+jÞæ{[«{Ïth¢%ˆ§é¾ E‘[ÿþê�mr ‚ˆàÛ·ÅA(ŸÓÙ× rÊ„¬¥«‡ß8Æ�,™gÅ'¹w…¢cHu “€è©à$ão i-j+Þ¬&=h™"Õ?ªý)sø™γêl ÄäõCŒâg„Ám-#k¦:R×}£rIJÊvÄkFk¤4+HKìÅLÍVĉ¾`—á¦ݱ¯ÎªU2it�W^ÃP÷‹D ´3芜ݯSQ]­hC“Am•¾IÎÐü„Jæê„¬:iÑì d¥FCÍŽ>ˆÔZ[…ÎÐB‚Ãé ð"ME ÈÄé9f•2"©D«%fPf#!#I¯UÓà.ÎI)Ï8›…?ºm½ÿ¯3 vS ö_¤Ï[½iÕ3„éWŠ(ì}¼¬mýáÜA¸ VÿºÓi&�w}$5Î¥©Òâ˜îR_*@ú5£·ÌkTÛŽÒžÂ)W™mcÏüâ’À®³)·ùåM=ùܘK¾” u7kl†9xùA5¿D™ì7WnÀsó=×ÞTØ¿û3ž6‡“ßoröùû{µDç7Ãöôö87ðEîú”/r0Œº’ °ðÓd?'Nç©ÒžÛ¹ÿ ûµú·ºö"_˧"ßYšå7cm_áø úfÙ”§¹imHõdr—ýܾ¯© ‰O¬*ÂJL)îy}m+¼ú>ûd ®ë€tQ/í7Wó|Ø gÂü‚Ôä°)¹©¡·}Éf–÷íW.Aêô@§�S·Ïk¥�!Wí7·`\k[´zr-×-÷ÝʽÝß…\ë0±Ùz£›:×ãÖ*çQÛ$�3˜^C<%�ÉS?·ºüø›z5Ѓ-t¬M�”¶œD& 7 &¿¾$kV?�'2¯ä†ÿ.sàI"ìeRXù1â¯êiÒ/ëN†ÆúìUU9Æ—B%0ÍB—a£|ø6Ó£•4txµ~ƒ…kžÜwe…“Ê´šé±§Š¸ÅðÛÄÃòuL æº¼Znªj×>žÍl[Ó­ÝíEWs÷ƒ±”8€Ø!¨Zç† -§£ü"ô¦ùíd1°âeRA”á7œ¹í«Èd;ϦjŸ<;ïë™j'95{¾îx^È‹@wÆì¸´ôå±�îÀ%~ZüÄ ÚK�ÿ3š„ßô¶×Ë€Ðx…Af\�)ã,ßùC¯¨ðÚÑï(Äɬ ãã]“#»é�|ÏÈuÝNk÷ãlýœ¬ŠG=�W‹kêÂÛ¢¨ §ÜTƒž”w”Ñ!_£¨7¹KãÝû¡ÊHhÝcËvžx“ÂÛ�-�“ž§€*í¥òg9#¬3}$!•¢ÞX à!f‡ŠC•”©µ˜áë`8•�E@´)ˆ:Hœ¹(ÉçsaþÝaχ:Pkˆ7‘yÆ'‰ôtÿQ+Òósåî¶$çÔ¥ö“±Ïõ¡!ê8]ç)DSS>§R³÷¤æ�SÍ©)+Ê*o�/Ǭù,^WN 'âÌÍÊp`ÙCP%ÔÁ!p¹¯¢õ$âý×ÚR£©sm=tÇÉñ¹ Tù€€"uB©‡JÕ#�”Ú•†oZuÏ*™‰ÈSÁ �êÖ ±‘Qwçe·}S) 5MÀqJ8öºvÖyÎd¥É˜¿zÕ6ÈѳUI~ú D.çß+oú¹%™¨£g~:#¢"¸D'ÁaÔl(þY|¢Í¡µðšŒßìÌþþ™i¼BŽÖí�( ùì-ªÚ‹(-ùe&Þ$¥¶*¢ÛrOºÖ@ÜEá|ø‹Åìlo³V¸í4S¸6Tõ¾¢}VšJ ª‹„DíEƒ–^<ŠæQÈ£IÓ�¢�ªN¶‹ÎÛñ×QÔGçb4(±Ž ¨V:XÆñ«×çºÏ¾huÿ²Á ²Æ1[vÐÇ�—’€"Š# B•Jç�~Ä{ÙÕip€ÙD €®²›'ŠÈ‡k8çF"u¦�Ÿœ›£×ŠjâSÒT‰9hdMÍDÈKGügÔôë‹ùóhö_µµF…¼-{­ÅTÐÛ”N©ì}]¸KóñÌß|é ûBï Euè\"º&"¯Taï «¢@;BAÔãwÍóÈšNwHׄV8¢2ÔО¿º‹gýy¼uÕ»%š|BwßÌèÔç$@F”ÍXZÛÁ^bÞµÝ�¼|WÎ,z»�À¯Õ,Ãv5kh>·Ù}c±Ó©÷£œSÍvú1Ì�x&½mvotjÙ ×Mͦ±P¾¹8·ô5ðQéÁˆ}*>R®Y݃߃¡qÿð{ÌëöµM(2=“+–ž]eWãÙªDyñ�›ù?¼]®9×kÆKûå´jåžã“X�®�C#m’ÜÑVóž /ïØòYCLÇ{A@•oý/«ø_¾y¿³ âuìvGÜ{ZÍ•RŠU.,8÷²·³‰Xêj­4 B±9�Œ6�¤Æ÷* þf=6�§jprWE ó埲ý宇ü¿Ž38^�YÔ|¶ÍŽõ‰Pbÿnf'uoÍg ,ñ•ѹ5mÙ§ž9À' úã/oþ8ws;Òè6ï‚ÿªße[Æ}[× óŸ@¢¾,ª�©{ú%Æ£ÛR†¸Ás{Y«uže”áŒ� ¶dïÛð¾ã4ÌBI!ÏZQCkkpUM ~0ÍD´YÈÕË:+…NgwÅ%“ªùfêò³I¤¦�Ú¾Òæg]U��0Ÿá ß‹Oý;C¦:jOT£f”ÖBCïæUê$¦@øvõK�ÿaoJ¢“Ò›F,Á,>öºjò^NÔo”`z×A\ç’ls@Ô{¸¥›lž�‹ß‘ž[àE©�û¯¿Û)>â‘4V;�ì.àWÐun, úˆŠw&�µXÁ·=*Ãr¿ý[Ú¼¼°ÖVAÅ¢®�À+OggS@õLm¨`(}ÌFuÿÿÿ´ÿÿÿØÿÿÿÍÿÿÿÏÿÿÿ¾ZüÀ¿aÕø�§Æùf½ø�WÈbû¥Õµ\oþŸ¢© òSÉzü`¬<9ýAU†¥˜ :U‘#`èïüç—bÒ¥~ê\c€‰þ¤„œÎ£”«BÔHøË¸ÿ¾Æk]"ðméu¿»µæ˜I-ÅÔÖ@úq;UI¿4¡ûÈU£‰[æڊSÈH7ù^­!tò  5èß x„¡6TÙiUÈ5áÏY[Ó 2 *Ô¨­•4]§y“ѽ�“k‚Þ‹úœ†n‡)¾Š’Ü·§¨{σDK글ì†Q“� UPн»³«épdV¾@^^â´¬=ˆÖB›ˆ¹NÚÀC™‡80; ÝqQµE�“ºs}Œo—_~“‡q®{]gÍbasV¶§T�$R#º§\ý”ÚÌ’äçóh•8¹#8**@×ר‰çdg§°×ØËÚ 0hT^÷·{Í„"0ƒÞ"T:h�$C €ò¨8˜Þ²›ë©¡žGXkfÿAS§lW­BfA{å(ÜÜd.³eÓÆmáþ0{õŠ™§�åÛcÄö¾†{Ô3½¼S³M'ÛÈœa>'[d³ÁFKäí¢×¯ u y“k`äð®â7›ø¨h®t9ÌþL�¤É:° r-ýA·8zUknÝ(9Ú cl&&d~Ý¿#§ïånéðTjšö^Ñù4r1îÞ_-G%}=ÛÝ»ÒVÐÏ¿rUÊÇq¿ÿÏÝCæ¼!á4ÎWC6VU@q51Þ[÷QýÙ�áæW4wÈ�ácšævÿ^¡þ¹…ú62ï •#ƒ¥´Óvž.± þ+ƨk–|µßsßþÿÁåÝ0‡ÊÎm•ûT„^¨¦Œ'ùÔåS!–qµ¸ßù·Ðö­yyn‘�æ?ÿÅ›ý�[KY¾Ø§ò &ù‚YkpÊ‹ §Œ‚Æølý�s@Uæÿ²Ë›Wi3o»uÁyÃIwdÏ á b‚˜KûÇÝØÈù 1(±Ûz,cÕ§~|u‡,–Ê/[�ƒš­H]§Ðm(Zè—¬{}5ñ´<)ø�²Š?D=ì³…øKà 6ÆPé9—Ûýïë(¬tß6—âßýX4},¤&Ý�ª[*ðÞ9|á¿Põþ ¦$Óø€›Cùƒˆ?)4ÞÀ¨áÍýÛhq¶†Ÿe>"°saþ(¨Á&ûëv�øU‚»A]F¶N5~xR©or·èϨëþæôW®©r8HÏWœ“4ƒ£G!ž å×™]çug«OC4‰ó–vëñ©„œêŸ*¢Î´! íAÅÐYA ÿÏhž. e*¨�U�¥ûñmöçô#ehAÉSj @f¢¢Ç Gæì¨$…f„û¼¤HøÔ4øoÕKë|­•éBe"'¾\Ñ“Yy¼¯Z÷êzq¹"�r ý>(B¨-Ñn­¼‰hö¬“\ó7Õqº® ¡ÔÙäP©Ò­ìÊ+­½V =jºu¨ÑY[–¯) Jj­UÐÀ!SÕ�yY-ŸlË”°Ü÷3Ú­„ÌTÙ+áä“ó¥D0ƒv­gg’JísPHÕèF¨UÂ<½_åråý霅kæÅ«è1èëô&®„<ïªgâùŒG×zv²†ä!”%Qã�$á²�`dõ�ÿ_ÂL•û_q›?£Ë&þÞ+øàÞ)?'_%§gêÔÿ ÎÅ]®\ÿb+°Pº²¾èDXi%¿­7o1{f®iÎêà~”B^ÏÃ[äÅÁÃŽ!@�8®·õüšn�vØës9ðå4�+òÒÖ®®Õ_éŠ~ ®�¶ÅÒ�˜Æ±®eçz0lfè¤Ïß vÐOïÏÊó­H"AO×îäßµœïÌ?E#Oz㨶yX'Œîímô4ÌL¥i£‡ÕÏÒ>ÀÓÃwyÙ,¿ÂÃs·xV4¬N1vÆSøÿ/øÁ)x02ªv3#S@~ÓÑ©ªÛ¤Zåàwù¯œøò–ËAN7JÞõ«+âÔ�›ßŸôò¯Ì5pÿ³—ß‘s@îb÷öobjWø`TÝfµa“Ní d�0OÝ“ÚyåPž=M^¿'íO¦ƒ>Í­ãßwÛØ×≋—êS2Žî`7<Ì­ºëã҅_0mbkqÔ;É{&~…‹ä· ÿ7TS&Ìj Þš½ØôPã·¹7Õ™ÍßìwJÚâ–VýèNË©œjýªdßjX­ý}ïÛ~uo¼Ë»Bª?->2Qâ ¦»ý ùã®{¬á 2Û裶CcÏ x/Ý–.üê”w—ÞØ~9Ϲü|쓹÷Û¢4–Ë»qÆv¶Ì�ãf!­¹–»úS¼«¬Þ˜ØÞ‡¿Èt¼­á)ƒÕömó1Ÿ_ü:ùï´ï5ñ]…ê»ÈŸ¬Ÿx@.�a@uÊûEùj>:|Á¿Ðû‡ŠÿRh’Zü– Ú ¢ˆš<€éKŽM·îèKþúUªù‡8)êhõß´ªhÚ†¬“TO¹µUƒB[-€þaôÙSm}R^M‚� -½ŠÒÆ–¾\UY’lÕSWÑØˆÊ\sp†â5²+G×T½î�>»z…@· ü} ˆ�ThWŠÚ©�în™‡uFu襪ÞÉu|+Y¬p<>óø,�àÀt4 57S©ý3hdMú¬d‡v  u^¿!žyk§“½V–‰àt÷Y;ž:¢‰®JˆÆY›TœXG ]÷—•‰ÅªÕßSÅ5VÖÌz‡643DúÙc®ÌБªGR07^¡!Ujò³¬4•î!¤ƒ’µj÷”"ª<)@ôZé¦67FRCµ¶:CÊ93ß»¦’•�æ‘l«¯Ï§Zü#>¿¦t‚ •˜ê™iÔZDV8PŽÈT[´+ûž!×ü%-CM¼N ²?  @S°i§½£G¢[ù‘“¸âîÍ•êXÏ*Þ¬œ(Á8ç4ôn¶Q}<„T™‘;‰½õTƒ�Ä”jÅõ€~4fUƒd¿,šP­Ñ�)™E<­d\ÒÏ�‡_MÏÚ¿¡ÇÒ_%_¤ÛÆ‘B²ø)Ì~‚ÿg˜³yƒÈ7îœ,8„¥û|úᢜí×Âߤõ» pÝš\>}“Ç– ¼Óéñ¤¤·0B*3Ó[{óž£S«£ÛµfS¢ÉiœÅ'«fóJ=.ß�ÍT7ˆ«Kn¢@-O²ë÷hb0ÌéŸõøÙk£¯ZéÎq-o4 _Z]®˜¦õ*¶ûzskü¦Â™xY5 ÕèÁB†ÅbWûÞóüü§Oµ[п”z·#gĺ]~�ZÛéòYºöVVÒÍ’Ö•Á•ã÷?§§›çÊu“€Çúpœ't#äùSƒV„M5ÞÓÄþÃݘõ®”ŒwÒ´vþáÿŸýðñ"–¼Oºý�_n$®yý#«T{+�Xt¥—xÓ¯­*—¤Ï÷ûžõô0æ-øßíÛU›¸¡xµ),þ¥ ì¿¥NõMH%iTJùf+ªÏt>ò°¬GœéóBÅŸkÕxî¸Ù•Y4t(„üMô ó¼i#™¤‹ª5·y@ñÕsoþõ ƒÁN½ËŸÕ"댱ð}œ.»¾gþùãV.¾I¼ÃÍaÎð5ÅMãms¾€?h¼BŽínVè}g|¾i½ ¢…8þ×ì ÜÈÁÔ;¼³�Ð=ïÙ‡óî^¥.ã~w©ùk.Eñäøó•¤êJëÑ,$õõñ÷÷ ÃÍ®Ôr>¾î*rk™$Ç]jÔ[eÊ]´þø¤â¼‡è9¯sn$;…„8—^’÷r®Í#oÚwÊè¨Ç²�$�D7$£ëºÖΪ{Fhd盨{�ΩGÖT@�ªs;DÊ\_eçéFE¨¥6Ôh|úýh6‡‹IäÛYªÂQ¦¢÷¥­òYµçJJuÚ!AAii½‘WQ²ˆ«ç<¨ º§Siœ�!²¾Ýsdtm QD5º�Âq4*�¢sÆé d·¿?{«SÌ3£ü��@3O:H¨REE÷ŠF‹|ÖbP´«HWrnèÜ«rAJíÃUÁAu‚3j·"úä±oóKAœ*ðä©ýôÃ@þÑ}̈U’iÿ ` @Im‰å9vXR44W]·¨î.§u þÚÁ›¬ùrê7Á¯2b�=Å>ò ÍÅsHY®ñ¬@u¡í½õŸ3'éˆtÙž¹ÐøþP+u†}Ï'w�W™DšÏ®OÎoó¬> Q§±´«ªšÖ>¼P·§z+ªéë{Õÿ:1ƒäõ6?«Ñu£à¡1ó§&2sª¼k"cy}þ�£YÜàM6' ”cÌj)Z\Næ>¿Kx$ˆ·öËVÉ÷mv È5.ÚÔ¤2kÈèä•p¯›÷Ï…³»ˆj þ̼DÔþá[çõÜtk—Ãy~úVee2g�—a>]ªfzÊÿÞXæÊ^˜ë982ÜkTDZæëÎÇ$—I�½ÿBuÚJøkO{|âcI‹›~‰OĶütÛQÅ/<¦;‘…DßcÉýoðûéoEÖ}œ4BF'ˆT=ÄÏ^çE>üÍ•*KB)éªË•²§èj#áÿӎуsæ¨ÒoNôoì¥~£Ö±=U؉,µõ½þ½©äŸ3ôÞ+b0Ýs7-×W¼“æ`ÿN¬^&¿ 9k¿W4’–®m–¢Ó´Ø/óÉ®gí•{uˆ××a ê~E&dü"6‡Ž±zå\ ©ö×)5^j¼?v¼Õv\nA⦟%«S"PÄW†�©¶&ÓÓü÷‰qÿ—þ”idZ¶¾h’cÇkÀÙßïäÏV€ö0žèýw ¢0p~]z.Àà˜gwû�(E¡ƒÁÂLµáÖІ·¥ÐãOækuê߉\ýGø¼wV²âúž:ü¿¡µ�ÿ Éhñÿ†U�þ˜š<ÀX{ï�òsìQ?´ÒÖw˜PVû/ÒÉô9Çålf-’^oK.Þ7§.ky®·~EÉòaM„¨EØÜÒµäè˜SƒƒG-C=þàþÒôÙÑ5ëI­¾2£ ôùãâáeRµj„RV³-î#›¿T¡›E3rè\òt�Ö²²˜‡–)Ì<¸J0‘©1�‡ÊïùÅL‘Œˆ&˜œJ À![ôèæ„­ât�N ??RÖÇäFhdV£Æ‚P7EC“G‘ŽYœ�Bk�Áz(gj½‹ÖY©Ò¤‡â›8šûÃ(Ù?J’t´LGÉÆY%»•f‰e>3y»óåñåãži�Ò›� áÕ“lN­®D8-5µR+{°NÓ�¥0Ž�Ÿõã¹ì¿8M•z9¡§³<")`¯T‰c„öþÜÑMºªˆ%¹õF_ø‚Ÿbyj’„¹-v=›�Uë„'ÉF­:�¤ÏÜýí=¯)ت ïÃH�šê§ôôÚ§³”IÄÙ<é!«Æ>z-F?7èøÚ÷?E.$c¢ÖÐó‘ùi[Ïæ!»Ï«ç“?u•œc‡ŒÄïžT@ÁW=|OggS@ Lm¨`)£Õ!èÿÿÿ»ÿÿÿÑÿÿÿ×ÿÿÿÝÿÿÿá>:ü€ â¥ÁÔ”Œ?ôo }€Ðä|ÛánÝàTÏjR?^]M¡=óOÇ´G�‘Aö†ŠÐz9ôû 1çCÎW…åé @EÕ¤$Qç²ÐHhQCvÑn£¶òEÖ× ¯S û‡ÖL•­*;"®ˆœæýg¥c#£tUkˆ÷¢„@q}Hª4$¢= ©ˆ O�©fmèÔ†”œ+áTGqæ3é8:;ŽBfjÏé/ Ù'×Ô?û_‹ôáD<øÈ×8ö¯ºG9ÖǯߡQL’5j°·ŒhÐx©“èjéì³Ï1ŸOo´  -UÊ|-:59+�¤�ÔIÞ¹8Z‘–âãÔ¤n¦Kí¤©ìhQBŒ¯ÔšH§èNkSh›R°J’G�®Ê9�šÿ}âž÷´Y¸Ÿ+®~N–ˆÄY¿lhÑ!™¦„0“_ó”˜*B%鳡›k•"a†ÞOÕ|¹¶ßú!ÿU‘UàÕ&РŠ&P†Ëäs{}KÄ÷ò7Sücyê©5C5²Wa¹8ÆoÇe‰ ][v+®¡n=û*ܨ2G-OêX§ó¾Õh£Ø?”ukÖR±±ËQ~m—J]¸½ÝŽ•Ÿws³�JÀ<ïò?ܽÐ]7Ð;´MjÉ� ¥^ø~9¼aÆøM:‹oü*>À?)4^!ªZmÖ†îòuKûOoæ¡`´ï?ÒÅO]�!çÚÏè²Â¨è×�|ç:�;úøgJÙDFiIÍ™Ëm :•¢…´<ôÅT-UCÅ<½ô ²½Öt©Ÿ¢fL[•–J`Ø?r†ÜÅ¡fýNçHŠÈ…ÖÀQ§HfMš³˜µâ°4áGŠ<óW¬¾ˆû"Ü%!d9MB¸’€‚”ªórï¯óG­µ¼=ÉéÇf\˳xlW´û»Ìg¦F�'ip_‡ ˜�Ä¡¼­ü4¥tkjJ@ÙúÞ5 ¼œ�1^ö8‚¸Î@(rmº�¤ô1ËÏg¢ÝEÞ뮄T9;{ª—¨Ë×(IRóéyM!v ¨ès¹ŽÔÈ¡"s×8@¨ª *ßÑUœîD*IaÌZ³®5¨<±,5îS±ŸrÔ!¸G ´+rT�Ö˜y¯s‰Ð^îy¦ê“ƒ•LWÃÜÝ>³Ý�I¨*PKIDÓéöù©7œ=©÷5Ë Þ"ýrêíp×i6Æ ¡½Ú5’îðòvó­uoõrãJåÝ“óua4ž7[-¡Ç U.lO<ÿý^èá-Ž�ù 9÷kïÇ“L}X‘î²3àL1í&‡T$#¢Š>NäkZ:]%�-ܼ°£‹åÔ[ƒÄ,ïßɺ·„ÔÔµt¾eíéàÐ.½’#Ô•áGßTzr½–¬ÌŽ�O‚}r×½½Lä+£úæBð¾ìi§nt®ÛYo•pºf(—Ú“Ðvç’šÆó.•ݤýz.÷ß$Ѱø¤ÿüQl¹¼·Ä´ÉÞ5šÓëÚŒ��¥ÛPÏøÌ¢€/¼EKöJ­Zýlp{‘‡¸D¥TÍp¹‹xù6>i¬¸œè\‡­¸I[M_ò{{rº–w8Lýì�¸Óÿm+³Þ¼úýœi%/”Ц`»<ãâp⺦ø ­.·ÓœA‡z­aæsºR·óq¶;’Ç{R®çã#© ¡ÛÏ7eKZßÛi¸�BöZ’õÎÔ3yêŽÕvËýßÀ ßBc£'xN? ·~Ì1»ºÃ\¿PèæUƆÐóZܶ*÷‹º¢úÁø¿·½Yj2™^AŽû$XU�|„{œ'΃ÿdï‰sÃdAŸ‡�~68ÓÌÁ¬•aò°’Ýà–á…‚œ·†M©uÛ3 ³_íÕLùJ!tܹ¦þ7H@¾ÍÑvÿG8ŽM’;ýŸãRÖí¡W"Ïo”Œ´pæ_i:–ãåÈT…§&9’5P ©4Õ4—w„ÚK…~LYÍ·DœKé­q™KáœÅ˼Y9Hk‹à!¡­†ê«Ò5k@÷±kW¼(´ oïÔ䬕ºæÐ…ªåÕpC~Þ�É¡ÒúÒ9”Ô¨Òô\h µßu$ë\; *DˆJ…Ò‹àê÷óŠèzÖþœ‡T&dÇéB^Qy #¢Ò«ÙR°K¶@ÖZ音�=º™Šš‹V=ë=ãtBJœë×®%‰tV´�¹�¯1)áxú$h&z8!"º¨ËT{˜AâïU8*5ö…Èý™ê‰�õQ4§,ÈöÔ¬û´t h;±O]+® dfƒˆP›)�säre™§qxJ5è5�n¢:èõì]É£ýà[UwB5©Ý<)HèxÇ�|ªIêµøp´�a]…þˆñ¿²wÞX:"eÝÇ L›@“çwĪôV•áV6ßI“ܨÈ/Pg:›È¸—pdÔ£¸õI¬ä‰ÝA¸"'Äc`áˆÿ ¾BårÒ¹h`œ÷2ÿ˜ßoÕ¶è+ŸÃ¤c5ç�ì +�+ÍO?s‡ãc´'‚+çW3-Øäß,Â71 ø¾‘™Ç]§â቙¹Æ¥_õ9ó•=go7¥¤,7:y<&–{Ò`fÔÎU¿ðÂć¬`w½wžÌö«ëÿ5›ý“ü;DÕËï2 §Ò½¬_úÇàAAÏ+{þ;¾­ï»qÿ ”Úò4k­Ø9n ©Ò&ÛôÛ5¾Õ˜–›ðð š ÏüýkÄ® [ 6˜îú†4¥<¹±J÷8®iÇ]æLɘ;Ô¯ÿ/A°mFrûxþW¬]«'Ý]T¯~ùãᩬ Õ–_â»zŸN?7e˜ø Ãý¥Š«õ¿ ÿó;Ì«w®îÕþ[!b’óí#òÃþnõO�+Ç3ݸöoºŸŸ¾ü(§HObmî–Gö¹…9Zù¤Ü’në~=?ä˜é(ï5¾Œ>·F0RÕMNªh4({«4%çÍ,Ü;£~*!FÄŠ9F_ÝFš‘ ¶Æ®ƒZèú<èº'mŽËâÞqÿ<ÿE“Ñ@o_ï“Ùº&þv%Ú{ç9”Ï&«>s<²Þã|àÃÍ Z‡R¯„zvÿ­òßuù…ú3ÃüáªÛjaüã1ÿïS+™~¹¬U5V¥þ ø~)|�_þ‚ΟY\S̾Ä7Ð?ÀÔL®0ÒàvÖß2`ÝûR\?|NPÆD£í~V‘'­*Ð}w.!*%‰&¬[ŠªýHægÏQÝì�+êƒX»þ$ã …{p~^b1Z§£‘Ëþñuuœ®ãhATÉÝIÁ~ï4p%Ës•®(ƒß� ]Õ �W�¾í‰>u†*dé¿Hq” t¡t%‘�œâ}‰a­‹„C¨ƒ£µR!…ùXôû2©E>«ån"PUUMÙÿ`Â9êZ#"jåp é§2U‡‚W"i¢Ûᚢ~Šwz*õˆª¯Cïu?Ï’š§gÇ¥ž‚áÎGë1e R2´S³ÄˆBå¸É×?ïí%•¤žÐšÈtDD¬!Jõºßß¡áqÕ¼O*Ç4;sÔ€’Ú4õú£qD$[rE&2o؇ífâ8ŽãP£ŠÚÓ2=?ÔG�u[ÑÖ='·_Ù*½ö¾æ#Çíùû»Z=(Ðïu™¹:eé|È!› SÑÛï@E%PX€‡¸{F?I‘(p»�†æüÑÞvëÊÁ0d†¯sœa›»F÷æÿ«¿Ø#gsp’ñQ îÆÊÂØ†Qn à.ÆBt/•óÄô¶|Ë@ÔF¶‰KÓ:Òˆ\òP± �ËÛ�=$/FòÔ¤²lùí<䢒é×KjÕUt6Å¿·…üÈ é�º7ÏUO ÷ú;å»xöºèÑæEƨS Ë¯àV_ÄFÍ®5®(‘ûªgÓ€¦uŽõ~=YWéšÌI!ŒnñhA#7…çFü÷ys„Ój™LþT(WÁQNé)å§�éMÁ£ãÞ¥®ˆ³®�»³nQÿ_ "KMS£JÎx:‡ùSÅõëÆþl²kã¾õ/OS/9ëes·Æzr±­î�†öµÚΫdëßúj±7‰»ÀÓº¹Ú}Ú¥~pÜæ ý\ïJhê1Ç“ûcqêiqÛüø¾jKF’òiær�MMÜòÿºë¹¹ú!–Üà8�o‘¿äÑ›B²Bu'gk¢‰ å¡nÓpRÐo·®•z²Æj|ö�Ty°Àm:DAŒð/µdûH;Z.þüÿýg7ã Û"·�„GG�ÿûqøä˜'<æ~aÞ‚q0xÔC®|±åiöÙä²¾TMãXf[ðùîÿ¨*^ üÅÞé ÞÔŽt ?Ř?à µ'`ÿdzS)7hŠwâYW ÃåPÞ�‚Â:&%ð�ˆ:¤Ö‹ŒwåªêÄÓC9¬tÓ_>¨/oðß„òPWBq–è·ô•*Îê…Â*Züy /�[¨+Õ�9™Î}iu.€åg> ©­•ÅUTF¢[QùZ5ÍpÇAjd-jp†ÀݽœÎ¹–N¤$ÓÄ~Îñ8ö‰×_¤˜¢•¹æŒ*€šgÐÁúŒÉêñóøàðÒËüƒÞË PÙŸ{Ý*P#�¸êJuЮ‘|UhŽ©R»`ŸDj¨ÓûRÑ:M¼¢µ˜®Ús× kÒÁ3ãK¨~ÆÞL•P2¦¬ZeÏS*Ò;ü\$$â„4�dSeÎ 9y§f:침J¥»è‚š´@$\9ŸT 2È5W":» "�%õ‡šÚsËI8LïƒTˆÈ) ìé4ŽÓWóÈ}ç>¯Oz0P?W{`ÆËžÐáQKåéî;å§F’N€ˆxzö»¦y°Ì�ç“–¡‡·\o¡DŒ¯{7DYg¦]hÇ�`ä̱ubøBÝM¿h„7,áFµö®à¿­}b|¦—`îÃ,,Àq/�Xת³¡=ƒ'§PúKgçSϯ[w+Ù“þ­n–ÙÕ½¢«Œ' Ôö´j3«81õ>W‡n¥‡o]§ûïÂj™j’ƒ×mpD4ÿàÐ@ö¿–¢ùgƒ;iŽÄWÊÌ�÷NÕè{ú(KQÕý‹»of äÙï| †Ó| Íß ÖeÏ'ŒeÝÓç>��(ß�·ñ’ö8>f&ë\¡ žüŸÛ8¬Ùj·RdœÚ�’»£×ÏsOÏçáÇ6³Î0•šÿ¸„lÙ¢³Ý¥yVØ<ët÷ËÙö?µ`íæÄÍDí=ÂûM öŽO¦|©f1vÇÿóÑb X3S•ª>MÄÆ‹c?rkØ�©j¥ýç}‡åÚÿÁ8Íu×b*ñþ<½Evß-¥¸?ù*¹»-l’‡Kõ„à>?O®ƒv½–ü8©gà¡Êhř߶”ŠÈªwÇHçÄÉ_ùÍú±çé˜çw/¬.QïW…³ØÑpáqœâå%F(ï**yy½Õ$˜§çaSKÀfnÜ­*[Øh 2ª»{¯p­Öt·[Üýƒ[êŸÖók»ÛuIíâÁ`ãQÞï²#EŠÖÚ’Þ˜§*sÓÁi²à›B‹âyoeó# Ž£²÷Èë·ÿW�ÆMd‰cÖÅñ´™ØÝâX/&?-ÂPèüÛÛÊçEÏ»¬úîzT!ûï§Öëòt7Þ&@�PóWÉOggS@Lm¨`*):ÞGÿÿÿùÿÿÿôÿÿÿìÿÿÿÿÿÿÿöÞø» gj0Nµ'‘Á§x†‚ÀÞ`7ñ mœòúó£Î-Ï �ò¬‰1®Ôð}�¤­˜.©©ã·ÁÍΚnì|%b*?«ãð=ÊEÕžÎ)>Q4#Ý7�Ä‘KηÃÿ=þ‹8RÚk0ä×HHŠ8Öáw©H-óÕ�S§ø+µ€D÷+à!SZr®¤„æQ%æR¾Ï+Ÿ’s ÙD¤Ó¤“EgeJé¬èG©­ˆ»Ôñ# &ºªs‹Sæ¬ý.‰‰:õU÷êÔÖ¹çŒežö׳‘Ñsgæ¬ÎÐé­•#9æï TÏ$¦&gŽ›¢Sp<Žyÿy¤.Ô‰N‡JÆueÑ—ðÔ\�l‚øÌ¼= ê é ¼ž q´ÖŸŽÓkLGë+2óÉLM\GhízÎEí¬)Äq›Jþ¼£UºC^ÓK¡ËÜAÂápu §*ät¼÷||¹ óäñty}œÔ_…ÛG•�p>näÜõſΘöÂøSÁA¸šƒîàqÓÑ¡›�è^ ÝLRxN ÖWoª>N™Ø8§ Tù Œ©¸‘.Æ•¹eoî)ðP?öƒ¼ÙÿvNbD/̱�{ÒyBC{ÃÈÉî©nïŽ÷‰�¼‹®,}«TõËïYe ]$Ùs¼=øCï�ºyð*.ÛÚ^zh±D}7>ª›«±�F²æ4¸ÂÈ^÷BçOªùw ¢“4?íÀËr91&öø¡¹Î8˜# ¹þ^k²ë7÷nº>• ŸÁ‚î@i¼ãþ]ËáÕRÁZ�™¾Iʃ忸#þ²>háb~![ð-yQ´=ã}¶ò¸w`ý¤ûè”gÓðv[þ6oo|Ú˜j3?é*¤, ßñ~[ùzšÏ O9Êû“…XRÓÊÙ¿ ³©»õŒ Òÿ��½·kÿ~�)»¥¼^ ¥dfbX§µú1áï1%Žà×g4J<¿É@ƒô¤÷êü¿ú»ª‚Üj×�¢Cô3 Ýqƒ&å+„��HI‚ / _Êo)¤?jïÑ…í?[« ÂôxŸÝ¤=Æ…]îsôSý6R=‹ô]ÿ;×sxëîyºhÛbx¸[›Oƒÿqâ<0šÛ9Òªø§(Á?œð»G°�–µÁ+5d¬Ó\/ǯ·ÃZîbÓs!g‹¡‹9ÖYt²®éOÛ\,Äå·™Iƒ•ÓÿE®_w]ºùÚ®ÆÜ‘ç¼ÍþXs’³§#ƒÝK•QÀÊùìÞ®³<_¤û®éÍ:e20´U~Κ¯Öi>>*ü8?î¬6R †C(´œkÜ×O¹mRÁPqnGVí]|ƒ/º»OÝ™r>ù{€�´ƒh˜`7qø†o`þ€j�WY¶üV�¡—ú sE£~6äs)}·3¹')uËéc…p¾:Š>ßZ Uˆö/ç8×~‚”²®ZK*1Õ‚WPC�˜¿gãˆé¿þíaªã#·ÑÇBÑ·*ïlÀ-¿ �­¹þtxo@Èó[щ®&W´üšN¯èœ1S‹³qtoÇ!bÖ¤8‡ÔÚâLìœò”Ûx_ä_> ÿuÊ&TÎF§"4ƒIÛQÀñ>ªÃ,\M•TÈ8—Ú! ñªöY9vÇ©N•*rI�YÓIG_E©Ó¾ÞXqRŠ#¥J.Jœ‘q÷®C×SE¡T©Íòùñ{?QRz®HVQíéNåëaq7®®�rEÓŒž˜yj†ÓEÔW^­'™ñ±pøúþÅóôC�ê¤ää-Ð@¥�Þáà¢zjD‰)ëkÊ�tbôDD†êU‘A#yîúÍQ¦ùr(ÇŽ“á,I‘|´~­#‡ö]UàïÑýSfžÂ-· 3 vzš‹!Oå¬ f¯P�;.¿7�Ž­+�jW³ãí~€èØc„‹CæŸ�ËŠ«Ð=Øj÷­•áç%§ÖU)ó ߃ÁpúÚ% º_nïñs~§Șï-ïƒ õ§È1 ûȧƒ¿ì_dìÊï4‚°t}RòÞÜ?Ò+õ*F®ïû7ð~Ò ùÛq›Sä=Q¯š’¨Øw¿QmÒC#«Ú•ØU<øðÀ¸•î—¼“=6Ð÷ð*0‡uqû{ö½As±9^>�W…Õx7y±¾1ÿù#«ÚNC¨û&tׂ_·ÙÒu¬�»¯™qPôÏ=íåz©ÉêÞ�Oï<ö|šöý=ÕÌ5Žc½-\{ ÇBÕÄoˆÓ[‹ç_ìÈá=$^«QB" .ô�xg.x:öJÎUridóf¶ú žŸðÓØTW¢ë%ü~튕áKзïÎõgݧ‡qÁîý<äúõû{�n‘?©`rêÌŠ;Çã;hmNÃs_lCeÓ§XãÐ_3AƤß�õë;ž fo¡rYÝTx¯®´–`l˜ËÜ+z#P9Bµ6†vV ùÞ”a“…ßÜã‡{9ȲÁV¯|òmßQîcÀ&Ug°vœÑbZ€‡tÇKç<Ÿ™×âÓg×÷6ˆa þéJîm·Ï@Þ(\õ³«eo8ؽ�îõ{i?ëÄGjóûÑ„SÒÓ5ùçàÀµüT˜øŠ„m9ro¶ª{êøTÒô³oåÙº¼¯´}7ÇßWæËsÙi 0Fâ–#òþbLÎ`º?¹úX�‚áͶÄX�ïôƒ/î7î&‚y�ú†apõ+ð4î²k$žÙû_à@íH¥ïM?¡âæ“©vä|�9\ÿuõ¿·OÔôù�¢H¡Àø_î³Ã'¤BÊÍÈ Í›húÛCâý²çcY¡7þ€Ê]Æ:èÊôP›Zé[ÒG7}U/—Vx•†~Ib¾QktQdçû8Þò]i�_Q÷Ê ¼^( …<ªÃ×@ˆÆqR‰\DqG3¾dhžHÎ)!’˜“é:„èQ�ñèüòÙő۩ ÔÎ$ó¨r˜ú¯GnVåóI©��ÌR§ÈZ©3ÀÒ8^~H» ó%y‰'ùp­§SË¡D?z?dvëÔ׃•¦–‘‹ìkÖL=Ä™åëʽ’³z¨î‘’ÇÏÜ-ŸŸ�\~bω X‹½†P»öÑu… ¨ }Uš‚¦¨ûo³S�Z|m¥èŠÖ®ÛF[5;òU¥f…=âé]K¸à@vÈÑ!S:®Òõ$@-k=p¿>]�º3R�Ç/³¨Wyî_ŽîópŒ‰ DrgõÔuêôŽæ–^ÈÏ?“è³�:·�–Þ¢ƒ€ìÞ€Z>°P&s²{—ó=6çí\Ýo!·°›_›YµFÆ|ØÈ§ÊÐu¯/Ö�pxæñ\H¡¦Þ3b¯eÍ‹ì˜UAòṕ}j2øûC'[‘˜å?I{Ì .Jæ×¥‡œË¢!:NW/¿&ü¼ò]/ ¬ºØ))·ù€N§�¦ij—ûiÄ÷;øNŒŸôÚªíÊS6e®qnî)L„›ô²YH㌮ÃK]6¾^+Nï ÜííöÖæPšÛ×g\âfüq{ž¤æŽíÎëD¶Fl×£†|€”Â÷Üòñ3¬Z"±ªr 6Õlúåƒü¯_;…�ðãTä‡? qk ]OcÛ½‰pÍ�~ÜÌ>ÝO~Êì`˜ü\ëͭl§ô³7Ã?þ^.“Ÿa·gå› ÷¸üÑ¥™)G]N™È':U¯ËÇEЃz»uºÌÙc�´ÛH¹h®A>]Ûal£©Nú k¿Ùø¦^Õƒ ^ždÜoQ–'ЏÆ�*ˬ <ï˜Î7™‘+LÝâ3ˆ–šÅÏéµ»D™Ìíj“×V´T1º].�v£ê¯8›Äܽɬ ’9lyHµ}�«>|—©ícêÁ±¸YÀ4³‡ ìž“Tʈ$`‚×7>õ‚ÖŽj®ý9 ƒ*ŸÈû�îLHØþTþß�—óÏ¿î8å¼þþ×ì—ɼùcKbnݵ$¬³†<ýysuf}¨÷AdÓ×·ã¼¾¼Ï¤ŸÎ:.9/€Рýî22r¡ ÞŽê÷™W*ÙÂa?UeŸûzÌâ{1 þÈ{³_@½€'Ô†‹¾;ùk~€¨o �tóy^œ&í¬›Þ¼ ’)×5�'Og DÝÑõµÖbÏàïøÉr¸/7¹@�ç H�Ú_©ÎÃyUÇAÅUtƒNœÇu¦d¢ç}û×Î>¸ñÙµë—WKå>2UC^¡ÙϘTU>ý-B�ò½*ï%Ú-YÏ„JûM‡ýJÝ ¥§€Ö#€ê€²C�â@Þ¤vÏíDzå9yÕ¡(æë;Ô>º†ŠhW¨µÖzˆSìµëñEO5{/³Ê}ë-*gíº/´+ßZEr�l§¢Ôˆ¹jÊ7N‹¾�Z7v:ÄN}•¸Ùúå�AÕc¯°:„^P['’JÇ+½ZТ‡Vê!õØ«tP3•ïTvºJŠæc)T”v*Jg©_S’æu¤k©Ú¤h¬ÝtÆ,ü„:; CN:Õ«ÙÁ.µHá$N¢k†ãtnzè¿uÒʧy{Ð3è„ÂAðþâwŒÏöȯÈÝÞм£IªP7“@�…!‚(üô®:;é|¥¹´Yðýo'¶�r©Ojk+^á úؼ ùvÍñ€ÁÍ ÂòŸÉbƒ[[ÿôK²íml F_ÉåWè׌µùoÔí=ø‚±I߯ )Ë W—©.¬Ô÷e+×âäžÞ;~ѽÅp íbž³žKŸï7ëÍ�C@S±ÒÈœ™Ÿq¤ê¿BÏ?¹ö|ÝÄØ�“®^hn7uA‘;øfö¦yŽ×l˜f>¼ ¶½^GÆò©_„Í1r öI.ÅØ;q ºT•*^Ø<Ú :³°Nôä§!½nWÂb'ʬ܃luA©y#ÞØÆ‚Öb“pdÁoßÈÑ%¼ Uˆ¹JÎùÛœfÂø»=ëã¢æàäN+ák¶mý;79ÄqnÙßóÏÕ�$PÉA(ðDõº¤Z]õÚz¢Em…Kjµ'É.Åç4Í­Óytû��Ýÿÿ�'‘=±Uw}ÅI¸ÿ›VÎ>þç_K²ûê7S¶zbjÀæwÛ QÕÌÒ9žÙr`L*Eû=`vö†¾böàY‹Ðç}†œÌ=­ö{¸Ù†å•÷°Î�a-¦¦Z7'žÉ¹ñ+÷u#0¶šHd6#`½ùê7ý´µQ7ž~¨·"¸b’v á”ØM>N\âÁï‹QCÁ—šÏåó^1”弫‘ÄÙ© \©˜f]Η{L ¬Læ¤Ù™t»°­„ Þâ;'ãË}ê“«xVí<0zçÄÄJÝèðÑUi¾Çr÷øôÿúT{ï–¿T’·ükÖÑ˧¾ºò½:�¦‰aÉ'O¼÷­\ð²j ×íû¾ãûü†Ö’×rÝ¿ù+y×^Ê ˆqÛn)ö Ü� ~ÉûÒ¿�ñ„šIaïŽ~ñ‚Î׈šñ O=²í—öÕsüxóþG2ÓDn¿¼@æ´vˆOÊÕÈqíNt6Ÿ�Ñ-5רÌ©qtÍÿ2qöÑSO¤.Ô%Ýw&¨þ¬*p>žý뎳Kƒx¯*Ž2egä) ¯øv¯SÀ�!j¼ôÂ�tcr5>48öh¤ÛÑ€"g¨§œ�<Ìyk&tŽÊþ™ �)‰š�_†[)uS;À)iU@N]s`ŸgVÚi(hƒ'$3töz>‘QÈyDEƒ9B¤FR%w­ÔP¡î]´VA�LÑd��Z»?õ©NQ3èR(g‚×;ubÝÖ¿årµè¯ÛÛÓü퓨´thõ¦øœÚÑJïNT„®kh×V1¡¦ÔÕù zU<–ËÜŠ�W"šz„v¥»žp Ö£®+-h~�º8ìôÑUÑ}Û^*8 LÑÚ½Ó]Aê ²ŽÕC^�’ñw~ Nª"€spŠ£(H…•|/¹ t¤£ñÕä ‰ ~Íš“œžÀƒýÆA¥„Þ':ÏÿÎgÕ~bRSÿ‚’û[$¢�ÒÈìÇZª2ýîôî.W¹v¦qýdç ñäX^ã÷rt¸ïa~e¥F@?+�?Û&sƒaQ„LäP¦¬`Gí’ äúK½…Vfµõ–¸Î÷R˜7ãõ^Þk×…´3 žñä°þö }TØP•*—Ã4®"ý”®»þ ¬×%{¹Òn4›sþ™Yâokü^yR:có³Ulk·ŒÂÚ*$£$ëCäJÃOà°4¯Nù&JèGÁ½­å�¡ÖÞúÿ5˜‘šg¿BX�¯ Ð�÷ì”!,K&D~ù~Q±¬6˜ÔŠFh‰Öä/ô‹¨9Ñ0¡eHFýÂQéMÓ8õ!V°KŸ÷j=Ãc*Qq÷?ýÐèÁ*¦©ïîë£1¯�éŒÒ6æz�ìfŒ�¿"—ox÷-Û¾o9¥Yå×ÖÄ®+�àØ{ ­Þ8¡¿,nü¿ï]J‹!˸…~•ó=á5VÞ°¶‡pÚ2fMU¼Œ\PNûø?b¾i¯ôþâ R¶eª¯5»·úÞŒ[Šè¬xÎà!ÈXtÎWˆŠeõf7¤Ì[çýð›­Þ@cƾ-仾d\–ÿßøÒè_ЩÀ{¬>8�¹,†Du/Íé|¾:«d ŠtÌ5{�%Hî[‹ä ~^¼¬×ÕßuûÝ—X1:½Ž÷x6ë{÷9÷ÕeÙ"\xI3×?7ìnÖÿÏ©àOع¸Í'ØhoGzäßëOÔË1òÚnóQÎëüôË×BŸ�ûFÏçB·|1?}ôX¬Tls:y+¹ÀOggS@-Lm¨`+Ô�“ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ¾È{¿ú 1¶µ’ÇÝþ…Š7ÔF®P號÷/�í�®K-$µ±ýs…¹eôY8ÎWa[™ƒ¿™ØwgÉm÷Lê6¨d-÷:=NZúxªÞo’\Ø3"ÉbÕ>c†*÷÷??»p6~q.)â�óëÝ%‹&ð²ÿÚhÈ­Ð&Ú¹ äÕ@ײU%^gZc­á�GGD#É»jz4 €ÈcE©U«»´“Á/œû•’Æ 5�È” -æ€.y¯µ�Þ[]-hM¥³ªJ� ê²~îu¿-שK=ÎR£Ö«F™�U²ÌZ¿ˆ"´î�5¯líð4¥¶ñBšO©KçSqæšÎ´8EÕª5‚¹ãÎO—K–\ÌEí�#kÆñH´wP‘�H¢BGÎíDö¾‚T2ákQÙµy7skuApòhè<+¢µ_éì¨ó¡_x­[æ7æÉÆC;Δ;û µ…+g² E¼“Ð Z"馨kÍpX}èK¤Ò«Së3 h=fò¾4D¯² QÌQö–*ºã�>óšÊIŽÛïûߥ‡v5_®ÍòtU _‡xõìŽP„`r¦V†v†´¸Ôìçïo�\Ä´há…žLî¤ùùíoÏÇçÎv·íƒT‘ú¥Ì÷ha•¥ÍÏ‚nˆBÙ‰u)•õ½h;�·�KoÌEê°3Ý­J[x¤�ë)bíÚï¶)ù×MÒ1¬ ¾õ�µ:?½£‹·ŒI¯«Òl¤;jaž[1n4²²/üf“Þ2Oýpï4Ÿùùöjíš~\˜=®ZpC ÉýÅúÙ`Ÿ�Ô¸<>•uÕ[ôí‹+ǾÏuÚºöZÏ¿/t¬^WÀF¬‘ãÍëE™ŠnPÓ) 'Ý(t<õ••àG6'¥Ùñ,vÍ|n�Lå¸ëñÎR‰¿Ël­éò'÷øîyÎàˆXõ"=O‡ª–�Ìàyò)ðŽ|—a$ã«W+¶Ÿîç«ËoèuÞPüàb °O¡'±ƒÙú^Pmž¿¯Y)�pEŒr>8ï‚éœíógcÇå N}÷vÊá‰lóéÇ£ø‰·ßƤ&GÁÆŠu1?neíóÜì[�PLí^àÚ=êN-æ 0�\yƒåÏëûíjþ¸O®ÕònW¸>�­e|~;6ïm”1VÁ½©T>cÕ>´H:ÏÜ{ÿ†À-ÝñB•îëEŽž}7†® U’.²wÇÞ6–7}­³|âN�Ë�‰ÕñË{¹�ˆõÙ:ç]‡µŸZÝž ϱ„¦K¢¸V´\ïâgÜüî†ËÕºª™+î�µ•½áÏ�åêùQt|’�ßµ›šÜ@á? žì°Úûqó¾™M1å.¸ªëþ­žöÇ¿µ{zaTY#Éó nrdõÉé²lÉÿ~Ø{‘¿ÁýÚj&‰º;ü U/PžP+¹BŽÊ [£ï?E_W; ê Á—׆"õaì$ˆ(t¿ŠHNê£-ƒýžÕ #�îu®ëÉq>œA&ÌÂÔТ‰ÄZØcx¼þ$Ü_¦“e6¥ÖΉAa¾JY…Y3$díJ�ÛÿÌÚDvMm¾'Ah  Æ2í©*�4�fŒȪõˆI©0µV§š'ô¼ÕE×8ßCÍÃh÷Ð|õõ#ÿǯ�*@ÌNyìTP‚ºóTGÂ;óÆs˜×Î]æØ£Óô.ò#‚cjè’&kmv7y!î3ãT§Ìe&4ô¼¦P„*)4S}³69Ewke*jé, Ý¡)/Iv¤4$:9tÍÐJjïÈW'ªÄÞ©‘Ò=i¹òTéΞœ ½Vã1hž"…lþ¯*™ Îžtý>2"º¬ˆÆ N=[Ó©÷¢¦ö'™äЍNÔ:eíÉÑ�Ï%s—þ„Š ûs™n�¼EÆ}Ì+(ýªfgr¸âqu¸(M�€K $�d.gÄW G´¸RÛø¸Vž¾R?LØp?Çz¾ÏÀ¹Ì�ÕëÈžÙ/âyލ®& !vrú `=d³Ó<�ˆ&“ kT‡ošMÊB×’¿é0+s&áÞ³éþ ÔX—™®v€ zÓ1çE.ñ¯wªxhµ@ÒïwÆü [™Þd9"ûêÍLžè6þYUu~ˆv૱ÙÝ¡�,+‰› «°¨î\ZçIŸÊFcU?Öã]_ôÞY{§„®M.ñE&««1QÉ8Ýþ­Vó¹Ó³®­�¼—“êŠ{-oüN Èš§±åu·”Ås™þ¤R¿Ü\w¼põŒäƒÝoÙc¨ûžåçôí¡]øÅ÷ãGùí�žá«¨áCj8ÏcbrïÑZ�ª²SY·ýé³É§ºy�©V™Þ…Ö¥˜J³¹ülca$`&{®ððéë1Ä:÷îü;Èt¼‹Â9™çL5‰:¶·ÓcrÝÆ¼àrÕ·¿-ß›‰ëËZx{›kk òæï^‰�»“ɧFÛ‡$±ŠÝѬt]Oãâd×úQ`e5昸œz]ÏÕ}�gÒPÓ«í8v7+À€E¢K¼R«fÔÄ•ËKŒëalL!ã…_׿†2àb<Ý eÕmÇD¡€'Ð@ÉþØ{Á¿0û²Û’‰k%‡¸ùN¼@ºq¨•\!GÊ7ö Ûò£Ôço%$�QŒùÊ i€E©u"ãë´�öÓKxãþnÀ�7@ôù±2i}j•‰Z›üí¦� ã¨uˆ®õß ó’pnz¨T€X>iJ+Ä+%ik¿Oqž©j×›T´p ²F®× í¸ï'˜ó}çfÍ ~Ü')8h8w©¤)®qß}·|ö¡ó6œãøÜMŸ§ºtDE�-Ì‚‚#‡®‡Ïmôôñ».HD‡Tzrä<ßɬµœ÷¬•W%Ξ‡¤ÔЃCCTõœªà̵ÄÑØû›Âùëëj8÷KÔaNº:ºf!§ìÒ©‘d¿:Ô–èõ^:N­­‡M½“´R壡z¢iéJõv$µ §×dó±}NÊQ¿4îÃPGúT"p§×§ùú��Bd—âxg­T�#+]«¼Ñ‚L^�Žì“Ìö´3¾BÌ=×®MÑ"­“C¡äÓ(AÃZ;g‚v蔉 §Ú.¶÷>ãKL»{øt#ö˜rßW¹$ Œ<äpåìw®li̘4†&SLg¹cj;1èå�÷É<¥¨ÜÙ‰MfÓ0#ü’7ÿé‘üÅý¦å8­f }5nxaë—ÈJɧ�ÛÞïš4ûƒþÏL›ržcÆ“¨ðC¨#îA¨`4ŽE‘G\&Ó«†Þ†Z_çØ†Ÿ>usŽ˜ƒÃE·¾„S¿o5oí�ü•óÝÛÜÕ˜[›ŸoÍ çÉ=‰‚ëuŽTÕŸ#ó8²ôÄWaÐu›ªg[ƒtn#¯|Ïwõ¼|+J×ÎzwÕGÚ‚?Ô2˜­ÓpJž•vù~ÕÁLLí"zÊ#ƒØœ§ôÜõ_rÖü]Ù­¼¯ ˆ_dVCëýH¥§aWÒˆ -KA¢˜hÿ-Äû¾Žv¹6à^}ublÔ!_ vØ‘+܈–#·ÝóU¿Feñ¾Ýr&Êf 5±LÎÓ’•üß%(ÊLúeqô¶ÏÎt½þ©þÎù™H4MÚ~#k>ö.�ÌcÑ’ôÝkõ}aU`””ï/­Çà…ìËO:ãu·×w•°'¹û`Àç‹¢s›¨•,âhsèõã@­ø1}þ¿á¿sOnOʇ/��P„o/{E3¼È[hŠ Mcc.Ø›¦é@ê'éPQ+Ü·ö*Ýú½û]ai¬U³·Ã'–íÎ¥zÎ_ÚÕGLJË1Dþ*ºHòw6ŒÒkªS¦Úš5y™æÏó ®´„ekèÔ³Ê1û5š[ΛEs¡õÕåÚ'¬wD ¨ ØF²Peײ`z<;×t™oÖèzlç7Þº“^õZ°‘%Â6Œp«} GòOW.÷ÔÛ‚¿²m˜Ð½¸oýW˜Rr>?’‘íf7JóGX(Æ~Ê¿zóV§«ê}&b¼�öç;Áë›w'E ë?6h•Smì» )&>§ý)õÇ,ˆc"�Ò'þÛ„'2·ØVzÎ:â" d�¾…÷[ ›4aZP¨ŸžÖ×�“èsÎþë†&TJ¡»iËÑt‚¹Û2¾–nzœcÔNòd¼ÓË OggS@=Lm¨`,TK{ÿÿÿÿ1ÿÿÿÿ#ÿÿÿÿ+ÿÿÿÿž˜{Ó_ õ"ŽÔîZÉãíý‚Î8PÞ@.ùy™ms¼­7_îR$SëO…¸ê¯Þ®@ÕD¨Z?³z¡Îù± © >¿8óç ðŽÆ+ÖW¤õQÃËG¤,†Û¹JÍ×çWKåê°¾|^1$ÙùFEÀ¸ÆD½¿ç´Po•ûN4{!ËQè™Ju¸œ@«|ÞëÉ�ε6ÙE­*; uƹ “ýë+Ìö²�tì$ ½~*Ž*ìQ©ät!êtÖ`y˜˜‡{Í7ŽÔéa§cÿî†æºN•Ú8ý”7�?¯ç¿{DªS¥.s©’¼Dí È*…2­EѽFCkô<¿0EfuÌÎ̽ʑó ¤F­I=�«JãP�N¹ýÛŠ•È—¸æ8‡¯ŸßµªîB´, }fšY©H>ªUkeŽB‹„Љ,4§€h•éÙ!É)(È:“Šæ»kO1µ<¿ÆvrüüÑØó�ºókÎïõžÞ·|,¹ýCs?Ê!¶þ‹«ª£¤I×:Çñ­×1ºGã3î­ã÷)w(Jgx29SeõpZE-•x"P0 ˆ�h•ÓœXâ[ܲ Y¼7ZßL ü!öB_׳•VuaPÐÍC"Ò ¼\õa$XU:Û„]aE~~ñ*)zù|ç+oõ¡qN]®ÌŽ™± ÙZo›1âl?¶ßó"nH^Më½+„�z³ÂÜýyNÇ1S·[Ë ØÀp×\'ðÿ:�ë'3DÏÿõ79$]PiI½L¦L}6{Å#VGD|·Ãe6[ߟø�©i»‘Fé?îÙ¨rUz‹ÃS_ׯÿwŸ*îC_½O wÅÇ\eZÙGî‡Ü÷zòà‡kæîŽÄ›•rÌâFG>‘óÊž~Ò­7æÐ`‹«v¤Ý:�tš$—fáïëZ¼Ñ*5òrñË.÷JáUi,¢-îZºàfj—Ýõ)íÊíw³ÌQñë÷¤2`Ù3½e,ÆYGUÀÕÿ„÷Þô\ÌœÄÛy1x—+ݽã­13Y?Ýn´ÃdùEö¹~@æ´¼Ê0½™¢{âhbXˆoø—ùêÌ-Š˜C½þÒãÁA¹ƒ'™ ÃY·"½©ÜxÇçò0ÅÓ ï= €Zéȹ‹w–Õ$xŸ*}«c@ckV±’ܳLI#a#•jLøUæ\Ûl3˜=º?(×¶žŽŒ·ÜþÜÃ@8éE¼á»üüç{a{¾ÅŸËg|Ñäìï5«$š×Vg“;çI¶Õë|}¬]…÷M¾\1*¤œå]6½~úm÷²Ü•ÕÍ S]¶}À9ýüü:sü†¯ióõœŠðK]ãÍ�–²þc1"ÎyIëŸo1å7Ë›æàÔDñs(׊¹Õâ½wÛ^xôl?d½<­u¯­Õ}b�ð>˜»Áß íC–šÚàïvåÿÀ©pP^A± Ÿ8[ëÔ–G�|4x òþ³BŠ|p8Ï¢ºHÁÄ*Ð7Ž�Wˆ›½ áø¥©j|ýÃw4[(½³€{Ý«’oæ£Ö„)�¿Ñ”Œ×Zä×––qï©dßò~ŸßMæxמ^Ý5 }™Z…I2{NÞIÉ¢Æ}_*¹´:HwMà$_Qít�pqT#ˆêLG‡”]´N‘¨äÞ�T„ZædÙuo?uSØÀ‰ŒÍL˜ùƒn§08‚÷š„2‡Dm’&C¿V”½JtW=©ŽjÁ{ÒTq~¦v‘lçj]q¢£P-’â=ÅùzSTha‚I+Nh¬MãH‡,õO´RMΓ#\MEÙkÕˆ~j<œjKº8ØS‹YjE:_™™¥©S%„ÊZ3Jo—HdΊ0Qv·pª€Bçž«ãtãd®ËõÛãä¸G·V‚5¢ÐW¦¢³Ð©P ©5È�¦©‡êHÌ ­ÕqŠÎ¶{ŽýðÝ]ögÕ£¹ÀÀåuL¶Lõr¡'¹øü6‰çu¶�4ø¿\ß]×IzWV-úƒõÅ¿ØÕãQ‰„È;µ¦>ì*\äžÂù%¿UŒ?|ïASÀ7� ì§á{× t6®õöß6KöMô‡�ÉÆ¸¦®»ÿ\>UøÐ¥ï†©i÷ÿÿ¾Tew�9®ñµ|{œR,S¤›îzÐe,Ò†™…¹Ÿ·ÐšCóQñ;'ŽÉÌ¥¬ _¾Òbãb°ãY„v™-vØ„šäo½µ˜Û<ÿn¸X04ž¹Ç¿â"o¾ÑNg·îœüÐ_½M­½X40¬ºg:Õè_>«°w!%zNÌ<ÄkôáE§ñ%3¯:%ø ýcsùD•òÆ%`çÖdëØÛhð•ÍÝ»é{aÄ;¬ä8~ï~Êì‡�§ñN„ƒëþ9Ì»™uÍÿŽ÷jÝ\XY¹YŒš§­­ NVÌ(sýú%g¿l!§U+Ìž“ã÷KˆAä)‹›B³5/?¿ŠÒšðäþ»´p˜_Î߭쇯[‡¸þöîê¸þ]+²l~ˆ{Ñ_ üGc¨)Þà7¶Ç ÌjÃ0¤nü×çÿ»òYJÉÏ�*ÐÇ_-„öÍftO]ƒ Ä)PŠuýÉQÉ¥œŸ:$ð}ã`"ÎOD�õQÝ«x8õ*ª0_ —}� _äOAóÞÄK>uBÖV÷]¡}›�'Ⱥ^BD%ªydBÙñе¨¡ ÷² º8¦¯O¥�Së@BË#pfè`m”çßµ|¼tš%f¯jDS�ª�tèóÆê¤{uæª)UD2…½#—þ,CSDª{hº9·H¥¯C«®­_'Ý##`®‘̵ÖVæ¼1†¤Š¼ÖÊ^‡\óºÒR'9Êd"â/EƒÀaï3¯“¨ÌSDMuê‘FœÚJÏP›—ýXÃÏß8Þn‘óñU  2«:rÐGAU�±·FªU’9A"+ïׯ<÷•÷règÉ1Ûèêo¹„Îì¤ÖèýqÐV•@ŸµKœz8-Î$L"Úä$p4)í°Ph…ìvž€`î8%Tä(BH) ¦3`BõÂò+L L3@)@#ÇGÂd�«ŽÎû| Œ åfüÛ}”9WºÈ®â€õ´y¼óÊ�Õ€»oŸRžíçŸ×ËÉ\{øO›áîi�›/çÔôæÜèŠÑ�}ÒòÜêªÐS]Þ¸â<• [£éäÐ7 èÚqAÕ“Q”ª^'b×»× û1ÇûéN“u2³Ž®JhÝÅRGU~T�÷±~' Æl³µ»Åæ°q!Ú-?¹Â§’K¼toe×ðúž÷Ö²µMžÇlü³1ÉÅöÚ÷õþÃØ›pà¶œ(äAñµAt]‹$égD\Ä¿<7ͨZl„ªØñ•Þ©fLïMÞr’]äxªòÿ鑞uIúÏ÷ú�o‹¯Å“¥Yä?~Lîkö'Ÿá(^ãû·º‰ò3%5q÷…Õg¶»{ý{ÌÚ6 1æ®�ã»rxÜ�‘yX´{.ìS|]S‰4Ç jÒ(c#OS¡Sãº\áZQÆþÊ#êíJN®¬÷wU”iIJçÜwÅwì$& ‘d?î›X˜ûâ#MJ;ª·‡øÔÛîRŒC´Îùÿ.P³gvrÚ-Ô¿Qßhp$wòÜI8^v&Xi`å½®ÝC¿¾àG©"ÃWóVÇaÏTOþyyú½Ý{Ç{w',cE�¿WoÓ8Z{§ ¦ÀñÞ\Gƒôk¯8~')M¶³^>¶ž;µ SÌ· †0²å±|Àéé¨.«ÓW�·ÆÏ`~%¨Ó:*íxù}•VEWšÉ§½Ë¡'J¦2ÔýÒ(vÄë6,ÓWÛÅ9l¨²\�Ÿ`4�UcɆëÅÃúy5›™ôa–×e]@RÏ«f³ù÷êö6\ x÷¿R)Õtñ>ˆ{¢oÿ‘Ø[úÔ ‰·û ³¿ â¼­R>€yʯÿ¯ÞÇû9-96á|>1ž t^ëO§�»d>pæ:ˆ3=`Ü{`ô’sR`½br2¿LîË‚æÞSë¢aæ£ ãü·Û×+ óñ ´Ô—€3MR©÷u<Õýoþ=Ø~¾Êâb£:@¨».­«¯›ÜWN¶H£ö‹Ffë?^ƒëž¼æhÃÇ“•\†ß•¹_ò÷©ŸÛßCCë¾GÕµU¢¢]+A�Gþ•\Ú+28TrJ©ˆR�K‡YS †g^ÆžI6]¨�Ç{>SV%f‘&Ù‰ÝÍGü.šDŒdGÆœCÆÔA‹+�–ÚŠ« cÚÐý.vô$i4i¢V§^�«]ÏlrÑgñ•BÅa÷¢Ö+ëk­Úì…¨»jvUk³£µB| uŸD¨Uár4 ¢Yûk�™Fº'"ÈdBÉ®]¡öš^R‰Õ;•¿ØZò…P/©'G²ûh$ö9йuíO}]æùÇŸAdurr˜‚DþFÄðˆÑ¼rò#ukhO#9̃Q´-Ô, €Â:T†L‰~™Ò³Ç]àò?Yž™|¼%Ê¥üÕàP¹ž¬Ë|¬ƒ+8Tý÷\WÙÛ4­Qç·y—5¿¬.óËÔJåx�Ì—hô:§=>dhž‡ùñ6÷¼ËaĨ�QÆÏ¿‹ÌßïÅoou�ïÃOvƒKkàâQÇ®­Á�v|åYqq|”+ðš´®5Ám&(òæØÁê*K5sòÓ¸^ã)*7hu©¹ÖÝsÁeXÈû ‚ä £ò ÓÀ˜k—0Ãk¢?ùþˆÕá'�nõ{š9íG^'cn852Mßý}F]ΰúæ-üFŒþ”ln¨„]ýLC<äZOés—0Ii_ìj—‰{­ëfºï¬±�âwVNÈ`ÕàU{1üèEt™…Æyèm¿E_^Q—+¶'c‡»w·ŽÀÁ–éýS˜“#0‹ÊjŸ=C›àåuåyÚªpxg»æ\Ý�­§ˆ3ǯ~˜Ñ]Ø kˆ@:ícÍ?f<àœü»r©ä ãKú`mËmeËc™¨E®ýTOggS@MLm¨`-¦XIÿÿÿÿ(ÿÿÿÿ&ÿÿÿÿ8ÿÿÿÿˆ»‘¿¡ÏM6ŒÄµÂ îNÿÀ¬hj#WhCŸx‘/·~rTHÿçB .xÒW ÏÖmS»Ö2[5†o+[¶Zcߟ.À§¿;8îëI#Mªó NMò%óT®* y_ë£R£aJË{jáäBwíY çò=Žúin�²Âô˜ÞS^•õ+´E1ìú8@2çsª8­‡pö (b"ŠsîÃzº‰ú¨ò5]õÇ´«ä0³2@=�Z"s ˆèççïÇ1ÜCaôç}|ÐÞK}ÌQARŠY? Pç&�ªŽPt:u`hÙE$ £¿eÌõ�Ù54Hu‰ÎS!dæèO–fjA"³å(2D:¢{J®M¶c{ù­ºÑY%È¢åh�“úEG­HÄÞd—1#‘$ ôKA’UÐ3€˜»R‹µÒ2Ë÷5–ùü¯ØŽ‡Cþ5ÏÖ¸âWGôß‘Z¦šÈÌ!�ºö±ŠÌÍšŸÑÿòqõcº¥Ò‰3'8)±¬Ÿ±„?|¾dï‚T¡‹ÐcÌÍÀ“Hjx©l %d-‡›¿iµ©}ø™y� õi K‚ÓÜÔ8îBjý2ÄÒj&·I”­»ÂF”"ç0 æ,î6Ðf_a@»‰½î´bu³º̤Aiñ ¥E×r�ie;6aÿ'f=É�Vîp•ÂÕdnÁoëz +È*Η5’_•™ê§NØlû€¤Y®{ç¼Õ¢h(þËÇ›üø²îÜK¾nÏ.�Þš>Ž�G7ÿ4¾Jêe¢©b�Z¨øèÍK%h>ì*v”pÜÞ'«[ƾ_óùkã�8»Fó™ÿ�OX‰{3qHøéQŸü0Þ”éç¥sÌ /¤H¹Ké.®»¯N¼Û1³²rý+ÈVU©Ng¿8�ÙLS«pIxíÉ´*FðQsí¼”æÂg!ÿ÷ÝÎ{yÒÁÔ-Ÿ©àÁíé]$>§¸ãÁŸô¾³¸O’1WdšôŽüÊúζzÔ3ÉàDìå?Ükníx¹φüÖÿ'�RâË•K©Í—'Qi²í좵ʮ€È„³Ï!KrÞTñ�ï0šÇ•‰Š¡^œ $ñ%˜û¬i †-ã<îe¸˜QDeO<”¦}�…“3Ê$Uì­ÛŸ‰»¼ÓÍŒ›1¦B·wEé~Ô«Ö•�ÇQ+C¼y5Ù¯sçE$^¿¯£šAg·);Úmê.NT¡ñ”õ:‘ƒ^Án!˜øF‚&òdXæ£�µÆAPWY²·vÓrßwÞ ‰»ÿ�1ßëò)¬ôÒ |íç7ù=ù÷ÿϼ¹�Î�fQn}-› | þ¯_ç<ÙÂÝ‹öÜqþümûÛ:Yý€ÛæÕ.Lο·r3ÈåVåÖ”Êóáh�|ð¥ÿx<8éó+Õ¿©¯_8þ^ˆ{ _°·„1M»f Ä=éP/0nœkÅ›@ ö'Þ߬cÇZ0{WC@|„ÐžŽæ4ª@‚’ûwß½¼x–Ó|þ2õ~¿P{‡¾f†3Á�Î|¨•3ƒ™ýÑò®¶œËï]ÉT·œj;$|«Stz2Ü[:*ÄóSpHªä#ôƒF8C"šƒvŠ*á°0£q��ÈØsn‰�ƒÎÙRïåä÷Ãpïâ—¥•TÃéœJ %œÎ èG±G10Äu¯Zäî–š/ºÊŒ”ûûEpo,ͺÈU—A*Yæ•B:ἕºžyHÔoé÷~>OþÔ“œj°J´¼1§QÓ�HgJÑØS œ2 ë‡*pâ¤HìR»Ê….tuÀçe圣B'Ò-ÂÀ”̬íž;> ©æëý’±K%zú^¹+Îr‹ë¸ÕÖ:×W÷q'! W£ Ný MZ8jv3±G¯ENÒT*�ÌMG­NVªTíú&•èLý}¥¡{2×niªvumBJêÈÇsf»[wt<Oâ3'êíoz$£ž°QÕäè=´x:÷Š!(Ý‹1ðÍc[è¼z®V�Òºnüºšå„7òÜsÜÓa¼‘Ö;>-»ËügÎöèÎÂ:¤ÓXWimÏŸ¢ë¼±™LBõâ&^³mƒ[0éºÒÕ%>ÌýQT‹f·G¬_œõ¹pê××Gÿª_þï�S¯�:ù¼(ع:ÂåÀZ`û,UÎÌH>ãí=Ô×|*í­A£q“ð÷ow/B|üí=™çFéü‰þh(è«›”Ö€þîw#GôÒs+@eûÜ¡;+ŽaÈùw5f¿²°¸kVcv”kl`ÿ­¸_^–~|ÕBÔÓÝx¿CàgŽ;V¿eÑÏüO^×_ô%¿ÖÁŽø'»š�Ó»¥$Ý>ÕØ™û*„8do˜Ä=æ¹×$óˆq íï�ˆ‰¯åÀ+x»ÇÑåõ&_9È)Å£%´ Òék¼íTÀ*ó‘@Qg-ÐWfy5þe0±æÕß�9k×?üÄ’�«å¼BɤԴ·‡ü=ŽFÇ£ÿîz‚ ¬VÞh‹ ƒ\rI�§±7y=ß’ØükòÎF àC¶,³¢ÿvŒÐ‡¸©ÆéQò,7ïë~xc´Eøó1q¸<Ïå7±ãýÛ[_×|×ÉçÒ¾:óÿ6)/û±—½Eø“•Ö›ÝËWõ¹û6潕.þ-CLÆnõEG²9E{ÿ|RÓ­ápõ) êqN4Yµ¤Sõõ2£Jãå˜LûºH¥‡´Á~sÔŸ!Þu|E”úµ>à’FÍv9xœµçÏý‘÷Å­¿Çs îÇüÆ`Šó^­ ºŸ£*>%Îk²ðÑ˹Ë7¼¶ïÂ}heUÊO²‚ôÏj¾…Íèú�‹»Ž’¯�oQ T~‡Ûrß0ûì 5C!î�ÿÀœ/PÔŠWØÇžúÖ~Þ;ì²È|Ê$Ô©^¿4†ÞlwÝ)xö±t×Kêëkp=8Q§¾ò<Ï€ÚŽîï_}Tô5}áL…Íq,RÈÙ½±N³z,o BSä÷Å'iпÏ(…¥Hp6ô_Ð2d£h¯'÷ Â�\5¿3€$AviÙ• �¥@ù¯‹*µóp2˜I§�‰æÏkúö¤ÀÍ_G;t툽žY©Z�Ï=:T%�Y©Ê‘T§ «·¨JVošÚQ41Lí„$™!Í3%$¢}ÔÎ*T¦¤öT³~4NîžÖ¬tmæ@‰¢:ÈåiÇ)T¯žáäï§_ò ¿œì× EærˆN²V'W–ZE¤ßÑJdÝ3ˤ:ëAI/»’îk˜à›2[�ˆ¹’*‰:Á´F×£óÈ~QQ]‡šÔ„yOs;á95¾Î‰UQjF·3gUrMà«2'D�¦5$š:ëL_C=Q£P:Õ£•‚F�P·˜×VþÚ¬¨n½TŸÈ�à FF²ôLzœßÿmKN ¼QÝèæ>ú}®è›Õ?PÉ'ó ,žD*j)onlLcÇ”C÷‘zÊ,B ^-¼g2z»?Kš�Î.ïY]Ö²À”¸>ï“ò½c$µûáúÊŒ�ôh±Ô…½¾ð›ƒ¡0„7þƒ/,Ü[ãV¯4!<OæØÝ³Cè¤�´ÑŽãníü4W6ñ™%¸ÃòÝp`§—¨²."š¸Ïad.‰bZ“w$;7îÉá#�?â' /@Ç©�¦‘LkÝT�®ör…ÏÀ®ìŒô>=^K ÏuŽ®¾ŠÄÉŠßtŽ0˜£÷iL�ŠïÆCy÷'ÿ·�Î{E�Ô+Ûæ�ÔWï‡�ˆv¸íI�R;_£ôSç{öJi¤:õöò æ.¸ù§¿{_ã÷ç÷&à› iWž¼yuÃïE‚lª ð#|ç›ùƒÙLìÂë³]3Éøh+B1Ï›ðK+Tÿ±^_M�þ9×$·2±Ã—UÝþ]éõÓG=¼R ¥ÅvZYJŽ„{»´ù#ý§‡+ò—µ—§Îé/æ'™ra\ãfå1îüŽ—æ©XÅÇ?¤iS­yº5 PÆ–›ÜXÓ Ÿûdô.¾ä–ÐO¢}ŒçvƉëwj¼å&MÌ ©÷ß'Þ)y�-§I9í³Ýœ4i�¹/§í†òK@]ºéÙÇ—S'mdü~FXcµÑ(ÑNé« ¸×ÁÔ—énÔlnG×|—Ê>Vw)¾‡;‰?pödÓ–ÚÁßíFA[/¨í6S+^¡mß÷§¾mR·~ 2�ªc¾ˆÃ<Ì1 ù9équÂí²ÂùÉDÞK©™ÀçkZc:dšßa­"{í:3œ¬AÞõU+ô�nü|RdôÃ…„ËŠA"§ ³ó”õ)\káüç¦!ÎMog]Rÿ)ͨCó5ÑVœ˜]pØò¦�Z!k*ySÍ X—* À©Áª(ÊZ8„øÒ_Înü}¸•Z ¤ì€dmÍ”Z�†GÑ\ëüP�KhtE5õÕ¨J|%¨RÙg=�*s}áCèê˜ÿ>þsÝbcÜÉÎZkÜl®¤«üìÚ„W´:á$9œÚ‰vëw7QÕɤ÷�Pj€Óœ„ëš²7]kL Êq<�èá%.Dž"r/� ˆpªÄœ¡ƒj TøCÏÊèÔÌ*ˆ3ÅÊÑè äž5ZR¤Q j͹Cj­åID²:Á ÔʵçòRópÍJ�ÏCŸ‚£âèÚJÍýØfLvËnô+䮨tQfàƒë¹À†^l3Cz>*:Ïù¬ê+EV73î—\�êv ßîåþ@Ú8ÃÊçDxV®å‚ˆ[Þ Ê…®î�9õcj¿èR5-;nÏÅ_îÇ�pZÑ­v1á™3ï÷ºß·zYQ��€ù¬>¿äú…Õãýª¾ÁF…Zå׊�Ä4EìBTœwùúã~_ÏW•°·çX°[ªÆfì—cë7Š¡Î-’%énhÏp?�êªæ5«¯�Àš#+‰Yd%HN~½×÷ô‡ÓjæÍœ}úžÅj};ÜdÖ¯“Fz*0µ#-®ügn‚Åb“Ì}jß„N'káÙÚ[íÀî•WÒWç—Û.îm`zsÏH[ïÞÖÄ#;ÅeÌxï%$âŸf NÊ]H;ò©H?ØÏæ�vR¸·UŒá‰ì�Þ«ÈøÑÐS[ty*îi€ŽWÒ„zZû³Ç®Ò§­®æpžû]X8Þ/»?¾ ‡ËÏôU§<9›2ÍÍæ`,0r*ïÈ|ù¨Sý‘¿šmg)‰r9—=òyÔ?Ó(„ÝÉÑŸ£Š¼«ô¿²dÁ‰è _ ®#R o|D'KÜ~Ð}P³€'ùËñU…�Êù³q�~:¡Å Óøá¾Ÿz]>Ð*C¬B¤ú&o]¿¯ó.g\æÞ0b@æ]ÏbT»Tò†µBÂऌWE ¢p�ˆ—=Æaü88,’Tá"¢NÝøïÅß=ËSkçø‹ÿ?Ùûw\¯)üæÎ=o�àý&yãݯi ‘:Uf£Íµ^|ïAP©+êRÙ阚''8ƒÞŠw!PôЋPm^olj±G<ˆGKËïêÆ ²aJE1—7˜B•Ÿò�‚#—õêOggS@]Lm¨`.aç³êÿÿÿÿ-ÿÿÿÿ%ÿÿÿÿ)ÿÿÿÿž‡»‚o¨ö{C­°w{àp€y¤P+^á|Ú?ÿØ»ïËÐMunÙt � ¨ñü7 ˜Nó¿Œpøl A–ˆlô®ÔÚÝM„ÄéIZ£ùÿ´@ï–,©É™ˆ¡‘m¯QÑ[¿ÉO«Sx¿É# Hg]É]à8‡¤mB-.’0Mý™½~ŸPk *Û³fFW¤Æã%Ry'¢ÉÚµ�º-Ìä¾ç°©¢ÿXײ¶x+S�(ºî994©ȉΩ*´ ɤ‰V§?§—Ä\JÔ¹áÔ®RöVè Š8:I¨ê„ÀTs%P©¿ªä™5v2�š¡w´j^¯5º�)¨ºœYƒV¢µg Iꬳ§8zR“ÈÜ!º�¢Fô1EÖ5»F0Gjæƒ]’ïçÑs$=GsÔŠÎ"ÒUëAÕZ<Ì•V‚¬ÑÚšd­è„õpˆqVº§î,ñù—?OÛá Ñ"GS§zDöüÓ‡v~öc:ÿz¨„2ѹCÖácߤ6}6ÆÖs›È­âÑíJ¾÷¯ ) €œˆ•¤v6ñ½r}²w³\lÕÎË û¾ïD2vè |ª>§ÿÓf>vöe½ÙüîûÈÖHwŠ0`ÓbžWÌ«ÿí^@ôñù×ðv¦;”®ušö*Y7Dã¯ÕM|xÂÝ�¢ÿ Ò<$@à*{yÒ�î¿­{Sš‹Ê�0{/ÜþïËï-Ø~ñ™~üS¿i?-]~Ì£T�YŸ›¾qîçËpó«Jís6ó$Ë$éWs¥—ºN4g ¬¿ôŸˆ­\£š¼tÿú^¸v=pÓ"]ÍæÑæ8ði ZšøŽz}’vgPí㞪æ?Ï­hî]êµô´»œ:qg2†"TF�=2ó�¿o‚‘3ð`ë®ä Ÿ%Û7ÜYóô¥µŒN_?­?÷öDþ¯·ì¨ð´=Si?ëÔvgúC±ÙÌ©‹ –û÷LyRÖî�eƒ´w©Ä´µ`ïSœ»õë¤<öK½*B_íÚzw˜.!H®úƒRë¶0ôïZNkGu?ññøØ­ÊKWv‘š`?©uºà„¥~w8uïÞ¿+:vÝ×p3TÇÀï哾–r¹{aƒŠ´Ú¼†Ë¶'Ë5ÿ)§þºªr6Å5ç•TT~qÞW¢+Š®¬AWª]×ðwh’¢nnXBú•<#a›£þÓóèÔÓnc—eƒjÊuÏá[ŒÐÎ@¨jm%=O�Ý0¨;öù¾ïÁ=«›ïq%ÃîÝqKpã°‡Év„‚tKøîäǸ]„ëÕ!.âí£¢órÉçvw¾<×µ^æ÷G@±4B|ÚR©ûxY•!÷®è‹g׃ß™Ÿ]…ôÉ6¾ a; ¡°ýÀã‡Ã4ïï¡¿€Ãö«ÞQ\y¿åà‘à(ž‡»¢_Põ{BÍpxûÄßÐãÒ-Á®¯Ðº'/ÝônMíì·NUÁáY?ì¡À9vɲ+¼ÞòŸ¯IôÛDÎ2!I‘Ø� ¯‡y>j¢s«ò5¡rµ›“Ó8Ãï.,ïp»ÇcÆ!óävª¸AôcyÈ*è„Ãа&gYäœÏ€ví^ Iõ¤%âá8¹ñ¬¶ÂÊ~<Ìy¯ç´ÖÌuÐtÄiœFfZòÅ>Ý2“2S_MQCYP@’6L,ý.“§Ì_¯¾Æ¾xÑ«g…÷ãÏg³*û,¨n�E¹ä±‚ªn(LF¯ýM÷§¯»ž/5:�þòÚŠÝ\R‰i†³ãR~þB‰Fr¦Ò¦ë´ 6åèáWJ”&}‹÷n<hr½óÚ Và*._­˜æßLßÞ�¦ñðäq:36ß^X& —/j>NÓÿ´‰",1è 7Ž c/1é•ë~Ö¹|›m™È7]ç5ùV�¶¦äÉi+çøèÚÓ¾mðÉæ¨½{÷Ý™‘¶ÉÚ°Þi²�c²x^mÂ…ëÌ[óìª,ºÿZ‘|t� •_ªÅcõ�_+9^ñøDû{I¬[žOs¾t±Ãèí¡0zl{U7”Ngö�÷“`.æÕü}äóžd* Yâ|;òhW㵆quŽù¥»ª*Ʀù=yÑíX kËÝ@�=IßíÍœª Ê­íÚŒ>ƒd›Ã9…©ÆÊ”xJ‡7å P Í—Õ#µˆ9ÌF…Éí9]nóðEë‹�$zñsT-¨ê šÏ÷æfÁã¦ÂY¯÷xrŸÒ•¥ß._ð8dCHGíñIœ~io�Ééô Y >õÿ/xw~Éß:]´ ’>n�¼VLƒË«gì¥j~ÁþûÚtêT­^zn|>UÃÞÅwö'ïà±õ}Óß�»±Xüœ_ §Õöq¬C² t-£»ÁOåÙpA°âX‹lq7ÈðË+l�C¦©ÝD9ßÙ°µ1}$y¿ËÁaBE߯oP_¯ß,¼·ê̲H²íy™–ª_pÛœ—/ÃÄ€n}c>8¤TžþÞ×éx=Ý `ÌZp¢¹åîXÀ?™Ä"¯#‹EiÀ¾v[•oèýÊÆµf²‡{ßPþ‚<7Ô†WÈ3ÿÉS;ïÄ'Ì?ù•‚lé2ýjpÖ~’8Ó:7Aɾ>¦›?§Ígú\" n‹�Áñpð¦$˜…O±w¦r?_¢AÅt¿:áœC´ÖêĽ’ßò—�ÿ¡(‘µ„8óáJ4³\sòD;5Q¡¢Þ/Õt ùÚÊY!©BÖ§DW"’²O:‘ŸÑ gJz鎂 Bm<ºxðÎ$´ABÖœ½Vá ¦F¨M@4nfj°Ö¡¾Á^k"NÝCk­]£tæ%õtÖ㌜ë\EUå½W/ÆçõùÚÙÏ/Gžz Tö)"È8ôü_·¿íoÿ}|ÿ~_$¥:uϤ¥Óêû\iò#ºFsj�Žƒ@h­õxd×ÎB¾S©}h�'‘óèè>ª"t@p5E»6ݬ*õ8@!1ÕîL©U¿ÇOóøÓsXªçï5£›f6îÏ–{:¾þq‡ìbM>UÇãß~/ûóðYè. ÐŽC—fá‰O?§ ^—Ñ \Eõ…=”ñ³åA¶Y={ºy½ÅØ“—po~VOñN¼ºÆG¦ôò>¬áNæš~0–º8‡ë¹N·Ôµd*»˜Pÿ•b_Ü:„ÃX_8rn�ÎÓÉÈs8­$/æ•ÅùuèzzÝ> Ÿo‘/ÓÓ [Y{A^=�¦bû@õTk:¡û¤ö¦Ëƒw”ìßrpLI á©B¬v’ãßûH�ò—NžÿæñôÀ,9êìŸßÈöš¬»<Œ +®ßFàõFÏ™Ûg¶©öäþûP@|Ê’i_8¼ Ê´‰9ø�àò_LŒæ¦á_��/Rgã”Y3)W�[Þ(Ü/Ðwä�KíNõ£ý}Mh嬆še<-çì"‰=:“´Xϫx`rîˆF©èÍ>mŸ‚©%Š˜ý[p¿y M©ùÇáP'0Ã9‘ ¼þ±ï]í?Šã¹2æ“¡T­çèÁïyÛíJ–è3�kÎõBívƒÉÑý�%d÷6Ó@8½À™_%—¸ñ©�_ÑO§Šíä‡�îóúªþnëè%½»’»c�ôc^LùÁ�Þx­þû‹>½—®·˜¹3AcŒ�™Xl¯Ù²ÃH^�jƒÏìjÝ¿óIð;Ñ}åÍ¢QÖó?WôCÞxºçéݾtê–_)üûœ£`fQöoC¸ò�ØŸ7ÓžÚ-ÕûòèÖkñ•)ís^Ÿ¯è¯'h HﯚÇ�4Õþu&Ó|Ò�Î…ð›Ð»®>åVTcIerçíÿ|¢´Ùk[±Šÿ«Ìßïìû›¦Q s}»­0|&Ù®ÌÑèGÎ}›ïéuõAqCø;xο?pSŒß½*DðÕîlß©›¼d” ~‡»_ÐÛœ‰»6ìÃ=È_°Ï(jƒ˜ÇŒÿü±ÿséYç;Ç}sJ-(óǵuìéB·°> àtEÖá¶Q<¶?pˆ¬�zL˜?ç}ØA�™h”Áe®MÕ$:0�ëï·+Ñ’<^EE§¾®ÚÇ;ÉË�Þqœ ɉšºg ü؈l*žtÀúÚ¦rj¤r?ë×ú�@&•zݯšú;=�h§tãf_쓈S …œof•šÝz]ýéQ)hm‘‚ 4ï²6¿çFŸõ¯FfÔ zr:g^dÆ¿Z¤ž!Ò^Ö*«Ô³ ŠEÎ,"ÐÚE\“OsÛ‚qŸïåi#Ó™"GQuÒ–‚y­‘€&ñÎì�•*5™S!bª¡8uòžÇ×}ù÷ÁqJ6™�þ4ÌèݼïeNOïwj§„sTÉ–†TD�îÚ!ê‘VÉÈ>DU#×Óã_ñõœÞQã¹ö˜™åÏûLßÑUêD£ÙÈ“]£2WjÙÁ_ýܶ¸å�ÌÖéOíJtWޤv½Pé=�˜%šƒT¢™B’,’‡²à'¶Ì�;²x¢P™pdd8줿¢ˆ`ûœà™#õø'›Ã´iùô;ë�·jXPos\oÞU‚‘RVzAÏN¨K7Å8“zšú³œ­‡Ök¸8®ÌZÞ7ü„ížP³ºÁö͘óËh@Ž`·ãÃDP¥¥‡8“Ÿê Z…º˜e 3Á‹gúUM å©äþ� Å›`oæ¦pF ´içƒ3þמÛ~ Rë—ïöRO¶4#!.~ß7ÿeÍï¡îÃP¼Ù]±ÿ.Ꭰ…›“2.òˤWN2÷r�:�t½®T«ÜhîÞ¢çZY7¨cˆãc+E{1Ö—SÁÙ}Åj½Zoø?|ûÖ‹�Ч+—±r¸ü$àÎwdÌuz‹è:FD�ð¯{2é¼»·´œ[þhçž “ÿøX¢›8­þ ¶B_‡éãÔÉ›À9§¢SÚ2|œA䙼 n ‘Nê5õû{̧ø&O Î\4SÆ0µ÷¦¼ù-D"ÑÛ�„Ù>Ç?¹7Þñï�ëZïìÛ°UáiòB/Ü%÷½“jþ}“™øŒ{ýÇØ»_¦+²wÀ’�g,ëhÏ@’¯Useï}ã:I t6¯à*³Á–…²-N|÷�^NEµ9ÓB¸É�ÿU5 H¤hëÒvÝ´Ÿ‹«ÁÛɶeyàŽè¶%ç±·8Aßû Ö»ç^Œ®s-µ‹ç.ñ-a?�pº^=Å[+T^¢tmjWÚïEÖã£ða¢P¿Ê_ªÜúO©­Òx5“Td÷ÅõíèÙÔŽ?m®j+òv“‡ƒ‘²×}IÛ²�Á<ÜÙ?æ•.§×ýôŸUŠýó¸_ÿEñì¨@OggS@mLm¨`/�I;ÿÿÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿþ‡{±/ À98Õ …¸ö ¼½À€Ûº¾âÓ|tß~“Õ/\ˆñøg:‡ÏÚ ÌªPEI„å)[ª[:aÎ@ý9Á¤­w›¾=ä2ã�ž0Imuâˆ}r^—¿í¨°>$ö£oº*ðÙþ’:`�4è/µ+�)(õïh®Bí¹BSBæHZ�'ªS5U•Å©Kg)M~éØ� ûtûÑÈÕ3)A;•(”G‰8’ÎÌJ… jÔ^¤¾Öpª¼æª"³H\R™�Yê.9}-2«×NP}†N ‡¨™k,ÄçðÏ1ýmûÙcˆQÀô­jêp�®ðH~ò�Ï ØžT¿¿Á„t68çò}Iú,GãM!L—çê`<¾ËØU¢�ÖĶ;½çµÇ7ª¨L‹ûÅß «ºgq(0yèìÿ¾}ŠÌyɧÉJoîÆ¿‡ôÌxé”Þ™qȽçµÍgK…ïk»IÖuJ+o$m||,±J®Qž”�FŹÅpœqµ³˜úÃOg@Z׸M’›#îy®�ëJ(Ýñõ3¦wh>ô_pu Tyæ¶]�›HDëWZx˜÷…N4vMðû%ÿמº5¹¿ 6ïA½Â˜ñ“YÕ¢[o¥E\Ú.öîY‡±SAœN˧ö‘ÉÛšÏñ”�êåïÕjžh¥Ö%ëWnü@k² Ô}“¼¬™ß|Oõnbû·…]PWÊÞ‹/½l°øU¶ËöãGÈ/ë¢yÄï§Ó%(\.râç¾—ÖÝv»›Æ~ɳ¯yB*Ÿ…êFä9Žà­xY×›žf˜†õºO žd;’¼|l²÷«`kÕ]Ú|Š`wzt°‘ªDûúÛ¤§TH§¯r?ÿgâ»Sº÷ÅLZ·¡0îŠû«Ÿ·­ƒK9ø¥W�RÌuiKOó¤EŸ]«¿Î’ï†ñ�í/+ßëØß¢®�z̉ ï½žÜ|Iö´™²&Ônò)®ÒåWu 0¸ô>Ú᫃ê` �ؼA•)CF[Vê?ed8l)ïÖXCn¼“{• ^‡»_PýÇàÞP+6â~ôÔ|�t VüVB¶Ï¸�:Èc›ÆUâùg:Hˆn4Ћr(�³óbmòËC ¶—*7zPQ jÏ¿ò ºä� ¥;<�üT¡54ç ¼�ùç®aþ á±/BS½×¢úIò^¿P´Vm=h¤)ô¿W' 5ºçU¡w "ƒJ”Ef?ÿÖ‰ŒÈògöSdy„8KšK»Ñ_~`Îcò5V~—¯.ÝÝݹ]+}B­U»_q„fWG§k¥qœZ�<ˆ'f©m¾´¢MžU† õÙÕÍ;GÄ>HGgQg%H€šù�¤NPÐDjô»U¥õ[qT:šЃ®²!þ”«ªS×Z3jŠZa¯¤v÷ÄŸPP‹Ü»fÊŠd� ¥#ƒ§FwEfT²å\‰Œv÷ËíÌê¸×žûømÞËfÛi•ôJft%¸ûœ)׿"ÏŽÝÊ••ƒŒAbìCƒk%ÎÛú ì£Ý±L“öå¼MÝ | MÿOHB›Þ©“Y^ŸBùnys:õ‰�\^? ÎîvœIþÇ ¯Uè ¬šÃ>–g�ßt*\�_7òù‹þ0Ç»Þïd_ùz7]û¢B¤õ-æv<‡ñž-Ùñu€3ØZö;ð†‡âÛ¥Âé«•?÷ÉÚMö¥£g&0aÒu=;›cú Õ»n>v–˜`ƒÙû盾w{ ˜íq µ’½ÛþÀ<*í(S^.)3‡§`™8Ö± ‚xPûß>G‰/R�ag˜©ÁþΙÙûÀAGɤPÈO2îu�q‚�‡�Dj¡kï9�ƒ å_;†SÞ,Û� 03ª½^ A¹ÕûœBוv$²€þû½qÀ¡÷xãÄ'â�Î1�@\r%ÍÎÔ h’Ä™r@è\8úKÔ®Òƒ|Ÿ$ŠÀCB$�¢<s! ÒM‘/‡ŸÛãQÕ#‡¿}ò^üîÆ|}ºûI--ëYÍ8@?YBj)¹©ªCgN•O§¶ìι÷¬Å*Ž4@Öy*&xáJ*Q³FHWqjw ™ ·Æzºõ©Ö+ãšmÈc&+�tïH:/Q³32µJm݃:8ÅL¡ˆÖ#¹×x§ä5gG³w¾tï߆1Û{1¿Gm ¨‰4Žê•OÑ)Iç­sHmŠ)èÎ¥• >ZœÙÁ€$j8“#šÝ—ΑJH³×:»õæ ¥™ßá�˜ëé¯äH$#+X£;©j+¥~vãõi:ë½]ëöߥ|g§ÚDŸÈK ¡ñŠ¢ˆþ+3¡éx?ú%´�†�‰;®MÞ“�zmUÉí&#e‚¦è2ÔvEÆ·ù]3Yc -K½Û¤4Ž]KRˆe×¥YqxìÔ�™õƒ‰[N ŽxA–•§v)¦•v. frú¥‘¦WÔ3.² ݸ–s�×8ïLwšXšºP(e´Éô‘çž~–ÕŒÖh°e©»íd^F×¢/¥÷-çµõâÿ¸ëùUdÆÅþùztä7ýô÷½Ž}x­jæÆÛ’;Ø»æ�F�þVg‚açbíøÆ7ï¬>R4™I㣯˜Õb˸ .> sãîL�ËO‰SÀö¾™‡:aíªÏ¹úÜœ¾à�rí[÷b^÷/ )ÿÁpTÚTp`]ÊAcæ2H�J>³TwœC¹[¿œïN¦ ’Ÿo9×hT\|†]ñd|žœ3w{Æãùû2gn7l‰d÷Ò¦ô¾kïòþa̧ù•þlœ…IØ#Ùìý˜� :jŸ„º6à@¤µÃÃd΃ê&›3®{’Üö²=÷ ¹]G±.ãk6W›>>ÿ±âÁدÁ v•¥ÿ`�×õ娸s�€?Y¡¸c. D%<ô؈-£³ÝÔ}ÙŽ·wD=È�fwž\ð{,ß|Ty1ë‚¡nô…qµìw ,$ØÒ¥LÂê×s?nËeôÚ‡éûϬÞãן«"»¸ËÛzñ6é™Ï«ø¤´¾�uº0dÿ´Î÷É·h�)ÍôM_ÓÝuq:ú½íìþÝs«å¿öKxëÏ€qn/ò½…e—ͦ:6pÿ;0žÕ•Àè!0b«é}á�‹þ‡ûdŸíËž&j…>Ü ~Co/°Ô†°ØçpÕO¢%›âäè·f¨íþ/S�‚�š¨Ü{ü Î™ôr)·ò´ô¶#Ðry¯¹�¹€žú µÖÈ`Žº;5‰¸úºfÀÙ }§‚„î_#+ŽnÏUM‘/:wÝï8€ü»Ô"åÚ£xuŠ rSã@V² ÑZ̵ÞÅIЯYdpu•ŽŒZÉèu™»~ôl­š"ªš¹"µBÎë÷zíõXÐD¡ë¬ ‘}�ßQ4¯6œ#EsíR²‘šL suMLG?ÚvÖ·Ö<™¸�ÀøÚ[êôÂ_L.¹Œ gìК.Þë–{Æ©\˜TîMr8ñv”oÌZ|¤›µš†Ù³›øtn¿w �u¿+H+ï:qÑžlµÞe'ƒwwzû³·Ôr¼ªëÜÜrsÿÛZޱ/‘hý’sÖ9½x¡wÊ<ñJ~ÜkÆækxC8ôÆnT0OGrŸQïú5z"ýå’ð‹ØeJlë5ú⣓åúT~*—iÃãîTz<ÄxØMa~¹É¾ut}óMÓ¿÷‡*ö_æcÕç4üý!ÓÆ-ð–MÇ) ±þ·Ãì ÷üÝöφ49&OZ«^9Vp+Ù7W OUWfyáÄ`tyÏÐju¾_ß„M,×~Q×kÚ?21›QO‰J<”¦„'k ùÂkŽ¿uÿS¢Q_ÉYÍ]~bdX®¿ÎĨ6©çÅŠsX ^îç_R ¸\æ0÷×zD¬\§©]òÃÃ×w:©¸Ç›�;nª•è‡w¹¬ßá~/F/Ú=ìY€“!v°)mY¿M+ßûŸÇ2ØW’;â¤T3¬®WÝ$Ü™9É€{ÐcT¯‚:!-¢Ïi»[ec%úa%õþÒjžTÊI5|îçmŽ ³¥ø†_N¼x¾Ÿ,0lùŒ™ö’G7ç8â{f�ËñîðëýÇäOt¼¤é§ß'¢ç#h h'÷–@oA�Û³Ó¸ójyz;þ9,·_PEi?G.eå‡óݸÑ@wÑ*?À¿OggS@}Lm¨`0žÂï×ÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿ"Þ‡û�Ÿ@½ Ìmr®oŸòæz€q 6Ü `†anßu­©›÷Ž6Òí»Õ¡Fÿ©+2!¿e¹S%¢Õ»õ ÙçÅó«¡×y�÷Êñ¿’ Æƒ!O�»f¾ÞN'u­Ò)AåžµŸjË5Pyç�¯B0æê#Eå]£ôöuådKú»IBÍPõë>pd*IÍ® Gr†6’º ÐIß®ï@Q¨!™}Àã]9!5[Z³ötDw¤¤Èò] h…Lê�d÷Ù°Hd½ñ«TBV¤DÔ)"*Y¥‹z¼¯“¢¸ÀÒ½ú³à~ñ§ãžX×uoùs¿óç¼ì¦“ ©JÖøš®VØ»# †Z"m!ó³fíè�+"�`. qÎ8ø@3äMç…",2A%¥ëM¨ÆÃÔNÖÌÊ!©µÖkF‰ëß™T­È<9Ô&%äðB˜¢{yjHÝ“£KvCÝ©ª�½gq˜PGäŠ^žÇà—þ`÷QrA+Vâ:”]{bÜù% ozøjÞ�/wÓŸ>—÷°¼š6ŽÒ×£ñÞHëøÑ\¥&½Þè(þ¤ËЃ?ÊåßQHzk¡aÆõ pµûãLG« çg8áƒy¼¾eɲcš¹R)ºiÎ�wM-rNØ�ì|+cï ·'ÝQ±76KùJýœñ¸ b¯ÿŸEöÒÿÎo6ÎO¾ p¯V�ÿ. n±Û«š»ç|Æë›>þ>ñrRTï&I(TîÕÎXþµ+^7�ÙÀiˆØî9pÞ †½ê÷&Õ·î4Lù¹Dí¡k÷'p;0ÁïUîjëmFhDbêS3MF¼àhzùi…®äšhOò]'�‚ºÿý¹…jÃRàûSlÿÉa¹µFòú|SÓôø2ÝÍÝ~ƒ·¦r½kyCÓW L².\Ög/b„.ب’9×,%s9\*D2­É ì´9@�t‹¦ Ø«lamÆW+Xñš…Ê6dÿZ!œ«Ü®&ßʲҡe|Šü?”1v,Ðy~w{€OhýÆ�Ú0ðöÁ¾¡ïŠމZñ[¡´å1„d¨ZÀ÷§F õÛË.t‘¾¾HñON—dvê¢åsÚüB׎i¿jî· @{½y§«äC½L•è3Q¡eÿÒíàÏ^0΋|{ϲp¨º‡±×â^!�ǯp’Í>a8EÏkP´7-ý==Öï³;̇pè">ÍשA5iu›&×Èa ª�oŠÌÅ�ª^Qé2ôy?‚îZs€ZCYÕi.öþ�¢Ö½v¡J‹B6dSÉõU¡÷¼¢F×Z {ÃQàë‘‚TS-‘"ÂÞhÅ«N?¹3¹ÌNvÌ­ÔJ•Σr ÅÓE­LéT•h2óÔèŠ}œÚÈo4R$§¨ræ©¢ÂéxÙ´'ìG·F>þò÷ý&OeNM4÷®U©¬*{fQ«ûÜë|mâ$kWÉNØ™²V:$&ŽÖ¬3¡µRáТžùŒ•‰ƒ³˜ß»ªÖèBœ™®Z@eÖ®NÑ$œc�¢;pbª­"ª}É2Gi`è‰æ�0±#ôH �ã�b"»W"îòî¿)¨�ó­áƒßþtïDÞF ìÙ�]4iô º¨ ZQßžl©ܖZ=«ñ9Lñ%LÍ®¯©½;sæ¹§yÓÚÚ쿇;T6'°‚°½ÅMòåÆºµCÍÑj1hûRÚ–¾†»?ê4·Ù�‘?Ã}{IvÝGÃ뢭4÷�Ox�a~Ùžk¨g0Cg3;ˆb¼î›š0„îe«+KSêÖW/»³¿ü´·\ÍG´? ÓF~£ð ‚5YÊB^Q1&ìt\õÞBÁü}(ª¿Dm ãÏÈÓØ;Ô÷7„]£û-²sSŠ…î*i<ìôKªÈýâN¨ˆùC˜A(ödŸí/²ÕäÙ\êx~º8÷øt?Op8ŠÊ—vX•v£ñ•‡é3üµ¶lêá”t0ú 8xŒÌ9zû&1‹¿öx†[š#HªÖºV/·&X¼(߇ãü>a•}]À~)Rúrc~üïüñ‚ž\7cÔ•f4ñZŸÔ 娻ºÃõ&RFó’ÁÔ8çg4£Ç{ªs¿i®rRy1½ÿ§Ç–bó¥Íu*ɇcåjó JÙdqõÜáð(Õ‹)wõëêè/ëuß ¨ìÒ_«§p²Ž®wè<i6gæÖ”ô]=DŽÆKáû›¡’H­‹ÀÝLå‚ Ç¹·{…æ¢ ©8ÃJ—wQ·¸™áš7ÜŽwe§¤î¤7€ÈL—;Ý?R"ŽèFÛQj¥�+Æ«üŠßËànÖ±n’¬ò”"¦�šK×Ï·êôÊmdýIs¡t=øµ‡ÞâðªækÑÓç¶,$øbÏG?n›ÒñÁ¸~wûD/ >°œ 5“½Û'ý€VpNµá›€ŒÆ¯Ûˆç.³ŽiO?ÙG¨Þwê”ý'@>ê8;“žÓþšµËˆÀê0Ã�Ãâõ¬Õe5;§VY ­ùäËðÄùKˆúº5âLÚa^ ˆ/·ÿ)@ÆMZ.4}RH¹#hľ§¼ãà 9×lÑèNúP�lÍO™)DÎ>ÍQk6]órª«ºQÑI͵j©!¡52c¨ÝôðÖo޹»Î’P Šp‰ÚU;k?ÙR\hvÓY1˜e…2 ¾f4µ2íœM}Ô f!kÇÈSxZRÒ- ¬;h×ç˜"žŠˆFÈŽKK÷NQÏniDI}ætbª�Ó±ÏsÖ¹©ÐDfðChW�묚‚¶.ËY$ÒN­Á‘ÐI„zÔ}Šå�ªõ/Næøàô¹ŸÈLªG#{×Ê3"7Ne�ú‘­§'Îv„VGÅçH=5â·ó±åñªÖG›z4U�ò)îÒ Bgw8U{Ï^Ç^œ�æòÈj㟚5„;B Ng¸äî½ ?Mƒ&õ|€aHø53�ó›ÀuØxWV3l¾TèŽ*Ó¿à!q¾!`Å«ã6Çü± 9uÏMfVÉV»…Õ–26F©ÙVË[Q€wklO‘²%ñÝÆ –PbÕKÃè§M¦” O…�å2]Ëòmï}}ê­ýøø»ÔQâz¶8*’-Îó=k!¹óÊå]ùTïóJ^º¾\œk�ž{PWŒ’Ó[ãÄ�¸ÛGÿñôºXÍÄçÛ�ÏBJ»z ùi¢W 4M!R'§-Ël�Òƒ!ø4'ï óÊøY¥ÊYŽ7 bdï]Û¬tָ涼{[S>îÉ_vâÍ?Û<LJ`æxBn¿£j*Ä‚/n]ä›eáL¾·Ä_^§—žÛ$¾¾M}^¨$�øç?fj†BÂx¦ðTf:;阣:E!- Ì™ΜN3k¾Ì£»†RËI+ò�Ìo¤Q"Î�Å!5k\NÙNí¨ÊA*b4]\‰Õ«ïóÿe“ŠïçãÔŒ]ƒœ¸":¢vPkïµ+O­ét§Þch˜¤¾‚šP¨sLg‘ /Ùƒ�*žzPyRŒꊮêõ¯¯O=þëÔ>F;YPµ…ZèôªÒWJÙh“±SkgV­A-ò�Èbß™�]*“Ö@’˜�ÌŠÂùÚż“¡Uó˜è•)Њrp’¬•½ *EÖ™y¸î³SÝ¡ø@‰hZ=@Eë‘L‚Ä^¯ŠCd •ão¼æñîo%2¶ß¸•I„dæ@58e@n×’ÖÙûn)›ìßàáÚNðS œâ�ÞH½ãܪÀ0ÛŠ8ò-|{³KŒ+ä ÷�6öäËÜÝžsz«|³-u²´&ꎶ.Ð)É!uH™ê�ËŒjEžÑ�·i'òõð OðxRª»’5ñ% Ò*õ{ åCµï{¼ÒFU;®›6’2ç.¯â;ÒoYj©Uþ j²“³ª6BîÚ“X©7¿7Z5ŽÃïÏœöål0Žÿ@ìã¸ËØõ]1!$'õop1­¬wàë¹ÅS¿Í:~�ù?Á�‹>峉AÎÛlý­Ô3Ä"à{8XXÜY¨™Wþ™‡=ÂñDºe[^ ±§ãr›Á‘—i„Ý—zwá;„û|Ò_nÏ(ÇÛEËÿž¯ß×P‘¯ºªØöÊ �ÒsˆémÙúú9tð=N‘£ŒÝR×WIYÂ}áœÎ^«Õ…ï ǪÖh�g{q˜~i®“êÿ·muKíÿöÿ)E¾ ÙÚڕÈ`»@wlJêcâ .�¶ÏgŒ¨ƒûüIí§Æ5aßö-sûÄRß·V*ã-î[÷Ú3‚ä‰Àœ„Ú’—Ÿ$©®‡ÕYEöÆKò+Ž§Ê �³ôôç—2èÊ_M¶…­&óÛj .r{žè2¥Rë½ ÇÎ~·5—tïV.œ’p7KÔÙº~]!Öhå/+ðªPúg.ÒaQÕ/obâná�ž<Ö²žø�†Óü¹­›/KpáqæúûnÇíVüÎ{êjm_ÆôjÕ¥cö±�@/umYcNJÒþ©Ûßå(í€$ã›�ú�‡$

z®4Z4dÄ$¢À,dÇù�J±ç.Ù»ƒö)³ Ri§Òñ(Í£BÕ’=§59µkåPEª±ÔºËõ»ÿëçs»õo›P1_8ˆhºkSOº&U(‰£BÑŸµk‚£ó²K1s4(È0Gm=Ò„�!{ÎuÈß|ˆ«:O)汸/ùÁá§= bJö~üýky9´®e[­ê{$ �º„|S(ÚN×®¨sBŠ&ötR àYðs9ì*~ÿwñ@’R�8¢»C•JKíd˜¦Hÿ\j�A æ¹e)-9 Eo„í~lzûÈl©�R X*ô<2÷ Pwìœ^\ ¸ãxüç©·Ù)&'úñjÐÇ—ë‚öÞ+Ÿ§"¶Õpå%“g.¨jû½X_¹ÛG3� g…Žï2¬óÓ-×ó—¢…k|\ÉôžÅ|ÄÃû É£¨áóH‘rsTV= 9Îe$÷åèü%qÕ—è ”zÓ·¨¥¦­©yj4—›îÕäNbn ÏžŽ[ͦEÕFáÛ@1~ úØLKSŒÀ5ëŸg?Ÿîá ŸÞ.y·žª—3õ×`×y9åª�9#—*õª91Å`£Í-‹¨$� XKí£“Äë']©½G†çéº8’^µÒ´\åóÏN# wÊÜ줊y¿Qw¢4Ný¤ôª{í÷e$¸?w¶WäVÛјô]Øf ¿:ØfKäzuiøµ¹†¸GïÙiQ}³_]×]Ž3öc­"ž™Ü Øœy_çC­Ò‹Kê¤9uHK ï>¤í‡<)ÏvåRöõòài7yÿÀnã‘=3´y¨VÈÇ}6[ÕP×ïˆÇïN¨Å’uZíéŠRxJC/Ÿ¯n©ç3ÃÑr¼žÝý“b5 WlX�²l9çÙÞ_å«x§ ¡º]M•y>柹ûÒ¾ÑSl�.š},ÀQS¾ü�¥uÌJü¾[ñ£E¹ïª¿¤| ²=›4®òZp5vLSçÙîYØüL²uÕÞ~Ëô,¨h‹£Þ~«ÿ›¼ÖN©Y%Þ²ÓzäH¤ü™“ÅÕ ó¯ÐNw´;µ Pß.otS°pý ]fü÷ÿZÇwþv{€7ôùeãP;œ»½ñè0 u4GþKü+·Šäf´ù«F í ¡ñà°#æ\»q6­Ä ]wЗÀ_ßÝ8=øg°ß ºñì£ÿ€w#”L7 Îã˜ÈXê£+¤cžÿÞyD7¾ö9´P™ÍQ!n|^R_!R©GÚë'j:«A<…¯8»$NDÄ¢Ë÷N²:ÜG™Bãëá�þghÔ;A8�…"ÌÔ8jg­sãFÞ]n©ÇC%Å<òZ„þýëÇÆç!8ôhÄôqï÷žùeÅãòò8.Eºòœ@ 4À¡ÆguH2* LÒŠVv’ å 9'•yψùy,úßÁM ÷ß³èQ‹îºìä(pªÖ½ ²ÇãSÞ{p2wËcª+Þæñ¾ÞÉ™\4ÝŽS¦CöÚQ'Åy*Z©×8íhù�Ìf&:;8Ôl ÇÉ`Ïlí1sùÙ\F÷:úßž*%Wwâ(?ænœJ­´äú›Gîw÷| ­;²ÂÑÝŠpºI*u®TªÆÝ�\ª©c{×£†ïv“›ï$ø€!I„l§¼eùBÈõ08Ε6.9ðÓ[OjG �Òõìþ°Ùø7­vÝþ*{2öí —Ý �PóÿÈ@r[b8õéªo]nˆ&„Èןö› Ç_¦*¿§ôæàØÚ˜|sY ê>ŒH6¥&Øpß!c¶¯ã7¹?çüìùYDãôgx:ŒI{~¼êŠ&¶Åƒî(ýÔd²«÷ã>æk9 â”»Î~Šj6UÆ™Q7=ÌêÍse pŸö ¾DV.J}âg[-‚óïªyû[Ù³†NJõ”*£ïÝnuN¹ÝržFe3²ÛŸÐäÎáœSŠ[×õУµ¦U ˆ*ëy'¯c³±%é‹õzy)n ©E6äžytýÎn“ñ0ÑäfƒâÄŸõ³Z+~ô×À]§e«ÓëX‡á”û>œÉEéàNß/™\�îçe¶ÒS¥k8„¾C0Z&[ý+lÁÖdùôè3Λû�}5¿ËA oý¤{ò}gä8XÍ-fÎõ;»UåŸñ?gWéLlœÈú¬Wc+-Gûz-òÚ£v1u‰…]ÿù—ßæµJ}OçZ·HbÃou톸©Ùh»±ãEEQ"ÏD›ÜtÂhy»ñ×zri>%€,Nvc+9�?ŽNºò&ÿs�ÿô¿håuo3~ªæÐf„ËÌ;¾ïoèV\o?2‹¶¶ÔªÙ¯´É‡|ÆKXÃ2Ž{Ø®X Cçä_^&;ý¡ÿâ.´ëG¹'ý™4M½ñ8ærJ'ýG[ !î!×!׿µšòmûͼãúN´KÞÉ»;´Y•úõrú¤þ†»ÁO8ýa‹»fÜ»}Ѝþ€¶âÚð+ Ûr|ž–3ÿmºþš$@AôüO ‡²zy‚ä‚»Cå‚ÁÛqþÞ6Ôz+?à!à ß�5õo'˜B«,áh¡W Y#áÙ³p êp«k¥Æ²¯e•âjˆÇñ@g�³„h)]NÁ¡êoE}QêEBSјšZu¹;EEzº®ªLÍy4REQ©û?ÕQÙ#êR�}ï8º™Z#EºKgY{­ª’Z«ä¹T­R«´SIšcž…ò³ôüS=”<¤÷ç³÷[žýøYçño›;·‰CöM\&ÍèõÇó¯èºÝÿ´Æ,� rÈÇñûò�ÇUÇDýõÌšÒ DÆäã—›w~¤d?ÚüŠP¹tâh™ )‚2鲈!Šë~²ú5ët…xîFR\�O!ÕØÐQT)…®$uÿ"~�ŸŠ}TêÎxFÞ?«yÑgÉ_üå³-×~|ÈÚ³ÔJj; ) gE! » :ŠStlj¢™N÷l rü ŒžÌih–ûQ¨oOS(hàA% ᆀ«­H™.‡Å0!7jðÅôëܵ‡A¸®jÛÅyèZgeͨ93­'õ߬õ35óõD×üŠ·ì�Җ̺m×›AëSèù%³Úñÿ^·M»½Ü¼:Î9`ƒÇÖ·ªuöþ¥Ù£æ¥+Y僽.ºùµñ¸Zñ .SÆ»kDÛòUí”nßG¼_¹zÇrzÄÚèäÃ^Ÿk Õ%½| —ð(ú…g—Ë4£/§ï»·Éë‡ 9¿Ï ¼6ÿÖJëïÍYÆ=ðOGˆÚÐVÓ™©Ó®¸j0@惰.«ŸÝ!áúL¸ÚÚ‘ëî†Ó€¤žÑ¾™™²=Ä%ãÝ)ñwqì÷ô,=û·Ç¼�÷x~~›Ÿ ÍÁ×vTdÚ‰x:ߪ:êV™8Šj£ä!FW™€!�Ù \3vª6W ãÑ­Y5F‘–¸Â¦‹ù¿ +lj߿»Ö^κ݃ÁÍèöÓ.×áç5 ¯êm¦×—séÑ´ ËŽ8³ú•wE½ÚÁn{Gõ7­�:.’e#*£Ã_—AT”åÃ2æ tÕO„Öå›YeÓÖ•|‘©Xná�(·‚KW» X.K þ0I¥_Ø —Pù lz§ÃŒ¾èÖŸ¢8ÆåÕ½ŒX(ä >ë ð¹ ƒ™¸ç}­‰››ãÿ]D~5ÌZ¥‹ó^ûÑpÍÏyôb£ ýàkö¿ôù ÎÓ{"¤‰ôõ;„�rì‹t*—Søüé¬ü¬Uä»1ºÎz}2jÝŸ€Áûª¤Ú3ÖõîéଶZ|.>w{Êðõ )óX¨ënoñ†v2œj÷‡ÿ33æô;õW'�È”úì;œbv§úDâ€ï«M†40$óë�L‰oÇÆ lÅ8YjýcI-rHîísáhÃrV�v|¦�“”0ç³µ GÞ‡:K:³ó�Wrоc¨£Ìâ�§Õ-”ȸ\¹³¦%�œgrý3EöhpÞû�¶^T¥)Š*AE© ê¿#æžµFh@‘{WQ­Ugÿma´Îú¹äÜÇgj1×ŠŽ¹‘Ñ(ª£pECõó{ûù<|ÜËüÙK^ÝÏòѵ[jáÐ0Ññ1$(’³B¥Ö¤ãröʉZ÷®ÔÌT-ºöqËÐjöç �þ²¤O×?ÝÕ™çÃË&Ÿóœ×üãã TuªU‚¨Ñ@L"ÉÑqÈ¡1Q�#¢¸ž-'Ïgléç _�ætf(œv²Šs2@_Ԋε¨�Ð µ²s�Š| Ô j=’ª€F4ÄîtìH(‡Ôj´ÁëéŒÙÙoºjª�ìi$éÄIH¤óslÑ×öϨX*íw°Î±ßøók·Ê¯¯yíÔÅÔ^a±Â:î\i�’œ}[׊É{A1 ðïw5äâ« 3µ# S-g;Íázê™Ù¯Î¶þÉÈWÞ9úãÍmóŸ%¤êüšÖWq´êuÆ¿2þ5Hƒv£mâíoxÕì:«áê³äÅSä½ Oà³ßØcë|ßõ·÷Bä¬i¾‡«-7s.Â0�ź®À³¹ª[¸>K¿#‘!¦4±»óÿTg"�5¹Á÷¨XäÝM߸ûð'�t¹’KùÙ-Ì"¾vÚV¤ #ØŽš4ÍîÖÏŸå´Ù-_œ_sÞáD²^Vû à×V¸LÝLfód-Y_-»ÿ¿siŽ<°†§7S.ÊI)»¹òå(úº[GÎu±:�0›�#ûô*$V3ÃA„ÆÞö¤ø^'غHÒ.ñ—¯Ggm¬Å'ü‰¤R¡ì©ù#£ÿqÉàT^çgm€¥¯—Ë øžæ£Õ{âdÿ³ê²Aðµø¢+ÚEyxxOâþ´—‘µýÖªœor{ö=#ÍÁy38Ðr ãŠÁ évÚfu6Jöe|åEZwÐu ¢=Ö ¬ì~+ž·vÑK]M×~š[Ô~*°ÿÖx–k(LH»ÞSõºÀÀ͘ºúýk:EÚ(£Žq˜ÿ©¶¯Îî†%6ΚÝé<¦ñfŸÿ¨ºZÜNRk—•Òÿx¶�ÍÇ=»ýðï­Kd¿O{ N9sWçp][l–�ŸÛ¬—›ÉÀõ’ü{—Çv¡­wdÞf*ÒÓwo—nTÀ×½Ýøe² KµeȧVÞv»ÒðûÅ�ƱPÆÝžð ³?À>Qmø"�öÜùÅ¿úÉ¢[.ˆµÉÐ ºæË ‘rkƒ jœ\YD=*ßtåó�Sÿ¦€YÎIø~ѳNò†t2Zâê{ÏrûÐÖ}ýšEMšÐí÷®�SåÌÈ"—‚‚w>P³\$éT¡ÐaèæÌ‡öÓ eà¨Sît™ÃR¤°âù0þ�/–Yž/MáÔ¢‰"ƒ9ø�Õ]cªÈåè\Iu˜èZ$ª•>(E‹ˆì((ÙÇmùþkÖðóÈg£BT9 jg;¢�ÙÎD‹F]£¿û/_û¸Äãá³q¢•>"kÓO-Ô"�,暀 ìGê<îí–Ô“ÇÊ_nyºÁ–l×á3±Çü*ÐUr‰TuZBv©Y+áÀÏIèN¥âY¤Ä^�"Éü†¦÷á(j40‹JS+ìUbv³ã0µq�ãõ»ð÷ºÏËçdôK�Ô"8µªRc‡J8‘â8]÷“»R©‚:šÑ»ôó9<~¹ûàRt]œŽÜ¤f6Ï)‚iiÂÇQ!áo!‡<C€R RW3Óº\»7´û¢a¼‚Ï\‹ÚÄc”‹B*’Q0â<´[à83¦ [ˆK:‰~œµ{ø(슺ÏvòŸ“Pu˜c�, уeçjôôã‚üÿcà,º©íu�Fûg¡#M•î³&Nùß ÉéoÅoÊç5ÞlBg„~öîÈÌµŽ¿Ç®Q˜Š·!Â@«�è>Û.™nõïaLÃL—ªZÊŠÒ ªE‡P ‰¸�/�}mÿÚ“}å#ϳþyx’nÈõ—× &hö,žm˜‚£4ùÎ�÷Úϼ»lo⋱¦TJýz¹�É2‘x'sÜö½¹„R/k¸7Èeüy¢r=êç "1ѨJÊ soE“où;7Îwfgï`|¿¿8ôoûAìáª<ÝË WŒ W¥µV!¿£mR¥?[¶·çß;<ËÏ-�s†jÕñ$¬®È··ÀÉÝnðLª–ª´úPéY°vu÷×ý�胉ƒe`Q6#.‹r’ê•BŶzTÀûsËn�‰yšjdÁF—�GȾeA'x·K$×035_ã§2¿OkýÆ�Y§µµ¢Ñ0ÃW_¡î£Ì•žßÄþèõÒÝWÇ_%}J%ý*¾ëÚ®Ÿñ¦\¿F‹¬ŸdY3ÃÖ„B¤pÿ©Õ¬~ÉßÓÿÞl1]7Ãý�å “É`aß6¿�5î/v9Sžùry6EîÄ[ª7÷*­ )åŒwC�õImˆç�Û[3ùÖ[®Š1± Gí�Ðs­…1"r´üö;ÝÀXVFþûÞ®éX:¢~Ÿùت· OggS@¥Lm¨`2HœWÿÿÿÿýÿÿÿÿÿÿÿüÿÿÿôÿÿÿ➆»ÃÄ|�qp× o·‡|C[/È㘩�\œ»9µßgêìvÓçód¥º…Ï^’ùVÚ­T(¤¶¾‘ ÂñÕ+Ä:ß4ÄS ]Ý÷Ç ²?ðÚÓ©Mß—zB¹¸Šàh]¾ƒC®†ëóT�¨*•ãà<¼Ç�Bf´”�¹Ý7pâˆ+ÖúNgšD™Ž j¯W‹x¾èùÒ›ŠÊ¶"ÝÙ{“* æ�Eò·àSÚ¨�ø ·EŠñ÷ÞUA<ØêçŒìÏâ¡ùû8\Ý÷|ÿá+?ÉÌðítêÅÓO  È �RK\—7×x®Šùñ‹p´‘«´ˆðl¶$ßE5G QÙ!²•BÌY¹ÐñôJȹۃ'«äÂò�¬=OÄîášS×¶¬…ñôìñ…ñL\xí¾%#Ž­– ç´½6y­ï¢ñ¾ç­Í$Ì�´µ(&x^ÝË]† «�M¡>Èø¢ßJA¡p¥[õþ§ë&þÖïëyí^¿vá·è4ž Ó™–Y¾´qŠÑ´Ó~)ÛWN¤Jþ®E’»:æÝX• Í™heþWRqvþ6q` ¬÷{›�ÅÏØ_D@²ÕáÞ\J$½ŸÚ³€žŸ±¤L½}ÎF }�ÎC¦º¿Œî?Ô@T&ÅvÓ¿—j“k˜üü»a×øÐs>ˆÎ•%¸$Λ°Îß{A¾èç«Õ¸»Ù^vΤÖNê¼Ð Ø)·“Y]Vý~ß fó«Úí@5¸ºÀpS¢ÿ÷ê9§y§Ís^±Æ®çt(9Ž“>FœÅ5ÿåX4¸Z¿ŠÈR0Þæ ŽU¨�=°So¸2æÃ^§]â –î?›L¿ÆfCû\…T¨¾ÀBkþÕŠ3ê2t‚XkCK3÷G¯‚赎 Yò þ=Ôàt²ªhø,ŸÚ6á·"9Æ'K[¿(<ù*êÏ‚µLn0øO¢F\í*RŸo/ÿ;lKå›|®ä°`ˆø0äÔ´µ1ˆ·ÉËúòÇwG-÷ß¼:Òÿ´¤WéRñeŸM{);Žúùœ6þF,ò¡IÏ·Ô`Hs‹×–8«OtçåÜõt�(‡.Ÿ Þvû$oÐêEÐÍ[F\W+Þݾä Ú|IÄq,ÔF^�¸r˜–�ÿR} z+'‡t¢ï¬�ðo€ÇyÊEuH¨·î¸ó'ÙÝòßë#€ë|¡ÐcàF¡Zë ñªŽ“-äùœG¦¬´Ä í}À±T¥¯Ë«‰(„z�Úuýhz/=}\§¤‚s­?S R„D÷é rA0·>>f­y<ÍNOK-9kGºBµŽìhö,ùå>+½Uù�&פ½;Zþ¾ ôýÁ¯‚\%?€9/4½ªÞ$× ùºGÑ&r[$ßW£¶Ænj4EÀ{YLÔFT:LøB‡N~â»}îQ÷ ã§ r'“w©wÛÒ«ZdÁ¨³¼ýúÂlYeV^!µ¥«žCln»ðlÜŽŽÅßÜrø±[I¶•¤ÏÄo<¥»ìÚ/߆¡Î¸"·&>9Û$+ò}/*IèÒ�õ¬ýJ³Ó)ã˜sí­ìøw¾Pßàñ³R-ø6Ã%f½oä¼zZ‰§çñqQ½+ßmÏ4'­äoíS9W%²Ç[†K°µ×¬n55ê~Æÿý&÷Ë-.ÇoœdwÎÉ’]ПOOtc0·gr³8O‚½�"ùõÑ¢Êsî|ù÷ÒöC#ünoâÈÃ5-­8�Å�N¨ªzw¿™Ó¨6�ü’äÉñ-þ87‰ñ¯P']E¨Tû/ö845ÉÁ®Ès?µ+q‚Ò‹è¾wŠýD-Ü£Æx;~¾(5{2§Z}‚‚öö˜-z"†çIP³KPï�ú�+øGÄDµ½)Ð/fž1hD�v¡ï™Žög¾ôÍ©±2[�äÂõí¾?Û<€l·Új�Y­ø‚ƒ×÷Çm�°>¤èEžW×Ê«gãçæ}Á÷ö·¹*—&i-T\>wûÁwˆöcKäZ;Œ»½Ìb½À8PyX›uðÿ÷m 6Ñͽ7‘ÒmüôòFþT©O<«ˆ¢Twºw¯ Zÿ>²œàhh­ãMׇ3ƒ#jݳΧC‘}•á(­jüî/rЇW$MhzïÏâ,4?ô¥ 5‡ÃmºqÐw-Q´—©Uá‰îÌ*¸öY÷„È®ôI­ë1*#Ëã_ÞÄù~™+�Ôbœ½6'á¢zªÄ1Ãq=ë"ŽWNÄÇ�Ξiœ¢ª�¶ãNÖ•<î§eOí ÉT©3 t4uñø#ã¹�ºz»U�á• [’?Ä-¨ÍœE­€hEàúä� •ÔŠ‚2‰Ô*Tò€ú‚4¥ª278R©EWyiZ›ìéBQ˜Èl¢þÞÝN7µ-ÝRHO�])Ð'sÆÁAA+3š€‚2IWç©=O(�â �T(´+�ÃÁÒÇcþýcÿÝZ#LÉ ÍQ uš<ÀA@7BëCóHC£}ÀkÏôÕ05§`{ä¢0Cd±I)‡Ù™¤Ü#,[ n¯¯vê5à¾N¹ú«á¼r�KÅ<ò%ãÑ‹Ðny¯Ï³=Ü…žeÿä¿£[7D•í‡Ëí‚�ctç~ÆUÏÀŒÆäè4v¢¾xÐèiã/ëÑ=;×Ò­¢™ ý%½x]Ž?äK;ÓágåÖZžvU´:=Qž¸®âgø¨Ë…×9þÊNÂää6æ`—„ Y91.�ø²Ó2 n)C”¥y”O1É[u,/KFçM7Æ*ÛóDN›Ë}Áߩ௄ñZuÜ¿*?”3Út‹³Cҗ߉>Œ=ìÍ6n“3”¼«z?ÜrÅŽn¿ÏõûÎV½â™/tMÉQô„cTbÑÈ%|‘1 ^u¸’*Åíš~ )7¶"<æÛQÙÎ�“°­N"ëôäÍ�jdØ2RÙ~ºoPýÅ�æöR¤l׸TX޽Ú_*¶Xg5戇'ªpH¸„±ê)£Åw| »‡ ѯW }›íNÉL/齨eæPª}ýÎþÍ[y';wÃËõ“º•A�?�ŠÕóÏw.>øÖûŸ»ÿ±Ñ‡~õ•¯ŸNÕ>%ŽG¸`¸š_‹[wOšÀwA¢)s­v©eÝÂSé膯÷{ƒÙÖ›üŸ™êoíSU¬ÞìgòRF®h§PÊ\ë!̓þVZ”ßZ…‹~¹ü�}J`m³…ÏTkúËtùßâÈ­JâSèYpeëIT&_[¬€²Ÿˆz £ö¯Ýét®¯¾Èn¡¸Ópí¯?LÞoXÚn<—?]`ÏŽö Ök¼°¹wBKùž>È[Z/@þžv{Áh{�GŠ»6Œ»=ÅâyjÃh=úüú͆y祶5Àzy€”i1hHIݺ–DOw¦òHô!UÏk¹Äkšýi�…Úús§¯ÚÙt'Wh¥jÜÿ2ƒ§&•c{ÕLÐã�u:g¿@T®‰œƒè‹€ˆÙ)5�—†@e¸gP+©À$J O•SkÑR‹ã’ŠT­hBÀ‘¤«Ðtš§Bæôž"™w­[äêçÐóùÞ}=Ú•äÌF+õ »röÚµi2kh £™*%{Loõá» è£+�Sû( pbB� r=ôza»žfq÷RÏÎÌ�I&¢!bWª<Ú¿YÜWöç/Õ¡+•Z�Ö©ÝG•ÚÇ=–üØôÙ5óÐ�—WgŠ©ãCÿ:þH¢:…R@™»V‘¢+DÃ;Òz5àTº"U’Šî t×z"q`nÎîZÔ¹çqå3�´0 ëp5ûS‰ÜÕ|DÈLC…ÉZP' i¤²Kä.ª·<«‘öô½ýF¥ŒdÛ4Ÿüœ®øí—ÿ{¼¦ÅOd?e¡{Ì—êû�˜XY–�Y¿¤wûEÉÎržýñ¹Æ <,´—Ë<ãaÇeÛ»h5Ó[¸½gx�<—É‘I¶†6Ñk5?>à1xØ£²f ‹Ä¤Æ³,/ÇéH½'º¸ƒ¾�/¹~±Ö‚Ê)ÅÚ€ò�×ËŠ¨Âîk ÊhF}œÿþ3�6Ÿvw&¸Ê>‰Œ×pT³êÁn,WøOÿÎv;5¼A”sÑÉå žûaJ- çKfyéìŒÚ-NÌ ©L…/Ž-'ó´Ú¶?º^iÂvû;Dת:½âj®z„³)+TÇ…<|ªX¨}i,VÊØ’W'ÒxC‹º½ï©ËrÖ•ªù>‹[Ç»˜.(}PþsÃo,˜¬Pn''E«g¹’Öæ9íÛ-6`³ïH5�’Ùœ£|?Z_BÔ*UÊ›b¡è…‘É©H¿ge¿Wœ«—š4zVîé Wá0ógÂ%OUEŽªTâù+¤†{²¨œéH@-b“ꘑËÓõóä€DH¥S5`Ç^32±1:sŸýäÕ?÷íÏׇ¹;ÏîéÜþš3š‚T óêkä(]eô¦1Lç¿}Ï¥š6bzTÌŸW²TÈßÞõW4áh2ƒ”îZkv !œ©&/ ]t^íT@‹ªÝrÌP�^‘¡Cê•îÊϺjŠƒ‡C!Gš ;R‚Cö±8Äs:¶|ÎŰâ4�÷±‹QݸYr ¢Ì ÍŠxC´×¡:&_š*åðØ*ápœ"÷¬Hô¶,)ºß/0GÑ€’ÑHÅéU¨*à0Ùà òýó½:ÐG ýÛlÏY’™CätÇÖ÷ü€Mó‘íMi0Ô(A $Œ>KÔK–PYoÀ&ë.½Öã|§�íÅNòanÁQý²œÌâåIڣǛܨÝP—I¨ Xr€^:çcšúŸ¦^˜E…iMc™ztL诫ìu'ÉÈk÷æôáî‚tËãcâÑ·ÆB“²Q~Z\¯$¼Üԑ׆ÒƒÔꬶ:Òñëš[q%¦·â…Ye.Í/-‡�÷>9|‰ÊÁÝŽ{“)÷X¾ìŽï‡ÃÀXß…x£X§ãúf%VÛ¸ï”+¬ª\®âø×Û_ǽ¡ôéšbj�½×D5æ‹£yÞg_<™jy3fZ/¿ç¬mö‡¶zæio±ý»ò�Dï^F_k›g A+ÿ‡5=§z}ü>¹ÌÉæïc¤%7šþyì´~ úÌïzTãö1îHŸD<ÿ?"až\èß`âsÿO`òÚÛø×Uî®Ö'ùrµ0}…[^õwÕN…Ù‚²Ðæß“áËP[ƒg;tºCÙsª*8²±`«OœÖƒ‚Ί[W»ØqøØSÛ°&ùµú¯ß2ÀiÆÏÆxû¡½÷÷¯.ì㡵·k7i¾a·Ì3ëîþ”ãŽùãwüªÉ–pJhCº>aXÒnFœãx'ÎýÊÿ«j�º“ýmÇÆÄj÷XÓ1µ¶1ÈYß.l~º!ȯ)ýD9¿Î Ò­Ž|¬U1p+ÿU{ôÓv³º&2Î^í á žg¯¿½ÝSš�—BHüìc™ç–uDÚäðÕHœ8nb±zk6Xßëï[©Þ…»¶cæSkOggS@¹Lm¨`3NªÿÿÿóÿÿÿòÿÿÿÚÿÿÿßÿÿÿëv»Â'°¿ ;j#g·'{€¸D¨ ¯°Ž­rð÷ÏÑ48—çdä*×kBÏ:ØS!d¥‚ÒIe…x=@ùÚX`£àôGmˆî‡òÓ¢̇ÃBNz¹åH ·¾ó€£§‚ÏD¸·ƒ�\žJ•Ïúfd 7çs³œ™å pæÈ¾vâ¨9Ï‚S€LZI’&2o dôQ!tÂà®Cts·¿Î=8ÊB€£�P Kô2{«µþ|Fuûïû†šrH6I-rEÆ…>7îç¢tÔ ”" Òû²~Nçè¿þHgùÜ»éZƒ#@�úÒU©E7=e@@«àt .]‘91M.m"g¯½U(�¤N¥“·tÝwõxÊáñá3‚›Ñ"¡÷S•4|Á/ Æ&µ¾Ø°„ey…ä>ëôyðÓïǨÛ�Ù,�sØWÚsÊs)Ïï%¨»C&��Â[Û—2ËLzkÎöÊh¯C¤�§gÝq®¤èiŸ9à gö÷§îK»–KÜêÉ‹Ôf�i'üåÁò¹Ó®''™WK×ÉFšò÷]ʬ/È}<ɉòmDfæ)r*‹Y3›qYôcՈћ&wî©#›÷€ {Qd. Z› 1n#ŠÇ3D q�tgÜ.ÅœšßvA2ˆ*¸ìª°ûî2×-ÚÚó;ï•(úóÚ0â<&‡û»ê^1@ÜÝÛ»NœcTÖ¿Y¨Á/Ð,8X:'‡]ã³óú5Ù—A‹�ÝåÕ`uÓGìr-º8ÅQI«�µ¬¹Bläh|­®îʵóýs~Z[¢•m¯îÌæ*.v“?òÎ\™<Òi~Ê5–¾•¯¬,xu/+~hßù’Þ&Çü{·¸u�»ÖL’ü£²ƒFŤ›3êWpÈ[çÿ;µVÛJã³^žÞU2Ü9Šíñ!™žò6ë—Y�q餌´‘H=}�›pº¦…û´;Æoå ì7ï—§’WÊk:üxñ„wzR~�sZö<Í9Ûäírt¼„ Ôý«ÿ¹¯zZð¨5QûNíþoÏâٴ׃ɕ·ÞÂOn4šþ»zçªÞiñ¥íÆe¼ y©¥Û³ˆZ{•֫㉛�¨/}fÝG�Ýï?{”|M„m4¸Ãó_ŠíkÖ¶ö>K6þãi;.Ùý¹À´Þ®Æä{q“{.^:€ü›Q0Ðh”¡ *Þv{Ë'°¿ 9fj#o·/qúKB;#®µ‘W \±ø<ûØOJÈcüU$µ6Ьƒ$ÿ¾ËýÎ ðÝcfE˜æªÔåà\×"ìk ´×ê¢yéS\Y½J‘�CU7ö��*ÂNòµV-‘šn­ ®èéÖ>ö@äØôµ€–GW$—ZQ®µV'�’îï ©Ì€3 ©$U˜‰�̉«z\«¿¹oQÉÇöÈ•KŸ×ö¬•¤¦3­sm·’‰>Uw¿e.d‚z?lJhåÒQ§A$'NuöÖppº�â°çöò¢þÀŸq‚C€:œb!ÚiI”âTÇ �2ÂAªãþâO©¹{7ª<�h7¡²WÕ‹ÃvXÞŸGpuÏk¶éâ5²™Xöî¿cQ"Í߯êñX˜O×™C©E*•Ð`oG*NÓdÌÇCòû@å™<¯>¾,¢Uº¹-¯·ûIãÌ�8Z³­dh#Éõ»JtR©ˆƒBèáTjí䎞]�Y» ²Je_êxn*ZÜc<$G4�Ã_ä ðä·'"×–“½Ù¤é=[š@2€ï‚à,ƒmj°òfxÿqeú«ò»³Ÿ+˜„0uu-X+ÞÊç3:áÍf£=�4‘Ö]p7—˜sʺ8þ½�1”ÖEK7ì • Qy¼ô*Ò¬á ǵØÌXÄ=…Ý„�a—pö4Á ô¦Mf3´6‡Þž8ªâ\6`]J?/»Z˜û×»p-ÎWÕéìöF%踷½]s“Uœ|`:ú¿ª­çI]=H—œpó*½ùy2áÝàx?hˆ- ¼Ry1ç›^œKhíáf]ŸolÀE�³ÈÚénm?~õ¾3~ä´ø[¶Qw¶±°�´îƒõíBWñ%Ów¶�¿åpŸ9ðÛÕÿ&s“5‘wÿ1!·În-XÀðèP~v»áôûkjõÛS>Á÷„rÌÔ†Wè©�ë§V³„ú–Ejª€V¾fÁîáGÐ�²8«BèAýz*§¾ƒ“ŒŸ=ßȲ¡O¥®t<ìß=‚¸+ûT=¡åjÉ„ôίÙÕ!¥ÎS&ìæ›UàxÕ53µ]FDž’8¨ƒÓó1Õp�éš9 !Ë!ô9sUšS\úûû5 ÐZg†J€NtRÐ2l‡÷È<}NsG&×ñ±áª;½Õ1{Û§¯FüÏf¡LÂäÚÆñ)îË»�ا˜ç“É8ø�ÃI‚Ö.vG+mê¶]\O3éB.s=��'[>X�‰üT‰LŠJuT�yÔè«Ð¢�ߨrão>çOyAĘCW�4j§NŠ8Åcó¼¼™ˆèñ0‹HÄþmyó׊>.½§ï%<ï-õtËP‹©¤MÍ^#0æ©�I19tÔm©ûñò˜9ÈsZ¯çÏí÷$( Õ©1ñª§nǸ?Øž�ó�ǧÓÇ=­-þ‰Ê(Çð2[½±Ù¬ À0$е±¹æ}Þݰx 13OòàýÝ­£K3P•t¯>îBº…dLm8Ÿ±`‹ªwîç,ÏíVç‚&}O™ß‚5Ÿ×“YxLœ­,ÅÞ º×]WõQônÃ~Ë“"'1ùheN¹”hW;)�FßNqAãQ¸ÇÂqåŸ4Él€&ìqAÕqÐEqí¦lœ¬gé^t÷ þayÃK•%šhE…ìØ¬+DùÝÖµ‰ÁÖõohOíV»ÉÞø;Ýܯ«“�÷”þùV›ähÊì>‹ùXÏþ™Ý–?(FnÝÞþRݾþÝ�ÞGóŸ†&¼Ôgâb»œJ± ¥.X3LÄ>?¬DùC²óü7Ç”äAÛ¬íëe~¶®äeÊõ<À·¿Üæüý*ÍæÌÛ�YH!ãZÆÑµMºšÞï}ß"úö3ñ%hãî{�ʆ+Mv|#ågÛ—õ䫇÷�RÞs†ý/3G¼hƒ·&Òíx—ê‘w:eÓ*`ÃüoËzuÈtÎ?ìõ±'ò8þ‘î~^¿C øÙ“øœ«Ç2©dsrÆWHâl\â`d¬ßªpr�F}1ÅÁÇæ’v%Ïm¼ÎÅà¾ÔZJm.ü s›•…§ŒšX Îl¿˜mhè¿9úf+öÆ\žIúÌõ^3Ó®¼~iå+ÃS_ÊþºnU¯ÏÓÙ87ïuñšAJ/ª‡ú�—äÖ�n[Kç¯Õå7\¯wj—^~GG[¹Î,5p7ï‹ù&Þø~v{²°?€c¢VŒ»ý’7`>@92µá£`¼ÔŸÅ×g)xt�í§8`5^|”7ö„¹gÈN®ùê=¿,Ç ÈšW·üB�õá–¹:I.sÝbJ #a&îfä½&œWF­I/ÉB í¯Ó ÈT�$Ê ©P¤²5¥vÝóê'�ñÜÝ<&ÈwpuG‰ºr×Ï Í;î:>dN'VE}\*ÆÀŸŽôƒØS–¸VŒ0¿Ñº'ãÙ"Út¹WNt„Sö€x¹§sR¾¿ŒIöS«èÅžd*5ê5¡çXºé'�þs>Ž»ò@¯¢’A� üÑdQ»+Ž€8€Ð²rÑýNÕìÚ’j0×®r€RCŽJ8°2î¿Ñþ‰ÖHo¹ý)Ϻã÷Ÿ_^çÑÓÿö¿÷?öúù[¥{EHi=‘ ì ÒóÄf�kê�.��_÷¾\4îܖ㾞~÷$&5¤{ÕZ�ˆ}T•zrÛö»WsF"ȨeŸ)}Ç7 2´Ò‰p’`@ÅÑÕ4céÜ*eT†vVÜÖbMOÎÐjß‹“dÓéÄIâçf)¤GŠÖeSsrwþb/Zú»h…­iûi×F[õÊœY¤ß¸ñ\Hü—û½¹„ËXWˆ»¿6P,óí9U`šÁPƹ«†3ŸreGÌ0\=Ä€–…Òèrʨ1ÚOöأğ.[8¢ÓÈ >Ž�¤b=2krþ&ªØZNëgVaò¹�t'¹žèCˆ ¼"óVv>©[«ŠÃ›Ñ¾nUã¯ù ÿ†·åYäw ü7'Ý�'Šä•M¸5i+hËpB_„$dbU±üòdFåh·ÝÞ='^üå}›4xÔ‰µ•[/?WZã|6ÎξŒ˜�ãYS×àÆÊÛ„†;Tª9-$ðû~F4&íJ“û0>ã'~—›{ÈÓ�‚6äõ3¯¼zºOˆÅbÔ»®gYK{;V¬ßQùBoXU ‚7ÙûZX¸w)‡4Í#7‹œ{îøK~«waúDZÖ"mÒËÆ%šráÉÑ]k¶^ÿ�´ìûº‰¯ž+þ–N‡°‹�ð½OÝe³@Äѧ?©V“'l'H|§jÞS�³´u”ÏîɽX•ÀéxpTÏ-¿¡?ÝoírÏ_1Ê~ö-5ž,‘áLbÓÓv¸§¡¿9Ký;ŸöQ}4�NžÊ¿u�Ë÷ïÞ£¬g®ùù,¤¼õ„'ŠIõÁå8ú*²Âp¡5·‚ï³]wõ´K4ý¨gå'£]ÂZµÚ¹N/°Í *Þvû¦7ˆù€XÔŠm·ýöp 6rMäÀ@¼OL3óö³Å ¤Ì¢+O¤†Õìt¨ÜŽ}†å¢»ïµöûA ù ~íB�írú:y=’ŽOÔ‰xJ×P�i:¨)cö¯;rÞšˆjΧH ä®DGþ*ˆÊU%B!Ÿ»P yI±ËܨëSý8nQªtë R›·g×þœÛͼ/‘=�}„n²3Q N(²[µÈÆ šk™®?AsLðÀ)­’Z«s�¬-;Ô䑇ìPš«Ýd:$ßSõH*D™â; :�Ç5/¦Þ×þ"DóóZ=[¿LªäÃăúE¶yÿ¡<�Ç݇4¶XÇÇõ¾ù¹cÎ/úç@º¶†Ò{ÎCm­AÓ{¡BÓDkTf:fŽMÝëê¸÷#O]~9Ïÿt^ž�˜5=?Ÿs¬³Þ¶ßç½ µ©sU¥+ëã½{ôžO>óúºT²g@:]tMf’Èüþ~éýsŽûvøØZ÷œÝ?HÝçØQ*â}úù~µ#YðSƒ I ÜŸB;ï£ÖŠsB¡^Ú“Þ·ú …†á㌉Op¸ÜºÆÒÀï ͦ…›Ä²ÓkÀh º—?pS¥$œŸ¤çzßmÜ \£.ÒÃÉ”¨¸të ÍÃóÄTášñæ<üT_7¦}t”åš÷`f)¦Œx—Ð^Š¿Šëq·/Jd8¯%žÌe©$6‘]q:=?”š ‹Ó\²5;úÕlY¤jT½¼ß!îäGºîÞQ&})ÿK^ä~—Á5¸Û%l¿6Ϫ<Ôgþ,Ÿn}Yvþ vkbä:Öä?vþî½yð|sN�°œUýqŽ]õ•?�_ÆÄ_ì|,ô¥|#íòuKŽÏt…l�’ÆËEÞùZ÷p&Á—±€�\.ÇÓÇ¡+“KKõÝ.8Ý îrKÔ5Ó@�æMÍÓÆ*n˜÷{a“#âN§ãŸ+äqþ̱Ãðü’?¨“»|°>–+u<Ýa~þ³<ªñO¸ï›œò·=ÆI¬-¿Ç¾+4­J£ïF*/²D¨”§ÉÆØ#]n=f¼|?à�ª³X|G{;-ž–{oÚo¹¸Ø MΠζåÆEGŽ9Ç:.@M�gîÞÜ/7W¹�!×ÜË[(»ÍÍX>nKd*n�ë>´Êwk³$oýBŽ%ù›Ù5é¹d›¼•¡•œóç:Î=Зû5ùw.ìÍ?onðr%_½äU¦"…�&H�é†~ ƒA‡K.tñ®9Ȇ�e›#®á`{G©î¥ÿ¹ ^JÁêE~¡ÖÝ{{%öl¨›¯ROggS@ÍLm¨`4C(NÿÿÿãÿÿÿÒÿÿÿôÿÿÿÓÿÿÿØ^v{Ò;ÔyAs 6’vû`wˆùÔ†«ïñ£þ Ï_IÐZÙk>¸ôêÓ8C—Ùò®‚;¡ç‡óu3wy>;D#qœ79Ò’�Aê-¦wæ‰v}<– ‡ê-ýO]ÚðÖpd1׊ GYîT™NV~‰F¹‚¦s ¶¾T*Aº±<åà«"€:ìG!EPi¦Šã05¡ÆÖ)µ¶™G¼ÐA}Ç“žxôDÆ36þžUäÖ� �W¢Ì2�R?ûŠM®éŒÌDö® ÔSP*A6ȲÑ:i<rŒ×ÚÜeê1ÂØÉÎÅ”xæQ!ŸýÐguawœ¨3Pƒ…^äó3êø”ý�Ÿ‡þ­ãS¸Ç-Ø~÷±¾šúÄ8Îí‹çZú÷ñÒKìÍ~èS�ÚÒµQØ5¿xiVBÚ‰¦jå Ö§RÕ�=@kÐ38!•úA§C•VmŽvžR¡" oz‘‡áê¿þ1 @�옢«Š¿6¶ç±;¢U3æq«X Ort­ NCN¡�þåîçDÝrˆüÕ|:í½ , ¨c¤¥y"Ô¥Fº�š"ušèWá VÌmÔ­¶É+æu£’ƒì\Ã¥’ÄS–^sÈï…ÇãùaK>ì[\8ú³5üôtþä�p£{ZùÉþ9â¢û¾Ï¨ÿCÄÿèƒéˆî—%ÿgâòh 18R[¤á­6¾úÛ«óЧ‘Ý {x¸{¿Œ9ƒòhê`Ÿ—æЮè.¿(-LóQhØHÁ<¼¦×Œ.µèæ³j›¸ìºp€[·¹ÊΨ™ìd¬ oº��ìg¼�qø˜ùu†.YÛRzºeûrF©à>ñŠwÝ–nÙØÿbò×|ú½G])÷ý±WáÉEr Ól×EFû×¾»çqí¿€ƒÅŒTÓic¸9¥PŒ¯èzι÷ÛzKoí[³Ü SºG4ž˜eQ«MŒ"©5zcâ£;Çó<·˜µ÷>ˆ•uªÖý’¢‰wßqþ.^‰h1è©n€ñ^k²ßší°B‘ügÜ|"¯JTkm”B"çiÔÛûÕ¡úй<^rZQQ¨ðWø/Æ•)s.јÝ*o„�Ø¥}ß2x×ë›EâÞˆ†òÎ:­îQJ8=ž4�óQk*Ùù°TÏ= {µ d”Uý®ïóhòS"ÖU"T~´¹T[5’Ýœ}ÖB*BŪ[Ï^;ß^¯…õo°U°”}K¯ßGü¢ÖáZûžwÜÛ·î¿Ï«× G¯ê¢_5 ´;ÂÏ�íènÿlk @oc·Ü ^†{³Ð^ m\kƒ5Ü{€ï/àH¡6¼ÚJÍ£ !-F åúP‰öA¡÷IŸÚ�ý�¢v€¹F—xüðìš4æ? Y3?½H4¾ Î8µB¥ßÐL¥ à½ú„Ä Ù8 îü(:IZ~2j·ýËYLù\dxÏý0w˜ÈÑꀗÖ*Ÿò; O‰)Æ×8NÆ\"Ý(PQ*½3fô]öÏ/UNÔ2"÷ôÚ=y‡>q�Ú8KsxoËßÿöCló¤zuQ¤V¨y UùŠ@U' ¨qÑuè£Ön2×õO)na¾šwýˆC� SW$ÖAò¸mqøÍ8­�\Í’Èé½·ì}zé¦:{­$tÓÄ"ñ„Cîzç#>%SC³jEѹx$€È=²r:ÔZM0uþå# kÒß�È´ì«7ú‰ø üBA¯¼ñüÀëoZ§Zz¤zŒ{zKäaVµ…M$2´0]¨v{›ÝÚ’Æ›Óy¦ö½î›5JóBðq~ç0¹sžÏåläj†º"Á—èd×òf'¸@ª×•ÈQèŸ�Uĸ×Ë!9Eé�"…õž¯åž[g+&ÝèÉ7“Ó8\½�HiùŽO?>Û=C�RDZ¿m0㑯Z]O_û•®__Ê~ë½UÙOÆafþþΜ‰Z{Ž×ŽÇA¢êP/�ò®?ø<œ'ã ;üÛsôbß2ŽS"M®�Û'¬—ý«ön¤þþ‰-PB•üÔø¼„Ë««¬xÇÚ¡ÿ8Ø}?�ö‡¿›•8Ôb¬äE$ÜÊ)ÕPkÚ Ú <š°2�ßÏØØ÷^Óf–5~ÐçÍÊ{¬jâ›EèÅ.Bôx6?Þ‹—c0¥‰_<þãýÉ},¹äÍ¡móÇZÝx ü–úõø›Û• rðâe¡{œÍøMòÇò<øï\§ò� ~vû 7ˆù嘂¸6LýñÚý¢àH¦6üÌq9ŽøóhéR :£Žª }ÿ heÜŒ„~ —».�Ó.Äþtu-ed[µô½ÆP@}ó�kE„–Z;ˆálŸˆô¯ßWí\@¥v¡ :×&nJ*C¾Ðp :£¸ ä_/"2ë$, Ù¯ùze\ÄòÀ™*è1Ew­ÐZ!¦ˆÖ.ŒŸ òûuÏrù£ÝPT*;…þþõãŠÇö×�žü�às÷³Lo‹¿´2»n‡çá‘Ëñ6ù\¿<¢7]2n£cõèp§Vº;{͆ö>âu¶Þ4ÈLÄ©M«:ûë¡‘U…é�ÀÉpBÂé«v=5á‚�ª:±sÒ]Éò—Ͼ™¬ÍQ 9À!+¨ì}B6Õy�*³²‹s:Rk× êN�/¨dDwÔ¨$µÒRÙO§VôdíÌ=ªSèî$…Áóóð·¨,Æìõls?O��˜Ÿ‡t¥¸‡ÆÞq!éÿ�çðÈkSë=’ýçÊ¿àúÌyÎãñøëçh½Ì_e»Ý¢aÚ÷sÛü�}ÓKÏ#T¹Q�°�@ÙìIE%Þåè!ñêÙïe�ßkñ8NçV_º¢†pæh/YßÖðËý!iÜ€N+VZ q6/(£²}›ôlÃ@ҭȘ U'ßšî“7žƒø*­GÎȱÁÐnE¢÷’pV…¥\%‘¸¸’WÉ„vO©FF¾²"žæ ’w›~V¼·±–ºo8_‘eÔjƒ"r4¨ ¸§EEÜœ�Ýõ0!Œ›Nö37ö‹!Æ5‘ÿÙåóg]«ð°� „u{­ÕõÆû¹ùuÀ$Î)Ê¿¸}®Ü»õuç_.®HŸk¾ì†ãz@ß›æƒË䯗YÏý4 Ô½Û¿J­M囯œCÛ—c¶=“l¬æã,ðb�C‹¿oŒ~°ýfÅ<·$Ú�§À¹êâü§à<|ÑŸ;2|¿Nåá졺�l“/ýœžºbþÝhÒnU”k}å‹ßÈúôîýQz/W¿]è?Xð’ÙþÈ=X™Ó#êÇÊ⤙y¿¿ûÀå¹%6û�Æn®R¹�´ïˆ0©I¿¶~Ež-"Ìþ{ëKÄÍqÄ“•ÿf5XõpC¥Ý'Ž�ý.,ð\c4ª;‚;¦u [gWú'TÆï²=Ú›õ¯¼9‚˜œ ÆÓªíª«jqÜi帪sŒ-[ÊçßÃW™gýRq|7>·“uFó}Qår¢lØïùÊû¡Îäsªï%ÏÆ¿àÀeû�¡ò&Àˆ¿äÆÁŽb°kÊë8çE‘Õ1�HØ?¢Tò6«ÿ‚ð­n4çU…þ[°Õ¸ßõ)žvûƈöÔJÆnox…¶^œj#Ÿ Å“1½÷ßßz{¡Ž,I:{ùPPÝ{ÐïU¥…J^Uà‹Mb¾Ü?�í½î €V¦ß”Dó!襄›†pRë['HG^kUQˆâN¢�ôG�C)¢í”ñ€8og-#«°ÿüŽ8�IŠÎ‡+)$l1/¶nñÇ�¢ :tòq·Îh �ÄßïòÄôì±ä<ô©͚Р±¿([�#1™ÕH­�Üi&ãÚ\Õ0ÐØ>ÄË|ú•ñº�ò,о".”ê¨Ì8‡rص�F As¯’Ë2ËA«9zf ÙFxñ<þ‹¿_1”奞ˆ%‘YK’Q=®Ï§þ†“UhPêÕ)<©�d 4q¤¤VU‚½ž¾œNö¬N¤I wû½Èžûïóêãã³RDm©Ó\›"*,--‚¤² vµ®/yþ—HèA­ÄÄ(0Ä8øT…´„è㈛�|Ù²UòU$N´ëA€#è T§Òh÷¾ÿ’a�x>’Mg~ŽÿCPiªüE0�pÂÀ·Àò.äñ"ÏH_¶øÿ8~*�IÅÊþæwq=†\êZK;Žª¯È<ÒTÂçÁ3ì ³ú±ˆ{´YØùGø]i•ýÓEþ‡Q9Õ[ÂNíòº‹;¨ßJóL´®Àø/´ÞjwÞLþ…DÖ±FÛ4ì.â6p¼TÕT^ʳlƒ3ë³å”Ë„øåTLài?ü�¾ý—Š÷(Ý}3‡¯×PmHç²è‡�Ê6&Sv¨L•Jk ¤{Üùˆ¯7Mä³+¥pc3z¿Ã�qZarZhóU˜LÙ+Š Sã»6ÂI!Ë‚tûœ|?Þo¸Ú€��'Ï“ {ÝO||üNp¤Z½x«º¥éÖ‹_øŒ¸õT½V*¿Vò�Æ�b?*÷.³Òl³ÿ?{_θu÷CÅ«�8[ÅÕöGÙ4ì½±Ü]»Ç”��ß\ljf¹4 ËdcQ¹ñÔüî–% gråA¨þèú~¥—°¸é â×@¶oï4ÕI£ƒ¿ÇñµÝÿõý=·˜ÃgøXÌ!öžná{ÊJý™ø|쥡ÎÓÃýцÐ4×ç·gœˆ=½ê’�ã�Áót²ËDdæ�ë ªLôêØ/zž­µžÿ·ˆ4?°ß=ÕtT�ø^õý‹CÃ�„Ñ+iëî†?­š%ÉGϯlø%Úæ+sM‘Û¿ÍM-³hë•­—èÎáœ~3cÀÊ¢îcÑʉ÷tœG«n°Ürôåø­×ø–oæ–ÒÅRhöRšáwdrÁ.~v{‹Äý"â†Ú0îö­ïPÏ‚c¡6ü* þ*¿œ¿;_QÙN'Ñx¼ìÐþKS©/£B2“‘ŸJEˆwÚ“³~¹';�›2¨Þ‘ÞrL‘Hÿ€„}ëú4@ M{!A¦¿jÔýìH§^ò¢Îq�8IÊ‹)�¬tÎñûD9 ìEæNÎ}¥û¥èé¢î¿cw¡ÄséùÜ¥÷ù=JùûØâ¸�¾>:D’R(’šk~õ}O.Ï¿¨ëÇsp*8ä¤Awp”B´ d‘Bóð{�În÷sȘù8Ž^�N¦ç¨1¹MŒöÞSë{�”µÌ{»äVÜÙõñÎG¶RûÔJ�*Ó‹¶ Ygv¥+€’S±®ç3î9†‚è–�´Pi²r‘'›ž‰J-”ÞUÜ×Äk-é^/Q@Íê I;�—PhÄLJô32[·|ìº="NA]n�yȨ]»Q©)w‹ÛÖ/–Ÿý*$}tÅéZ´ˆ>¯·ýÒY›ÒÞ˜ÿ÷£ÑçµGµ‰0ŒÎ6}ö¹}{`r€B fZ0‚ñ0íijˆŸÿdžþ ‹A µnÔ–Õç×J{M³ÞõƒMY& \äR ºd”KìÆ¯"úåQŠâhM»î�>6o�væ%ìFa“÷ü…ÿŠûAÒó<¥göSÿ¬;"Œ~²ö�øt瘃-Ó�/Tºz¸Ò„»:§ y¿½E2ÚVÌÙ�Û?°¾¡…W�¿�Ïjç{MûüBÙ=›™b»3;ü'âl0ΠȘ:ÎÃA“ü¾»ùLÁ� Ÿµ”§–^¯I­Áñšß�Ÿ—¶L¥¬pvkm»lŒ%çäoë^¿ÖÑ\’”×¶»Fé³ì¶I–&êš_p%\ļù&m6ïòîá ”-üñCª³)Ay�¤llÉölœfõåo x×_yEç"×ÕÙ…Ë(g]©ïóè8ÁÑÏúÍÆQŸíb©®_5WÛÔ«øåz#f~öC…W<Éšóg»:–¿¼øäHó¨D/"C—ô×8aµ<fë“þU…x¶jö§üÄ+;w˜hvâÿ¡Uªó…ªÃNý&ÀZ”‘¤ÃosÆRl—µ<�{nåms‘,¾¯ä¶Ü å¥ÏÛ ò`óÍ}û‡²ØšoF ù|ß·ŒÂúµ‘ßk"6Öÿû™½Úxþºî Õ¹ö ³ƒâyÞPQ|pOggSJàLm¨`5¾¼KØÿÿÿÖÿÿÿÚÿÿÿêÿÿÿØÿÿÿOÞvûf7hû8P¶Ý¾ôjj#ï ˜"òVû=àëJ›Ï+$õo: –yº(äÚ”5ÂÉeoôúd.R§HÈz ÝëzÒä�Â8Ç4¥$×Y“‹þ'­È+€çµµ“§/Z# ê´¾�œžÊ½¾¾nòú\­’äD]4O=:$¢#ç¤Íã~§>öüýSŠwá}òüÕ§H5K¼ÏÒƒëÅ ÉY:›©½¦yø:�~vzÔTØg›(Ù¾Ýçs>y_¢fev=S<^FŒ‡€C4(t?(~Î.ºøœ}ød›ú�Ëì­?ñò˜fSç|PzJR*ûžµJmjJÕ®œJÖªÀIPDÎö<ù·Äõ�³ô}²ÇYPA‘5=ÂóWªÏëyš. ¨…5�‚~òØ‚bcòº~·eJ>þé–=ñB‘ P%k·èÔ_*Ô“„æ ÑZ髃ìšu"öG»ý|»Îõ§"ýø·?;C×*y§NʶhÓ›½ì â¬÷òÙ›ïG/˜ýq  *U£ ùœ€¸@¤†Gþ™®úÉÆ¶b ¢ƒÄöúÆDæ!Þ¿¥þµ þkM³Í㓬;·Zú¶I)ÏÙ­œÐÎ_UÚc‰™{Q=ÀüMSô ëGÎÁ=í oŒ(ýž#Í»?è_Ç „ä)ön ­Ó:Ç÷O1¨#ãõ»�§ÏYDßóÔe9«GsÝ%ÏÒ‹+ØlÉ\/°Iÿ¬¼jfá{䲉1I·˜ “ ÁTL±ZùßÞpHþ^s±F$ÿ.ý?2øîõ×)ö/gÒEøe�ü0å§‚uÕšµ]±8ýõüA7_ñÆ`úò/lôóL1Va)ýu}õøäØ�¾é¿:„9^”3ÔUG¾ïw­6Íã6Þ=)ɧ®z·ÈaËAÓ}ª€ÝÑ9FÃ%{-rÈÓ"‚òÙ1kìKÑÿ[ÄòˆÔf~Ø.ßôÂ…ªÄ§Ÿç1ŸVÖ\vÅ>#ô†{ßÉû²?]ç]ä0¿®3qv~AÄjø<â9:¹ˆ£\¢ï·©§+Öi+§5ÎÆYfASží•†ÅÁ8aðÅrøûž·:ãØ¥°táNµ‘‚½6N±?â9rk,Ñ]Ç̸�îQÕ}Œßõ<¯ >ì­38Ô†ÆޤXƒè5OQ¿-ËóT6óîÖ&D UÙ£‚Jv¥iÝѨ”¯?`ŸúÒâ+(»&�8NeɈ”ìcåÝ=I/îÌãsG"Ô~ê�TΪBJ-ÉÔNQTwŠÓhöAŽTQ–yÞ¨‘›êõ¡ÿÌùLöx|¬‹Q§è�=-SoÙîR/Úþ¯¼ñQò>þ©îw½pL3�+·¿*dtyóˆ ÑIpÀ™><y�ÔˆÜ*¾3—Å•P[x_µ?ÀI n]*XȃûÕ3%6ôVª+¿Ñ‚óIéĤT ¦u}msبyù=¨çTë­—g…ˆ”9M~¼ØÕyÐ0•3®*)†,Qà¥Å�7Ø´É7wlÍäé¿9—ߨ7BQ¼×í#„È]¿ì·Õ~ǘÏêV|Ö…—{u÷«yÛ›BÿL_’`n‰Õ|©gËgäÎLÕU%þN#Õ•“E†éA‹abG—§Æ7»ÉÉ¿6õêàgmw—�è…Ò·ðû4ï–:õVþ }Çl²ÞmR4Åm$¶Š#O&»’Ý=ÖʺûÖã¦W׸ÞM8ø¼ŸužÿP*½öÂä‹^½Œ*;‰z^ðgí«v¿;bPúš�GÚÅ­wŽ)´ïÿ–i{ŠµÆ¢[PŽ7ÌÈxË•ú%ÚÆ5µ¡ƒKdol“¯!g}wé¡xÊ„u&¦:=2_m¡§Þ™ˆ¿YWéÄ¡¸ÇÑ÷¯ØœûœçMÌžìÖ)~%Ǧ_“¯èÈ@Û:­_ÄœÎÃÿ=F^+riÕÓY»ÎY ¾Ë7ε e¾´g‡RŸ³ó<ß—VL+¿\&to”xÿ¸1½|y‡ÃëPÜ^_W��ãœuë{ÿÓ2¯§ï“>ã¥ñøSo÷<—}éëmfŽ.pS›Uš,Tœ£ÿËì³v©]›ëç–¢bP3¬UWyµÿ-)çRÅoÒüÈCÜt!âNŒôÙÖ.”Ê£¾o;F1ÁyY½¬_ˆ"ôëžÓ»Ý‹iùúá;©� n/‚YmT˜}v>Ù­e|v{â´ýѱªÕJÖnßâ uШ _+ˆ?Æ{&æ�RþR GT¡ãߢõö À� TG•ˆË‹ãõ‚ƒqé[+ÀüÃr•ûM5uŸÖlñ4£ÎR«Wý÷Õ¬í@Ÿ@¡%ï÷ª�Ôq�³B¬t©|DúY4cåÍk£×Hœ~|>‹¤P“¨á ÐÀÀä�hf³å�W¤�fkñ“£qœ@«Rˆ}�ÞoÓÕC~÷øJS©Q4N“t•qH8:ÞÑJEB. ’}­PÀðì›Ç³£<>·jž©õ¶ç�læ¶²:Å?~k�œC“µ�¦‹CzA¥6À^Hß¿<Oÿ7¿=…šÎQ­h qTjÍýdï…ˆSµAæ®)S/ Õž‡~ü$Fñ W^®Ç+�Oí×®�Ê"õãóЀì�Îþš†­D—~TC´‹ÔP'‚¨(YJ69sßÏ¥—~Ð;v'ŒNGù_A%c}(”y<­XÂRO*�²’3°ú)R]_àæÉëÌÿ(ÇÖÿÚ;™;ýøm% +ÍšœŸj¦˜³©Xúñe2�T3]¾�Ì‘ÓÄç)¶{Ô{(ÿ%J®&8PR�²/ùxóÆù>smÕ”…²ù;‰«^ë {e8ºó]�·†¯™;b¬²ŠìBúú÷c±û�æó¤Òæ¹Æ¼Ï0ª‰N¹/]“¬z�«ž±�/„?wœ×D$Á:Ì® ÿߨ’ýVåˆ_ðëO:ßõ•ÅnOïŸ�/÷®·bý¡á½rÏ ¢Ê{ŸôAðÄÿ½£ÿ¹”{Lýº‚yí±â1lâ á›ä>\�ˆŒ´™"{§ü/ì+E7P޼œÅ˜û«­8½Î9ŽÇBÿ¹µÄÐQoøá•¸XŸóv}ÓÒŠ§Û³²ldPøé8naÍp`,ç³1.Ÿ}ÍUôŸÝ÷cUnü{Ñ?y�=—Ÿ–,^4<|#²t2ŸÍvï Õ>§ÿ0ÉŒ»âäÕÁ&Þ9@ž¬çU³ê‡½B¶ÕвIOï·o=¹•S.‚c˜õ‹NßÙê×ÞsÓpëb^°J¯ÜT0�×gf® Á‰È�õÃW7ŸÊ»þ “ŒØŒÏSæöt¸ÿhý7ˆ�?_ r¾^�"¾›fÿäÑ_ çóz^ÝUoG^og¥¼ ¿@ã¦[Âñ{êxëYnÍ?âÖ(­Œ�·ÐÇA䚃ÑÀË2Üý@¯'¾6Ý.ØÄœ¿…ªçÑbyàÃ^vû¨þ¶L¢vØvû7¨ûA”mDmø#TZnÔ¥–™îË´Ø¿²†uNŠ£êH%qsJgÝÞ t¿cwLî¹Þ/rùJN¨&ª�05k2�{ ñsRDèsÊžš3��ù 8ñ¬fA‘d±F¡€$Œ±“{ô7Çæ.ÜÇîOÜN ù*ÇßžŒ¹ÇŒÔ]ôućßÓ,ô�)û|ð!„>öi:Kø=æ,M.n%™…LHÊ–t0{h‘´k>÷={깊G ¤âÔŠ°;‡“àhAáˆàô ž�OyUa[šY�F3éžá0Ù4Ä‹èö|­3³oå©3×_ ÔBiBjm”îmmŠ¢.¦éù“«�-nG;IHM™?/‡€®Tè�š³‚tJ¥›b¾¯ÉóLy°©ÿxôÓ?f™êOM$.¹šŽb§Öª•Ð×lOÿ©s_sB&§Bã´h÷!ö‰÷Už ¹ŸÎî¦J­h=j6*÷o-nlùò¼™îÝ?'øŠæêöé½2-DëÅÖH°�@½k»†m½âîXŸ�›ðvyÊ7ªl ëÜnÁjôÓP>¨œ–�~¸?r³üÜæmHš)æ(ãá: ¯WXÝh£$�M ‚úq…›0Ú)øÖ!<ù¦]{æ Kßám…ö£OOŽv›¶Çü¿e¦ùûwfoèÊkŠÚàßÞ¹&¹„—×p]Êé^ÈíÄϨ‰/äf¿ µöE�^Ý«ì}Pðªt¤kÈÙå•K£öDµO¿ünE)„Ž]m‹æøiçò_Áëâ¥NïQ„£µ—1±øì9î›^É¿‘áÿâ gu‚Q¼a½ó!é÷^ ­ïûJýPò†Qm(_éôïf·å>¿-Øê¼×ÿk¬\¿ƒ"³ÅÿL+Oíßž÷Å\-+¦(ÁïLñGyÅyÅòÖ±B-oýϪUü×OLõš¡í)¾yÇïâ-ï[×Äÿì,­:ë�θoÞ«`¢ªOV |øô®Ÿo6ÍÜÞÏn]c¡Š[·¢øÞkxÙbWÖh¸È‘ úÔz>Ö;åÂõòÏËÕÏÇ,ÙŸ—�™¬RÒÖImp¯fá[j�|»|V½ëwN)Lþ–¾¢©Zg3}}žW Ä%¯+ˆ0g_Uø^ŸDí|¡GÞ­‘÷c‘ŒÖÀwzñŸ`úy…ÊÐÏdz=)¨(ÐàÂ}ÛC Ú)˜N�(ôôHö­  ñAß*dd�ÛåîÛáuHT�pº0>_«º¾§ý+g„þÇ;M陞O¨£#Ñç­È¤Ýº×/^Žý|•Žþ“ŸÎM½]ë´ÆÓÎ$ÅËЃ˜�+H�G;ÚxÛõŸúa!¢Acç Û›:?. £‰£ØÉ¸l|Ï'ÃÅ}3úøPœá¿Íö§µlS;ßs¡û½ÉËÂß¼.Osð“-ÆŽ«²Ö�6e×cKlz…›½ym�Ѫë“ÛˮǷ~½jUw6—ÛYEÆã=Unßz›�â�xeÇôxÚ×þ>øbë/íÿø /Nß «#c+zz¶;ƒ‹Ýÿí²é¤ü¨L>î—ÕÝ[ÿ³ûÑé÷ãIæä»îÞúÏV¨gŽê$¯¿Õswò)!KC¼{š »®r7—«/gÿ[ÝÓãJ*ý^}’�yçj=b¿^À¯(Y+�Ãèt´[÷ßÓkGnêçÀç¼ k�´úÿÝyX­ðvoÖÛÏ õËØw±•wžl¿/±·ÏGõÖö㾌PLÎv§–±N¬Ãõ¶ñ&õëþªåì8¢Ì³ãôüµû{äxî'°ü~0þ»{ûŒÖ½Uíµ�ÏÇÉA¥dNÆÑ·óaqYI”úy»3�„²ÓØPŸ,n˜Br§–Rýü="o7«Óï»É¯ƒVxçÇyœÔ£ÁÍçºóȽæëù2¯ûjbêë·Ì© ¨ßwV›Ûú]÷uæšÕæ«û¨éå*hð2_ukui-media/ukui-volume-control-applet-qt/data/sounds/audio.json0000664000175000017500000000125015170054730023617 0ustar fengfeng{ "copyormove-succeed": "operation-file", "devconnection-break": "device-removed", "devconnection-failed": "device-added-failed", "devconnection-succeed": "device-added", "dialog-complete": "complete", "dialog-error": "dialog-error", "dialog-warning": "dialog-warning", "general-notification": "notification-general", "low-power": "battery-low", "operation-not-supported": "operation-unsupported", "photo": "screen-capture", "power-connected": "power-plug", "recycle-bin-clear": "trash-empty", "screen": "screen-record", "special-notification": "notification-special", "audio-volume-change": "audio-volume-change" } ukui-media/ukui-volume-control-applet-qt/data/sounds/startup.ogg0000664000175000017500000113740115170054730024034 0ustar fengfengOggSô Mó^3×vorbisD¬m ¸OggSô MTd´�RÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSvorbis,Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)ENCODER=libsndfilevorbis+BCV1L Å€Ð�U`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€Ð�U €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNPRT>’ "š™9Ž��‘’“”•@@OggS@ô Mv¬S•±ÿÿÿÿžÿÿÿÿ…ÿÿÿÿ�ÿÿÿÿ¹„ÔZrÃÀ8ø;4»g pÃô­�ýà óËåáæÆ·?Ç÷íaŠ=k<åGþx½:¦Ðzÿt¬sÜOSÕêeOSõVF×Çܽï‰Ãÿ&“®ß‹8B^æYNku"¤*|ldáqïTy8€”ô§Ò2z¹ºÃï'Ƭx^Îôf‘ÏM`˜ÌA¯©p¬�¿~…ìAäõîÂÖAelÙ_õZþCΈùÚ{p¯~æ&öûœße†2Úƒ{ý (ÀMw( Ép 2º¨C ²¸Ç�{”_ƒÞ舮çÌ]�…pîS”<æµÖõå•â$ffzûSöÓ«G¶¬ŠSëí>xGèjè2EÑò¨e5éb2´1É×>z.–ý©5‚š½”Ș¼í²fþ3wï%ž'^;»ª"KF!g•¼úkUÈ[™­¸¯OÓ$<å{hâÌ9gä—LY�ס5œˆŒªn.BÐèϵL�‡Š„&GF;™nÜÚx•zJõ®�xªNr’¡’1#�ù‹™GdqÐ^ÐI§g™¢~â{0¨9±7ÒÌg´"ìgÔ㽪ޣÏùª“Ç—ý]#ò¬��—ÖxUgW§{v+ó­’¹JEhå;ù*šGˆJ;I­Ðôui)ïŸq>„I*éTvèZO'ˆ½u�¯‡$)Ž9µÌ­½O'TÊZëJëòÔ¬W£T©eV)ê>°—5jËKžaw¤gêI$ºhK-Ê�~�–<«œ*tÄC%RjÅ!µŸ|9*ÙÒ-MÐ(œ�êA¥MíZ y é�R´èB¾6Ûò»"*µ³•Fäˆ0;• €$«gvʨީ’UÀB2$% Žöõ×/pó}‰Õz�G[~'b£�juB*=´4œ7§ö{³õ˼TQÒPÿ4‚ïWù± �Ìå¢1Þ„=OûÏ ¥íéçõoõ¿•–«'ë+²hw…`Vž4[“¸–üi_)V}cQ˻߷×Û`d|‡c_Ç#eŸ)ƒáþ`§©âŠ}ãwß?vi þ—\ÙtM~I)[Oðs³|÷×ωûUø9Þ!ƒ¢¾¾üŒ;æ)Q™tgí¿Ì °³ÿ÷ƒ¦ßÁºû類«� ‘ÜÿÔŒìz·ö¿ÛOè·µ}›ã^F#¶u¼®õs[ÊX¶ª*áì*O6­aO¡+) yœΤ¢».ÂØXzVRÊ^Â\לðX=I:÷œ'Ĭº‹÷2ê´$g$Ç™ü@!û˜Q™rUøBÞŸÇ㈋ÇüO.b‰þ]‹¿d‚Üúa½Gúϳ&’‡G¾ØZ?v§¿“E¡ž/öîîqæ Ÿ6r»:[MÁr¨È†¬†®Ò%ÃðguCæà,ït–†·X/d˜ ~Í1¾Sü&m”ãI6ó¼®ç¦Ftñ¾µ÷âªUWó–Pæ{óÏCãŽ7YuÍuà«“÷ips¹sc_3ŒÆóøËÑ0É0úu»Y^ýg3ßѦåÎ'¬SË¢`Á*Þ“{ýÜänëø†ì¨y4µN Rd-«#Z¿ÆIe|ï$Šª�;Ÿ±0i}|4W†ÖJ¥ ¬tÕ¾æø¬?´{"D¸œZ÷ª*uB׌5þÍL)�N'NI™J²J{{7rôÅÔkvxôYéØïë¥ôqdÖ¹?Ï>ª²;ê8½KÍk�н649§üÃéêNA-ÑÙÉEY»jgÅ�j|2À”ŠhÄ”WQEjí@ÔŸWZ2ªÜNÈ�5æ§‘¬GwòqJ¡Ç\;¯À9».µ› 5âçJN褢šÙ5kNP§®šè{fq@ ¹rÐ"ÎtʤMÔf³~— œM]RC{¥]kv:�À÷T£ÖÖŽdSì!dAǤ°8a»>›þ~¾ò¾RI"³¨¨p¤dÇÁ ç^ûßë.’zýP�gñ‚Ö'fò Îe=+ÓÙT�S«È©Y“VVª3I\Ÿ=‘¯rÍ&ªæì3rø~wúçõ7™'_ºˆí#êZ í|éØÉ† :$S8´Ô¦Ø…÷t—ω=ÜV©:+‰‡<®¹ú¹âåãZD™pŸé~iEëìT´* Â¡ªÏüž y]Â1])ÐËYzC=Ä#F¿bÊìš|â$®ùjoa„Rܤ3ÂúÖB™�Fü zž®½O±ê ÞXóº™1<ܤÈsÔÿ¦-ô�ÈBEÕ 9ÔbýÔ×Åï˜A¨G¨=KmfwÈ•;‰R ×ó‹_ùmª=u®ÑoòtILMd‰�Š(å4‘U™Üð{PRf‰#*².®ŸIaÕŸ:<\ly\љ𨞖¹Xj߸Ҙäû*é\ôuc1$½6ÑôÇs‰‹�¹ŽÚ= Þ› ^RV˜èn5z¦úÎ.åë×aŒ‹Xd ˜‰ø­UþN�áâBñ–;ùÆœ¯ê=ÿ[›ê²œ©/xcû»üéöÞºv\AŒU1¼ŽKuÓÜnºî* è¯m�¨š¢__È·ž´†YoßgÙﲚ¸îŸæ»¥k5 ¼®ãŽö¯oú›9¢ãò|Á˜7¦ç´@i²äs5Ú®:̦FèéøWúóoF"BHá¤ÃMüRŒ“‹7ò©n²ªBÛ“>ûÃ)~ŸÁœ-WsQâúu8g¬Z^m é#yǽնÙ=©<¿÷(á˜w›9l~-^^q|p&�;w*˜°ž.Þƒ{ý ôàž{ÿB°€†j¦cäïñ©I‹D÷*�3ñÞÚ]ÏŒê®h®1»ÔSÑdr^C†!‘]ªíHÄ݉\)�]¿¨óR'¦©Ýg ‚F‚¾±Je=Š/îeõóùø¼â÷/¤–Úõì%´ä_J„�LÙz4šÉ$Ôž]š÷T¹*ò.㤨<䔨©?½v¦V²ñæI@gOëM¼�ݱ×L®Î]¡üÄ5µ5•o¦½ÖîÞÓ[::…åjÉ\ †äï2U}»4ßD24ûÊw�X´,òÉpsM¥ÆCÉG‡›¦“h´ã»«6ƒS©q”UŠšÒ¸BíwWå M-öú~œÑYL5ç]$’ìç�ø®ÌŽ'•Hè�©U3¡Ð¹^Ý|tk¦„ ÓC׆ìê܇°wž¨Òµ;Z¨Ó>Ïï£íÎ2sGwß§ ºâLÕ%jÃ3‹qýé„lÅsy<1u È´&Nkj8Ý'»:µî@¤æ¯�þƒ·ïkÉ#äÔ$‘Z¡¢Ë�º-ãv}²B*¨ÃÓ×—úþ;ÞÙŽp,’ã‘íŸ}]ÛЋ‡<ÜËŽ;Ï�û˜#ñƒ‚ȸ©ýˆ\ŠdßÀãõЭNÀX¶f ÄÛz=ÍÈãš©¬W"ÝŸÓ:fn/¸W[®ôEž*Êi�\î0>?lT³—äáºIú¯ûh�)˜‘—<3®÷ Éç¢-AÚÑ»‹+húì½½ËCå(ÍOû0åÍï&ßZ®* ³>D´SÉæ\:Y†óÌ ôné«¢žeëÎã¥IÙnŸB$ÌÆw¤?Çf‹‹ñR1tò=ó÷g"y3ünÈí}Ón,¼g�Gûß§s6˜Íqæÿ<5d`Ï ŸuÇ7¿ª¸M{û»"bíY=å¤ú�ìÃö�×ÜìØÓ1I](tFï€+ °zÒ•ÒW'´ÎÌË]/ï!-èðPmŽ0ö¸je½éÌÕ›¿Åv’Ž>ªzÂþ’œn¸û2ì–šµ© Í;†+½1U�=ry‡?RQß¼ºkc)ÊIÿl µÆ?PïÖó¹Gòm¿ø1È¿K†PjÒ&¶ü'OèÞ½dü>Õ ’5öÚ…°Ä>þ§$±’¿÷J»C¼ö½»â{vØBˆKIpœ÷©gDLlÿ]QìGÒ_¢×¶Dz*ÚýÏdá¸öêYb]•ÙšRKúß»+äáñÿgجRX@Ë‚üo?5™v”:Îq¢`²ü §>˜ß_×DÕzxÙ">[Ý2kÄx½¥ár¯1 ¡Åf@o ÚÿJ×r´•ÉÊXuåÉ�sÀŸëÿ‰ï÷éÔ¯¢û#ú›úñpÿ::òff£æ’KëãRŽûψÜsLáËjR?ò'æˆÛ°ûdŒ`VœtŠÓ¢šß2â²ïúÊŠÑþ· ctËâÎô\6Šûê í¬qÓu}ºw~èÛI¼¾®ÅJ,9ë¸j™½ÉÓ9ƒ¿�Ÿ=g[Gß(÷ù«ç£‹Ohýºm¿ìËcà‡#–¡’)‡Y�B�—ü|W‡ã�XìFdÈÖ“{¥ñ?I wOí×H 4Áp™dY9öÈ!@ÓÖÖÎQ—iŽŒþV[ÓôÙÓ§Šw µ�×ð·< 9GU_bö6Ì9lÛ餩õrê zéãÍ5RTt0»å¤åuɳCkqÊìäG¯� }¥†;�»VjçxçÃ;â*k¡éÈD‡rÉŠ&U ÷„-yúdÿhóåÖxI=þÚKyäö\Ž'÷ýæiù[ŽŸW•:4.õP©Ó5íáh•5™ 3xæMâ=ÝE‡(H•&³6ÏeŠz�vÍÄñªÑÅÙzP •˜ÿ¬Õ½GtGM'®›„ºÀó½�ú¬k÷¯TbªÓÏžß�U®=jÒ�æœñ´¶vÏO©dœR»^®3µv/âýtæF¥…ŽkÖÚªo"C½�R‹‡,ÖUäâ’Zä묽㡭Upœ|‰ÕpèT‘¼:¢”�š­”zæý¯9u­¡š ^FÌUÊB[Êþõ&'œƒŠ©ÔžsÎìÌ\¥~‡®‘gx‘´ŒÕ¹• QD®W|R†[R»(J¦¬2Yˆn­Ý²×wXd'uêœp0螺Md/^á\#ó ˆŒ©0ÎÎÚè䃉Ëf]'z÷âÍ.Áù÷'³ÕÜYMêù‘�öX6öpêµ§ÕJçO’îóÛUW¦d¼fW¯b¢@_®zöØòe§?ãQÁ¡Áu'ßl>ÕŸØÐF÷=ºÐþË|Ä6Æžê{(°¿µõXƖϼ€7žÆÛóѱM,5ÀÕG{zcë“bW¡eÒ,Û‘Óá¨B–÷�¯u-ç‹2 9€È1+cQå¨8”}ÛßÃK>å÷A%΋$æx{yWìK‰y³±¸³mö—´ÙÀSÛÌ¿sÞÍw>.å¡_Ÿç•tÂ1‹lOggS@ô M< ‹À«®ÍÇÿÿÿÿÿÿÿÿÿ§ÿÿÿÿÏÌÌzR6‡0ÖÌ6 *¸`ºô·ÓO¬¦ú¸‹wq¨9®–o�¢'®É¸rFdñ®SÈëõõª7;ëñwòóiÌ7˯Hq÷tÞ¢Ô]È&a× $òð| ïì 5ŒÄ™A;m¨ý¯Æâ”T8~ÏŸ»!Ǫ›äå'_,êÅ}‘ëaäÄKuL,�¿SW_±§ëKn†4™ÆaAF]Ž2%ƒKA±¯àŸ…eåÊ‹ÌìÌú,ã”Ö™[ÀR|‘ü>Tݽ[²Ä"îéîï7ÕR|t®uV3ž×]9�¼ÇzoÝp�Ú•çîÁ!Çm©yÊ5÷E„êh55ÈþøË¾."ïô„ª¿ÿèQ0�ÝŒ—É”éñƒ.zkÓ�gò�Þ+\ÿ´|¶}&.1ØÝ9†µ¢{Pg¨{7‘'Wñ:0Á5‰Êb…ãê†Vþ¾~µ5æbÙù:·_�.WÒ!LÙúXWý¤eÙd“oHSí7{­ÞË×…ϯÆùŸ¿—–òñh¼½}Ò~üh4÷¾·ã^÷þ5û�ž¶ÇoíoëóÇ÷SÏÞ‡Œ©2?t¹+ÕsÏɺ1e-ïe©ó¼d~�gÆ.޼ øÏSn¨ÿërj¥ÅÒá<ÌÝî¥ú¤Ìç;ÓÁ÷išªŒOví~ÔQ!�Moïß÷Úñì$¦o§M‹y´¨ÈH»ØT¶›Î­‡¤aõŸ|t×®´…×|:§º8>‰Y¤5^Ý·Û¯Û¯çÙ_�Ú­ØdÑÌ‹‚ë×[‘Ì¿jî ýûpOÙ)úŒùÝ/��ÿ¯üì~$þÿù˜ƒ©E¾äë“cþêoäö/ÊõþùýÇ1Ÿn=°wo»ó+²�¸ë2_'•©—êZV‰Çkwu:¤˜ «û<Zûì -o8º‘ý3Ûʦ”~±ÝX¶¼cþ÷ø¶def� «».¥âyuá…•9ƒç¯)Ë?h”ÖÅ“RBQ�E\Z N“”e ¿‡jãYo¹•¾"ŽÕ%><¹ñýffnzƒcá3Þ CÚœÇ`ó×K˜B”nº’�€[àxöôé9³á0bpëj>¾>ë/%¯ÿtêq€ ”ºJ]Û\´|¿îcN�«ÕM¼ÖRï8Ë3!5!䀕ÚUÏJ¥^§›ãw?=iÚÂRZ•¡†�ZßwTûì]:/AªêßÍÌWŠS34âF³ç¾qQÑîpœ ý¬Sí*µØ7;%ˆ"Ë9¤*õ]ó;k‹ã‘8äDq¬R£'æ\òžþÿÿÛ÷ˆú*„0¢�vc&+E‹h­|F‡‰ãÖ“ºDÇ5£Ö{õQiàì`­ gÁUS3ºø2§NÒT@甚թ= ÙI®ßÓùë¿)~þ½ô©â Au´ç Öï±·t÷ÓeŠëSÙö¨¨“°k<]:Òݵ"�Ì¢)BR½$e•ùÙÜ*Z©Tfš¤¶öÉs®ŽÓNg“ÝÔ&y9>^z™OUg¢"…JÕèÂAæLB�¹<ÏšÏEŽŸÅ>¿õ!·ç ¯sïÇØ¥Gçëa` Ú�è¾?#ÌêÈëØäTªà0‘ìS„Ä#"†ŽÇî �OÎB eÎ;Ã~îðÉðIµðNè~V^õ0âFÊþÐþŒ}¢�–SA/†rŠvB¤ýtÛŠÅcWWÌK6Xí÷žè%í#ílÕikÞ5øûަ�¼ Æn’ågÁµ$Fæ£úCØUÜéü­ú�¾§Ê j¥¿³‡u^/kÈ+bõþfMÆî½Z)™™�Yw|M±W�›�IŒ £1|¡wÿòSá_á­Y.µ‚é*Ÿ}]SíÓõe5 PÒÿ<žoĵýœ”6‚>}ÎwwÿÄÑwáèäÝ5¦Ÿñšd«’1|Ëù§Yžw/P¡að9I›Õä_IJ¿S‡™4Ô]Ó×óønÒ =5B{ñÅ~™]/Çõýz{�ÿ¹ýûÕÎVíû·qíðè^w�çt1‡î>4éöú?¼ƒùí–ô»›§Ûåyœ÷�ÇÕ5Ûr*.·ÿÒFS³ÝTË|ÜGó3ïos¾ŠŒµÃá0Ÿ?m›/–ö�šKöœš»;´ã°\e6n÷éÜH*�ßÕºýãtÛŸýñ°yÿœnºÇËܳü8�sÛ'ôiѬ–Õúz9Ës55ÚF5uŸå6"¥kÒ²¶þc†G™BiÇÂD¯odÚÐà÷Û±€7 P ¿ ‚.]T¨L|~•sÁw7ÑÜyâG ½Òj²tŒ£t¹�F­ê^&â4Àö?Ñ*©ò,ßÚ ÚÝ/1ødá}߯NM4j®û�ç±-{+ªXn`þ¯ïi²ÉyáÉÚûFøÖ`ÒŸs7M[vé5žÛ‹$hÔj›xé·~Úvâž@‡ã¨aÚ!�Ýû™kk·¥F׺ÃêQé$3 úÏå Ò\ìb8È‘H$4-»WïUeA…ÉÉnŽ®•B?tŽEéìF(ºà¨dí®-]•×Înàªhì^*µ‹«P»>'xµ6TI�긱vH³ŠONþ넉¨ Š“Î\+]8]T"Nrv=¤A�£ ¹o?ÈK_%©á”"Ô©}è^»jÆH%Ž.dç½ »k:ÇkrQÇï{q\)¶ø\G[ –fieÕY§â'å^•Ž®‹àD;ÔÂa¯8+ºS8ðÓÔ�&ÈIÈ–"ªV‡Sçêª’Š“Ä3¢óxp,˜<EëZó¢f×¢u.Ž|†ÖÊÔsfHœ¨8Ô¨q1^êŸ}gR§L[>'Àß™óÜ£y^“£ÔKš—DáÊ)ƒïÇÏ�{š-Ô9úÐ_³_<ÁòÎ�À­lü¾s�÷=ÕþÏL} Q;‹{Îo“õ G«Ü¸‚Êåš±û& ,� ðS*•É–£N5^ŽMNÝ9�Ç]Üà#'�‰çˤïï}ç\ÝJü=Úú•+ÆÙÚ6¦Æé«'ë§–iÔBãùÎk×éÓ^BÜ'מ·ÁÏUÂ÷r[p¸ñãš·¥‹\?ÉðÈ�Cä!™æSHÏ_Ûãâ«¥”‘ŠªäÖ–¿ùuàP—’NóÛŸšgXMÈCf¾T&ÓÄ·Ú m{dƒëjæ£S�¶‰§ ]•iÚûBÛAG�tp¬…®ä…ÒŒ¶Á7zÇß(B{…öN¶˜lŽß•`Ÿý6²½±²\@t¸¾Ø&óŒ›n%ÜœG-\uóñåKm:ÆOiãLÿ2: Ñ…—’ø,C²=âQñ_•ªˆñÝ%»0Q©ÌÏÆfl�|ŒÞ‡oBvÿh›¨ŒËã“ÒòíÁ…ÿÙ«�?zöûM˃Å4¶àp¾F³ìÞvÖÆÐ?Çå—°œ©u*Ÿ¢â¶Wàó\Û—3+`í€ ß÷æƒÿ}Ú˜qcºZ둦‹œ(“@â?íïÙÙ{åíôîï6A¹IÕrv¡þœpCpÿí«^Š­¶-…MµþS_ûàîðü–ÆgŒAåqé|Z¢þ‡ÛÔTæs„…—¯Ñ«cͶ졷¹é¶”QºgÐÜy‚— å$áÞk‘õ%NzöŽãÞWÆ’FÞäö)çMòö'gÇ{*® oŒ· S4ïB�núãW÷·âµk•CÊRû›ý§¹Ä꫞†Ÿz‰§iHK3cöÚ"øx)ßf.XJ«ëYS *ÅaïL¦Ü'Ž´­ÊÍnS'€Š3³8î ÷�N(øÚÛ>¥Q~µo‘ñÆ…²¦KÙ'õJ›ä¶ÿýö¹­e=›{ü­e/ø5½–µó|Ì6{˲+Úc̹•Y)\V…ó™wïbí¾×žÄ’Ñ)œ¶ßYº,‹6 °¹à§~jë�T-Kù°Ͷ\øû?~ûôé×.ßxüý>êrlp~ùc¥®-âbÆ€[™ Lšÿ°/Û–RJé�ÿúã9µ¤œï+xÛ3¹ÝŠólqm+8Jeƒ¤N÷¯HYœì¦‚GUè½?ò‰  BH}¢5…¢*µxë«}Ù M¨6­ õji§pÐ+B¼«3Ñ(µÒ8Zd¶Ëü -†TÒꉈ8âyÅÙ¡ªZÊ›¦6ÒU4ëÑÑ/WU¤Dk­ò!©n=Gu¯±îà©r[¤|ë[)Yôï ch޲⻧8.ŸµH»"' ÑÌ<¨Á•nËi¶hŒê?9@¡ ÔZeog/ê›Ïã‡ËÌs(>_‹å�ñ}šòøÝ…±òoùD™×z?P“„]¨ÈŒì÷³ˆ7Îæòíõ½›/£úzy…Ô¿¯¤Q¯¾?üÍó>a°ãÃߨ3Åš�ÎÈ O&~�Öw¿  ½÷$7·+¹½ì|‘h ‹·¿ªPéÈÇBo®žú×O ² ¤çÝÌŒ]*zÓ™4†Íùåjî1–³Ú˜W}„ÛvYFâù]nÆc<¡Ï5ì}¥77ºÜn≗ Ή+íö¿û:ZäøòÌ|Fžz™Yé8ÛùIDÝáéw,D4 î× ¾E¯Uv£ËÛIš¥}­ÿ¡8Ky=å \�éónéñÜ"iîÈš@ÆQcË]ì™K6÷ÈQ ¥5é‹Ã!|= 3÷¦þrL6Î-$ëh_ë �ný2Øè�”²0²¢€†kvÈŸE­Íb°XÏ”/‹»We•Ø÷n°z™´"úêðk{LéÂõUð¶{{0Jwz;ã¯Ø½&91MœŽ–ƒ×¼˜\_øµö¿rÈ…«3yrŠÑb™_¸Ìb-�+�Ï¡ÈÍ÷�º�ÄÚëÚ6‹ž“ñíð¶'A—˜Ï­é^�Ï¿‹²÷fÊø²ÖUŽþ“u-�"Œ Þ¢ogÎËV1=\ÇÒ3J¬ü®ðœ':É|Þ¥pÞmYÿ�a{9–S~=­Íµ,®Ï¸z‡Çæ{ËmÍukj|»RÝÛ+®Ûý‡5\ÕÒHvFùOggS@,ô MÀ‡(¦³¸²µ¿Áµ¼ÿÿÿÿÿÿÿ¢ÿÿÿx´Íà§Ä¢ñ#Š}5ûW1Í0l¸¹šö2ÕáDÌ�ÑC¥~¬d–kÖïåÔš)îé.÷."r´3¸!2iôù…Ÿ=©w9¡å@ʹ¡[Ö 2ÿÅ!Gî/é'œü®zuÇ{’yšD(£S(.ï»ÌùÉ®/É“D’zÎSïÜ7«†ôØ›Û[äÚ(A׊4._ÿ?n^íî÷3§R�1ØÇ-Ýít[U›wWÝÞwfŸ5îý€ê´Éø�!Ôú#žqg_ÄAN‡nx>˜jÄ1=rC­ÝCÄÇžUé_šóß·�Ü»ÈÁ9õømQu1kæÛ{«ºSËäE'èI$šâI‘¬&4mÿ”ýíiî˜{ãC¿éäy¯shÒk7´&ÏpKÝtõ Ö{žÓ¦ÃÎ�ìgqoøë|«R%»š™~�Õ7·ôõ+æ)h!YÿOïÏ¡ºý¦}sÝíÌûÃ6!æN%ôÕÒdÁ wWS›$Åa¾Íª þþ¯ç£t©–¥½[w‘gÑöÞYoÜÿEjÁñ…ðÖzÕGܸ„㛽rTΠ笼f<'ÅüþáTÚ9Ìn"õúæ¹ Ì¼4Öå.ûÈð…„X 1éûÙ9úKÏv.ZÝÁ¹{7„|T¯Ûâ7 ›ÔÅyœ§Ëïû#‡ò1•Ÿ‹ÔÑêfDu^8Î[�Ÿ Ù›�W¼^;À�Òß—þˆÑï÷òd¾}Šw³‘�ýž^sãùpÜrÞm­¼¼™¼R™ãRªK]¿?Tªrù w‹"—í~öþ{Ð̇ˆü©Ežþõ¼† cž5ÛçYê¯:­9Ã!œ¨’ªT÷D‰‘kÓpÝá—RÅlXè݇æé^ÀmuYV&žêü<1+ò„DîÒÎ7>lç²µ¼Æ¦�Æò©â}@�W©ûÇ_UjîóÒû¦þôC6ú>ß¿ÝÎ6�¼"[RÄÕTõ AÆ?Œ½B]ÌŠfù5ôÁõœÝýÍ£oÎï ÃWÆö—�ÆR[ÏÎVkû«ÜýR÷ºÓoƒ%åöŸÿÂŒ<Äøž zw+qîö0|*T š{ê�¾¬w‚xr…É?GXNïïg8‹88ÖØ’>|ã,œ¼LÀs‘FÙâ¼Â“¦ÏÛË èI J˜ нÜkÝnÐy«Š*ö9•†Qš,²k^ø¯GØýLgv»†â–óºþ֒˸þ÷§ZôùìjOœ4ló°ÄÙ üHÃ/Åv}üî�ÿò�G�ëm|W~Üj¼;õ¸toé_óvkOõgo£ûí¥!^Ÿk…ÅÙx4Èþ±!‘ùwÛ©kÿ0Ÿù"�{%Úr¬JdÊÝ-ÿzœ‡ö”ÞÂA�Ní¾ÉE[ÖzŠïÉ7[)²2½ó7ÞÛ�*´ýŽÝ—’é¨QÓHºâŸšÿ“XýË‹J@�ñ¹sº8½v!»}¿ßëÉò6Ìÿ®U!i¨ò;ü u|’r zœµï×Ńò#�“÷îפ«9ÿqúæÇáÉ_nQV)*ÇÌ›£;À=À X"×~²õ0þc9] ™­!?ž—ƒ1l pAcžšº©mþ§Ààb�¬IJFOm22âöÍHÞàûhÛ[³ èhuÖûÇ}yòáÏÝuë¤Þ²Ûß Prš‹•–³ÞÍÔŒ;1‡Ô.¸€¾ÿpþ¿óݵ¨ŽVðûGúÔzd£áÉ÷n@xÀ+›§9@îÚì÷oêzð~@Pö§rŸÑÚÄÉQ’µS�ŒzÀ¢yŒ6ˆ\RÄôßS¢üµ�. 3<@#$ý‚è[²ÉI€y§ÑÊ�òÅqY¾Y3{M‹–²DZ» š¹WÆãoôî>4gÜÎ=¬â7çöiœ‘¯¯j¯òýÚûººº•q‚˜6yÒc›ìælìÊg5wŸoÿÕ22ƒ­\ÓqØ”#¿:é¡À}è±hšÆpá~µ©9SßÈ”vÇ ™Rq¿M¼×Á7%Cø²> èµ-ˆõµïŽ>ý^ÝåG§¿ËlÏÿ,ÙU,nÖÄÎfµûº½Æ¤z¯ÇùÍH¢%à‘úMÉ®º0d¦íû)Ás¥ë߬ƒúKšOÑ{i˜�Ø_S“ù´ úÅ h�7^o1—�ÖûwB|²¹¹D@z…æ’g}ªŽ²øû×u½Ÿ¹hEÉ«ßΦNÍÊÔW‚&´ÇÎÇê·�2Õ,J4, ´®Ã¥À#$ûé•áh˜¥Lúkóìºt°Ûnß—\3Ä¡}q¹ËPIIeuÈW…¥èSuñ j<>ÑSzžƒv‰ó^¿„##÷ú) ˆéîÑ|�hf`•QZÁÿg: C2,ÕB¨4@CΪEOû«­±)à0‚³Ü~4htwå¿¡ëçé¾é¬Ž7ý Œ ê⫳áCާæ?Yë :uªiñ¬ýIŽÆ¦=| >=Ä�Y+æÙ›.%öÛô·¿í_¥¹^§clÖûÍ×|§½ î¹Mûß7ºMcýœ6Ón^/ã/w—Ãîè³³ŽÇç~_¬×çY¾›ØØ|`~ÕLóÜúÍ<Åç,)›"zÝŽïËøüŸßŸ{UöGëêüz\5— Û´;eSìâ¶á{[§p•¼ß9n|™m‡Õò<‹Õ-9$§%:ÔïÛ<7yÛVm(UC–u�‰®{®ï—f˜ÕyRææV§ÎÝÞŒŒ£§ç×íËÖ,¬‰ ÌixŒ^ü¨ ÔÖ@¡üÓ´Kþù³,·ÇíÙP]¯·bþ”?~]ecn½¬ÉCº„×GîÃtƒõê’Ñ^›Ø²ÿÕÐáp™årp“vŒ&’«wåÇ»b™‘õïk³`_åð/FZP%Ÿ×ŠZ|…€˜�>ÜaéRæ¢iÊâì?ø[DëÉ~\»³Éa]ÚF¸”¨½Ô™9�aDäž €ë�ëG>¾X nÆZ±AS‹+Qõh<Ÿ€ ‘ÿpbUÛÕ‚j~ì™Ð€Cp³ ·�÷c¨œo…ß$€nÝ׌ øž® ibQ}-dà F|Jpøí÷Þ@e¥�zÿ‡w ³ rÝÀxüs� ñUáùzý’R�&DE]gùùìí“”mï`ŠÃv¹³¥$&×á·îÝ·ŒövOñÐ’Yµs:+tvuâç÷ÃaOس)jF�²:ÝÚŒñÕvô½4'¤€{6ÝTʸæ=‰¤pš¥ˆó¿�½Æä¢~ÙßJ:®ŸØÑ¦§¼lïc,À–§D€+–EgãÌ„ª+¯XKþ;§À¶*#¾¯“€˜ºÍD�ÕÍ@êwðúT Ä#öqL|ei²‚¢ºèìºt¥¡?Tý¼¹×>rôŸí•°çýaа)/“2&w•["2§;Þ½áôk†Tb3Þ±çB›9àÔ¬¿Ôžj–d´`àûèÚùhÝ›®ˆàå|Ëri±ÿá ™Ì™ƒcµ�å`1¨¶,3ûÅ6¿ØªóUú|˜u°Ža@¼±Ædà —Åè‹e—=MŸô2€`@ÓÔàûô¦ÿÝWÍO0}Ÿâ“Á„÷Ü�¯ (ãÍ_¤œPYnéÙϽ«ûU?·“¨–^-Yºßmª˜M�¦»Ot*w*vdÉ6Þw‰L¯Šû»û¼åc÷*‡ ¿‚”öG«¤xJ.¸qVçÜ I›ó ‡ÛA—¿.W¯šïÑHä�£éiuï}_=ÜYäÃQ3SÍ¿Uø˜V…é°%†ì«áÿÝëú/¤2îùâC¾¿…gÿ›/J�{vÜÏÈNi³»µ;QZ �æ+íÍ °¼?ÿî“/Ð>Ô§¨£`½µV½¯âbÿ=V'W|ËàÆwˆœ�í¹Zíò?asŠ]@€ 1ëø»K’«ó6­»6×$^mÚA¹_¼9ïÛh±W{’¢ŠœŠ—ß)>ÛÿØÍÙsÚ:ëEÔ‹ÑØãñ‰BM$ÙÀÀxt_/ˆÖ> €ß· €€€ßZ+`Ž^ͯP€ßÕÕ7U[Kù?b÷<á †/—ãëÍõí®�5Okùú;#W×½þ÷[Ñ\“|Z?™o‡oX­P p†=ðýpÆÓaÎÊ–ä-ª£ø)À…„ öyäßÄ=À�è0ò³…mcÿò¿<6èG„ !À~ê|ø‚V`Æ€BnÜ@Ð$ôÕ¤¤ÈÇhçéÓß ÕëCîöàpäg¹Rµ€‹?æâ9¶üõSøK!^< €@�ÉË€n .¥˜ €¿|0± 0øfx²©Ì¦TšóµA‹„˜*Nh*5j�áçäTPA&G+ìÐèzh'õ8zÎÉ•-ïOßGgÙ >óüÝúã£ÊP#Ôò.]§»|ªÎè}u*ëjÀ }õý=½�›4¦Éuô@÷#ž”�ì93ö|8H;YX8[ðA³éë¿þVÕÿÚ3SSTÉ;µæ ¢S+Ï:¬ }¼ýÿGù½i^P ‰ _JôDT’�œ…M´¾"¼7_ ÂUŸ@ˆ`�ŸGûÜè‹(ý·¤c ãP¡¨& ó=ú¸{þÙ³½*Êë_!¡¾ÿ`« ÚÎú›ü—z�KSíx½Ü½ÙØ!Áµm<Âè¶·Dÿ7Z€C°úHm't,íο‡=”‚€­5D³ò;1u¨<köFs;@g;dR°D` ¡>&ÈeIE倡κßN6z.Ùeõ_ñÞ0Ø[ý(Ÿ1ùH»‹s}œª¯ÏWtï²~ΩEOiµjdæWcô�®ìÏ��ðmK/tÖ÷jÁ=mi«úB™Ò$R®g?kL.ÞbT±AsýÐý»F8Óâ<—»×/ ¯Î½“iÖf�œÿìrƒ?¼eÇÕ®ùuîqq(ÿVÖ�+®[cþ 9!ù�_�oß�Cöîß>¦µ Ø`Åhö8½~ëËÝtÎ ŸÄ‘j·–¢êÃiðZ¹·¢xóŽ–PÛ²¨‹Æ„´ û©¬§9 I¶o¾ïyj/ßÕª¼TRŸÙ*[|ó:nŠðyÝ«Í3ŽŒX#@âK€Û6=¼ôïÝxh÷÷áœ(®æl3Ò¼!-Ù@/ Ì ôöÒdÀKÉ(Ä‹ƒ²(c~b÷þs¶×óýœg¹Ýþ}š›­×†?ºà†É•ÝfÉ‹ÄU#¶-‹þb OggS@@ô M=�umÿÿÿ‘ÿÿÿ“ÿÿÿ´ÿÿÿÿ ÿÿÿÿ)žè»ÐZJÿ´~çÇ™vö[ni úÑ'üs˜sÏ-U»‹a“˜œRÜo@ê!�°ü2oý×_0 Ìƾç@( © BŽÀÆA™²Ç"‚ ‰�L¾Yý¶õv€@z¹¢¯DJ|瀀òö™ÏèW|lì\3@£xŠ˜O(€�ݼýh` ¼¾D€ ›o¼ß˜ÿIí Ð —Ò€ðßo@Pò$ñ30% �9†Fhj·æ¡¥þÑM‰ÈA�wû�S§ÐPн•$Ž… ’üŒ¾ó£â )Ò ï’™ µ'%О�?$ùHeS€ä){òЖ)5ê�O  _äpC�"¸7*Ëó³SVx=Å.³w9Œó#]ïïîÀ‰ªxUƦÂe\”`€¹ª®MÇ_¡™ë¨=¦÷zÖçÔ' ±™:�‹ÆoSÀ$ðñ@0¾ÿ�;�.éË?ÞÀ`;×Ïù¯®ù•ÀÕ÷ø€²8ïÀWÖÏÀ¬˜1óm`ÞsÚK’Ñã9í"N½ñ½•=ÀÈ"ôÇÀ²ã—Í|úgJ?2¯D§7„n6…^`m€0ÌÒ!¬X�5ös£ë!KÚ cÈáp�c\@_§g�@€RI½CW¯ctzt Õdˆ#�UVÐ1Øð]çயõ´‡KþNDxˆÜ†Q½ôenmQO7š5RR�:§åáb}â·ÑFl›ã/øIºÙi 8hjë}ÓÅ^ß­`ç_`ýoÆGÇïI�{È-¢¢4�‹G¿&ÿx8-¿Øˆ¦óæN+£†}·£L†Ã¬ä.³X¬&ÀFá&ÇîX�Oüš‡-æ ·NAöž··ó/Jëh«µ½ì~mŠPêjз8䯋ëh:~€Â¤YälðÖZC�nLºª—u¶;éÒµ'uÚïl¶nowGðÞ QÈtªÿÑe3$FÆ,·•/ ¯óʨ‹Œk¶'³ŠÛÌnWe¾ŒéØõ§ñѶÝ-~?#/X'èKmÏŸ2€œ�õŒ0åJ18²lÐõ¬#`Y×�~ÜS#Ý[ž°¡‘Ë+Y«ïé÷�øºVB@-+ªÆgËKÌg˜FÙ¹¿XM_ÿVq¸ÿø‰«vþ5И@¡'®à¼?/ËQõá¾è»�©@?MÁÓE¥sÕ’.þ.¸ÆÛGŸ´þí”®Ñ,¹…šNlb3bö(ňS:Ân__cÀ¿ïœ�Â[26 5»—Ép¡²:�ƒVa¬,‰úÔ-.ý»BÓP @5Æ®Ð/Áç{88AÎM±äT´Ï> ûj€ð¸“Ô&fPq¡à€ó]ˆ�žUa€ý}f#†»¨Š¢¦�hJåjÌïIfz>š%„5Õõ¸f4³/Å!“ÚE�P`=æßñê¿y=}ø/¯F­8ù*ÈX[�¡ìdC5Yä/¤Ö]D¯žúB“v7ó«¡@ £†J žÝdý)Ïpu:}{ºõ$ÝUÚ‰5Æ#ÁÐìñ•ø1ðŸÕPÕÏe¼Çu6}ÀzÎç!{©]¸ü¾4íÇÑÙÓ´ØîGôüp/ãUçèØ¯ý:úmÊ„Ž6âXN•Îm#W—tëà2ÌY;ËœD~ÖP™EVÔpÌxºÎž1%ë^ÿ$KD×ñp¼´_’wêÉßc¥ðë»ÕŽf.t‡PÇ‹ö34º‹7…?]]¥Ô(†Jï×õΙ�®Ðài¶¬¸¯Â�+�DQTQ�P5ih¯¢J ¿#!YjN¶hæ? ›Ö„°”¸ÀD„/•( A ˆ¡•úeŠ%#sn2çñ%,¹=>÷Á&çÞ»püJ‡œ{¬ÌŸºäv{Á×»�êõL›7{\Mzžá�÷!ŽÜAI`e<‡³ó^úê‚e×çÉ:±·&»o&•Ó½Y¢Ãd3ß}­§T»2oáyöÞ·U—Ög¶ž:ÍËnì\�ÜwÙkÒÛ[Ö¼éî�ýÈç£TWßZ«÷uMí®l§—?®[{ë9c a³Z5ñPD§ÿÖ!rÉÏŽõH¶°˜kû¢vÁkê¤JÅ}C3%Ï¢ˆ-Q’ÖVÊ|Ãd³ÇsIãHŪ‹Äôõå{lT¢â‘GÅл4K‡9ñQÙdÕz|?ºö™¤ç¯œ›€âëõi([ÀI°À…ÏÅ@w‹îZhàÿ§úó.ø ôB£°øY)(,~æñ7& #Å–òXÖ×ÈMìáýmÇ�ËÑ�²ºÍ >Æ3¦bÖïU wóus»»»Ã.X}Í̽d?‡¡Àv.p$|T^ÈÛ¢50‚’os°#¶Ðwr­Ñú S©_S†»EM?'\PÂØÇ‘wÐ0æ 8£ÆèÏ*½×DwC€ *"ŠRQYà‹zÔšR© ª8´¡ÃÝz€@˜¶@¯têþ×#ˆlàÃÂVdVôÆ.Æy@J@ oû¾'·û‡Bôr#®ñ À$Ö‡Z5g“ï2¯ S‘JOè²ÆÚÎræR~E­·¸�¨W>�c‘º�¼TG€"{r*‡µjQ�Ýάùoއ�m!óC0sX:nÕß�ÊM¸—Ÿ�¤ì[ìŠÎýÜŽ�ÑÌcîž]:Êøàœ`EDñƒüÔ›ž>× µ\¶÷ÊY>´M`j…L�Ÿî9N 9ÿð3\åŠP¾yŸgÏ6~ßr¡ð�¢¨{×áŠ�gÙµoûY7�W£èKo–?d§ä}̰^þ“±\ä¡¥zVåÛ­þ?³¾bk!€_àà+ ʆ†^à³�Ø 3–ƒÇ —Fi\¿yÅÃÆŠÇd¦�BxÝ®j¦•½Wò°½ÔÚºõœ§ü¼)޵-änpZæñÿ2d\Ù[èó¥éXr^’¤Ð`= ”eš À%Ô‡4‡·J‰ÃÈ Ä£†ÐYŸØ¶¿5€$È I?æ:˜»3“ÈH„ �–hx¢Ù#BeXƒDm“38¼nE(©©Wk×–ßïfýòÖ€Jk[:íveã4aO¦÷ôŸ—>��ÞÛn“¹VÔD´µcŠ!VOíôj7ν‹Þ÷w ä�¾ËKìòúq¬üú2ô}Ö_°Ï½Yû%/坸Ö�Óˆ&9|4¨V„M&›or]·Ücº½Ý™êú.õ»—d•¾X…zÓOKég®XÇrä­lìóÓH@‰?|ÐãO ÜJÅ[c«"KßÕ\ÇrnK?=unÌ둽†þ3¯V“‹j̰Šâv*Îï“S+]qoZûf)*‹•,[ŸO»ÓaW Í; yåâÌ‘¥Ï&sÛ†S3,]QùÄ›Ø:*o_- ÀL@î„\¿½Ê«•0w¼ûm?þg'o 2(ÿ/ÕrPP2ršb�©¶ ¤Nåð 4€Tï›øë®æÍŒô¸û ¹_Ú¨qÒiÂ÷ÁYDbŽ¥ùÌé:11å§2~µ´=P¦GÖöÄ0À§ZdSÛqsÔ=kkl® *Þ¸{ =a>2#>·¼DúÞ G0bHáOWߣê/  Ru¨^+î/óþ/ÿx02,gà°p²JÄ™JØ@–Ž’wjGàË¢»‚¶Ì8ŠQh-ª÷*›;d³S8à%E+F~¬h �BTñ»»ÉžˆlœG/{»Àê¿ýÛi"À>róà;ˆ=¾@ÛÖò`fêFy»kF5=âýö 01Õ~-M�êJ-´Â´™_R¥Q¦íî;·{å-Myòîó-ºT·>'Lµœ>ë^ÍëQ‡`8¿èïCçìÓ?è™U·h–yÓ²¢gJß»$)é(GÕujˆŸí>ìÃG?åÙ‘¤R#”iÍg¾l_øÌ>h«Ö޹ ŠP€8�4A…©¶|Æc{fuû¨çîðs|äh¢Oô‘Ë �*:ã6ƒã? Dlñó·éů”°ÏÚ¢”’º‹Ýì•öÇ-¼«uw�½Yz»!ž#ÈÎ:»ÍhÝÕwÇÒìðþ@·Ž|ÐGο˜U}ölÉ.¯üÌçBîÞ�=þ»Nµ¯«�o´êË�s\àZlQô6¸ÛF}%Éî‰\¾öËxã‹fžß¹Ë”�+Õ2/Ÿ °Ò,;\dº?¼÷?ƒïV/h½ö¯�¬ ñù$ÒcïÍZ³‚Õ—;ä¡1»âQ<Ž×˜Ö5ÓXVµ �q6l½|P´V 8"¹]üæ9ýÿÕ¸Nÿ?õ "U?ôöƒ}ŠûëüuµûJçåÂz~<×_¾w½tFb�ó¾G_3nzŒ*ŠéO}pªâŒUãDîÙæºN?ÕjW%ÝKMHÚbuviVŽÖ眯³ÌåéþUÈz›•Q\ø:”mgªÙxŒŠ?ÓxÙä�Ãùà#Å⓹^ïÏ«ü+—»;”Ú–s�ÜàôÑù¾­ì¿Ÿõw­BÁÊFµÓçíkö3Lf]å^¥•Ꞩ»’Gšü�1Þ†k„<úà!&ùé -H±÷QMªj$Ò¦ê1�ûÇý¼€ŠŠñQÀ¿G¸à tc4Ô™ÒØÀíÌkÇîµZÒ.À"ÿ÷6dT³�¾º8Ð!Q�T2¶âãûÑŒG…¸™£s�ç}ˆß=ÆŸito!nËç‘áp`¢"•JƒÛ1>ô~ ¹îA&fß2ÙrªÃϤ•ÊWÝhwIEÆsM7UBndH þ•�*Öé T³Zô=ª–íÅâ×ÜRµÇû­ßšõŸ?ßÁf}§ï.mžÌ£Auýsqù�:¥UZÛáñö®óøç&ÀÂß0¢¼`ñ‚õMøÂrt„¨Þ+ÚØZ¿ w¿4rÚx"Azý›¥–WƒÞíT¥×Æ{ë„ÕÔßÉž_ÎÆG>x”âa¢!^Ž£àµ¢ËvJfõmÜ©(t€!(œ¢‡èÝœ�Ñð$Jh D@ qW÷›E+˜­ `Ð Q;¾d�cØ&F ÄàÙ=)–T#’•ÒÚ³ÛÁEÆ‹VuZU<3=Vv7‹+áéé©Î4°zf«1yã-,V D[cÿÒrª}®çº‹çÍ)ÄùÔ«Bΰï-]�£Q颸äž0JíÚ×î·ºÏiß·ëc[·éó}•¤g†~Õš‚•óÉ^¸ÊZyË]_V›‰¬MÊéçn“Ù+7Xú|)¯oyÛɹœÕÌÜk»«Éæôžì,°â\³ ³yßáÁ ¬âXù�¹#¹oâ»Äòå«'�;¹æ&–œË/‰V™ûÎ-¸M¤d&ýÏ$miéÖtòÄ?w¾³ŸÏ/$­ºŒùúD¯ýwé÷¢YLó7ûVýw–ÇcÈg¬‰ÞÿL óñã}a„ìƒQ¥Í²ò|ý�M»ß®ól 6¤ÁEÒ?ç÷!b÷9ŸOÁ&6 ±ÍÃõr?­6Ue‡¤r‡�Û,r‘OƒwrøœçãèŽõö_ER˜FÍÒôôõåðŒòf¿ÎœS“–AºKÍž­¬¸òœ¦€ûeÓ`=»�¡É÷“}Šq�$…±¹ÉO¹¥”Íývï€Äï=Q÷}ñê�åS½¡ú/˜œ)ÀWOggSÀNô M¯Ü·1‰(TuÞéÓï[ïl@kcœÄ>°k !"HÌ1›óFq³O¨À ¨}ýYM @C†RI`ß»j)ªó—ÕÔÄËL%ƧñmžŠäQ22>pAÃ#'%.馂’9æñ[*ýf•³"®¸®~IÙ‚È“Er$…(}–/'„¦¢ f‰8‡IºåO§ Ñ� “¼g;{Êé™YwŸL�òJu%wíuÉFTótš¥ÌäSözàæ³·–Æú:²VevRëú÷ù«ÍþûS_KŠ2öC¼>“)§Ë ÿœÏ¬hwvJ¨“pÉß/s��×0Ýç|“•CöB´óX»² 4O…Kú(]é†R’gä�õl}_9œ©: Ð�jƒ{ÎûÒ9áâ5§×©ä,ÝC®ÿÚÞ½_j&câ¿Ó’Àò…»A÷û›=â÷ËðÓqóþ~¯ÇÊ>úµö›´hà«”|™꬟ÃêÞ/•í‘•G¾úiç Lyce‡;nº�¾P¸ÇæÉk‘(gž2çìJ^ѤÝDû=8îj²@”Ƨ…õç.{²Õ íºþ]ÏÊ÷£ÅÚð�šŽ<(KSg,K3¢]„0Ì&Sõ¸EN½Yõª�oüí“=È5ÐÇ“$É€5ˆM.’òz%³Ó”ômêÊ]Vqà;ħú6Ÿ:žõZ!Ïœwü|Çj{�á–ðíýUj““¿©{{Z¡Yuww|MO߃~�\3€O´·qëÈ>rIè·t:èmnÕ¹üˆ8j—î÷¢øåëkq}î¬C _ˆ¥’·€u°§€×)œ€i„ ã-_ÿ_#¼ûLu•AǨd{(ba¿üâ]ñj!8j�eªUÖðîzyÀ)Gc¸xüNì‰aN~'iÍ׈²z¼=V)y‰–—Ë+“ÿý^Œy×çùýáòÊ[ qAJ§�‘Bñ|ç¶ê‘\]{®Ž&ÏrCê^^c9¾4€ ªv™¹,QÈöE¡Î1æŠß¿jmb÷¾ÜbçŸÐu.vLéëö±A}Òɾ÷óÁ'󧱂 ûbb'WóÅ8k½äÝß×}lBBöäèNáÚ¾~yköÓúMO³}<ý`þKŸî²Ë6l]|:¾í¸½%Íö¯îЗ÷ßç–ìÂoe_á°úæÏ|}¶v\ïêÃëo�¹/ßïóó½4nÙÙ¨?µé-{—ûeo«,D}[®ÎrΉ†Ãj^SZîN§ø÷}úÝe³JŠÝ¹‰l·æ¶©µP—®¯ƒ~‡Çÿ˜‡©/LQgqEñ©îB!ƒZéVo7øéþø½`†hõî Ê0¬­ûÛäl¾?&ÕÙ˜<Ë裩çD*Ôý(>,Îúž‡Ø˦6þròøk{l%µô¼Ù2ðÿ]só9Þ›{™0Æ7F Þ=ê1­#±RYçKFÍÌÉ¿yédÇœ¨]C†žŠ9‡Ã‡$´œqÞmn©wéó !þÈ >/ZÉNÇÊ\˜^ˆGíÁÖ½ùêRWc(\tÐ:y!¬T?åÄ{^.á´{ÜnÁ”T½ÂFÍzG‘wË+ò¿úÐÈáó±ß,Ä“†÷k)ËãàËÏ{­ îú�QyqW~•<Üå‹Ví+=XôC…ið¿è]ò#:ÿ÷HÝl|S=#ŒCØ�>’šó•Ïz¸‹R¤óï>,û¸/òï¬ëÜÒñ|UÈÔ{?bä5í´&p€ Û5»aâð_T(P>‘õÒ_¥½ÌÒ³‡©j{eå‡÷}$Ã…œèW×HMçê?]2�ü’¤þá')ûò-–m^poß�«ÜêžÎ^IïrO~�˜7kþj™òq•$Ú–;,8¿F^|_eâì·ØúÍÝÔýmn¼=�½ó²'ïÍÚîççÛ9«Æß«7¿-ò3¹â_Òë"\4 †±š§&1ÔÊ;­.�y®~y;»HZ2™wŠŒ›ù—Ñ…¦ó>ºbŸW ¤áˆÙ¿zúx‚w'_Tã\÷“ýâ,&Eáµö4½J£ÓBçÊ걂tT˜ëjù}gõ z»ªË’ßF˜6»¢ÿ«Þý1Ÿñ±¯œÄ·ßïFµÙêÛÉð�›Õuv¹?$óE¦Þê�š{ÖS¡žüæÔg=Àïî²Ð¯‡�q¾ï>?yáú·ÓMÏ}ŽuÂOÿë[^“éjD1l”g«ù]�å±ìÜ…á©Ô˜9/œöå^NäÀdŸ#öj |ü›Rm5$ûWb–åOïÀ³·ô}§”ëÚ.¨Ü?˜ë�‰É}ñu2Òÿð?Ç5ÈϼøºÓÕÄŽU|ŸIã£9\q£�-ÇùÓ UUõÎ �Ô�í`iñÚ¹%‰’óæ¾Z?†ýe¹îÒ¬ 7ó%â5í^c�ôÐU»ÆBΞk?Î�›1ݺ×8´~Ù3ÿÝËþë‚Ýû÷¦~2Èés«+)´ðÎæñ€4ò¥èaãMŸ+ÿjµý>÷ùè'óä Ì¡ÃRñÐ�ÙQ˃%ƒ£5�ø&‘«³Mºl…¼v¿wèkÃäÓ¾©ë›‚[}HÍ~Föv¦«á/å'ë7j;áPxËÈǯ{ îŸï<Óÿïïu¡¼]ʺŒh­á†=þUæN²�(еìý*kðöÏéÝw€q”íº-ÝUe¦kˆx‘+##ãÐó�Š êz®ºiä4çÈ>@qadk„PªvECàÂ)ºúy=ÉàÂ}>ºèÚµ©Àÿ™/» hTD¨  ½}tËï?¾žµbßöAäØÞ‹Ž¿šêÉ·ŸØH×?â è­J‘A::·‹i>v¹j3[ñКî~6ð vÇY”ÔõÇoNMRŒ=¸øt<6†%"è¸ÅˆÕ}†ï•Ú!¡‘wý>òzBòlU”V…Ú—v8P�ÈmÉ&À9|¼·=y©´‚hfT4«Ö�Œ�ÝÉ.šÎ6›Q*EUðêà8ß^À_©€�”9-R˜ŒAFœ<Œ¹Ï{£*²�fEÆ‹úÎX h¬8œ1ñ?{ÿ×}aŸ›–p.ÿq†tº«r+­¬;ž„çº{¾™4è,ªC!½pÖyµÎ“‡fÍXûè“_κ‰*½°YLÍ\æ‹dԫΚÆ/¾Úá·½_#Ç5ž¬hÎ|ÿ•ù¹å*¦ð|+\qHloÎøÆWÎxŸ¼Äke•¯¶79FÑ_ÄV–tŸ`6¶¦ˆ¬WÃhû�#†ÛV³¼ÏFs«î»×««°ÿcÓâ@¿~]QB³Y¬õÍY›i5òÛ_Ý,;VÙJ½&y/$¦\œ¿ëñ•¥P.qÆxŸ=(iâvo%\H˜Õgõ ÏÔr|7'‹eOÒë8ÏÛ¦ý¦lN6'έK/!^»ó ,JÊëlïX/",HîÚ_ïýZ A£Û€(ìDíÁäÕÙóÿ˜ÜË~˜÷¿¾C#; üŽ{×7μ×yñöϰ±‹Êï #…znn âGhT¸ŽÉño¼†ÞDÿl’öøM6z·{ÍkñÓÉù–*7 “æ>5 ‡ÉÞ*éŒÆKéÿ’gõèŸró”ùä1AfŸ �¿ÒúÕWϬU¤ŽŠÎë�ìj|¯÷ ”"çc,B_Ž¡cÕ¼þ #“çHœ †œk+íþcÐck;Ú7Â`óÍ‘¦¶(ôhçÇäl7ûµ»úôšå˽ܮãçëñþÇù0š�/òö@´ßç×Ûµ?&•�òß}³I_ý�N›Á¼ÌåùJ¯e÷¬¢æ·ÓÿŽ—ã}u»ÜÛ~þžúÿõrºÌ~Üò¼—ƒó˱ì¦÷},¿eÓÞ®=ß®·úw9_ïs~ìF»Y}ëÇ�÷óÓkfCùø—³ ‡çsúÜnaÐCXêãý°í¦4Û>7Ûñ‘´õnÿülÒõ»»{/7¿¶L›Ù¹áVÇÓj¾­Ó÷~Ù�®§9¿�¡-Û .^:`è¥Ëx©ewDZÁ8U3S¹¯ñ·þk¬ >Üê¿ö°ðë¿J> Ü‚#]„ˆÃßQã·ßÜO 03è±�ö\aºþ÷k®§ŸD!…ÙúË3Õ“ÃSxþ PQP€°�¾�ï¡3;øœUS%«@-&Ak!.LZïmEÈÛb°v}.U�C¡Â0kç2åý•€ÝQ*ô/z¨s+úîç0(Ô•¼ºX A�˜Âqø&æiž€ €ÒsÍbï#‰ZÁfÁð9…Ã>Ì­7Uãùû½gȹ=†S@ÆÅ7šöMÂ?Åç:íÀãû?àÎOpñ¡.3úîÌÝj8 $Ë·«ñD @<=Eìþ\£ºMÏw�8S׸“fõc¿±ëÝÇ“F5ï@úê·ÍæzGÊêòÿbZmÌ"ܘY¥E,?Üláhøé}„šï2^„ý«ø6˜Zz[$¬yM‚›£¦Uæû‰µ>wnDHñÿ'™ï‹@]~Ê0Q@`)@NéikŒ|îiðXæÁ¹5ã«{Yç…)¨Á¡^ûеC‰$ÅN[‚Âð¡ruþùù½Î3ï½6~´ $ B" Á£øö¥SV$pdeíó)NÝüoÍ‹|˜°Òw{(±»Ñ¾Ît}Þ.[ÑmŠ¡X^ ymÍ À8åé²QRœ7çô[)\@ÅL©”FØÿ­ªy'yþýVÚ®­°¦S¥¼¤ºÄžš)߃Eèù„9WUs/­Y̪�+grÐÃ3øú$Bd!Š–ÈËÎâ™sL0¸. 66`¯þ*Í.l}+˜sÚ¯ìÄÒsŒ ¹€b†xÂ¥\�Ý6ðÃG£¹r´Ý�ž�;)o—ÓŸÛ½/ž™]þ™äyI†­å#'ÙÖÇÙ9j–”öüé|8eæËiU ?ê¢3À5«–HcM&…&®¨#õ9øŒÙïAÇz«MÖì㨠]%Á¥å:ýýw»óì®í~{ˆ‚±ÁDñr?o2^ûqYí²(•13&*U†n5«¶é÷«FR¹$ݽžŽõ¿ª‡ëúÇ=ÛÞ\«±V¬¨¹ÅëñuÊ3-]d6òß'fÜ…¹Ì÷þØoZGôëW¥5!$I»ã­Kl–6Áì¶õæýßÿóÌ'ÖZcB曪Hºi©Æì}{ÿvݽ_ýöNY€y£‚ãÓ¢±­ñ{­e»¸›ÿ9^sß¾Ó>Qü· w³”TP•v•ÿõ³¶%³LÿFçËâfªÍÙ­POggSÀ^ô MX¹ãÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿžù{°=ð@Ûoð›ÎÄ#s0º§k껀¡øÊR“ €»m9 € �Zÿäé»çGSà‚ÐÓ  4À…¦=ºµl&ì¹ ÆÔþóÍÏ‘NCT 纬]¿v@g ;úFµºí'À”ßÍÀ\'Ñ yÊøïAÖ¯KÍžÞ·¿!’] kÖZ—ÅUÓòz;¯êƒhV5hí©Ð:żg¤êÒ¢H$�û3ä8_Úô–Ç$Rµž„´Æ»­‰€O©è�íñ,¢Q‰ÇAsº‹þ|öñêë(Uá"“JdïÒJ­C!tç{½Ù¥önšyŽêI›GH¸2œ$œÈw.üãЫÄßå1¿Œ›¯ñàù¯PþJÁºúLÖ�Ähýžˆ4Sõ3.°xrfõ ­¸ Ø3ÞÇÿÊh¹ñ}ŒùJ®V.ü“.Óóó?¨—*™øOПÿ®9ÞS|J_Sœ3Ó­=VcîxA)ˆ½üÈ´ú½mZ„<™Õni‹fh2¯€q ê%À/…IR·@Ð�ÞvÇ¿ï̪»LV"žXÛŽAÂÛJP_ë¼§5Ê”l3U©ÚbËŽv8TVÚ\çÔÅ{b$m}\\‘$ ©|ÝkƒF„¥ ™j]“Òã©?˜ €$^y†¦`É:áö"š¢?[Ý}ïãñr4q¢¬¨ÕîZ�®È š¢Ñ‚»Î;: ³ú;sï�hn¯Œ“ÇRm71ýºRpÅçÙ"Ý™ÉXX«ß�аá5Æ3€ÚzÁ0¬p?ŽvÈ`KÅï0¥ë7$Ôvmü7$7öÄ âs˜û«=mâÅ[( ey SÇèóFæË«–ý^=—v¿æ$œª A�/n ¢·J;6ÆeW?UÎÅdøCîÊ€÷¢ÜúþÌep¿Ä“Ì/ë3•'©�-¯ßùé³Ï¢øóN–%ÞŸM”õKä NûÑûÍfóÿ­¢Ãº¾?–¯—T£ÌE‡ú�Þní’öÜ.!ŒÖã‚/«"µ,ºú޵ >ÉâÍ©=ÎWù_~ÿîûOsÝ]¥*äYů‹ru¼Û, >uŸ]3IRç­vÝ.«œÿÕUÓ-��³¼� ˆÒ8ä¦J­¿>óåôúB2tE‘屩 §qÕÖIýÞÍÛ(¾dm½/×I—@yï_£�úþÆDÃ=ÝÌè»TÃ4� ôÍ_Óš>Édß÷kY+™ÃÊ©¹zÅ"¦‹Y0üµ=JqÆ�[[=ˆ±þØC¶yþq€_˜üðªy•¯«›,@±°ù¢/pbøÀ¾Ù»³#èÂ|Z°÷r¸£gzMÐê×6�ú]@+*œbÜØ@…òV�ßèé×Y]Ø`æ×�×g­ý…õÇ€ Øä§ºûV›¡®€ @Dõe7PU@¹E('ª@îz{7 (Œ¿Š ªÐÏ/ʯ·OloçŠZû°k`—/T§]Œ 3ºHP„Bôæ±iŠ6@opj¯ÇèR$<Ó¾v=õ`6ªš÷Q]@kD+#½b~hª¢pm9"_ j•⢡j‚Й3Ç1§7�Úµš†˜#uÇIž”*áXw?ØøW”|Jx�b”õ…tAˆÙª1ÑâõfÉ�}ß…ìKd$l¿ÑGc¤‚ÐKÄîS÷„ctš*æq푹ŸÝÃ$t -±à_Ô¨eŸf­&)0}Æ]\‰r%yàu_ �?*¼ö¥0ß~.Ï�SÈ|Â$¡Yœ€â;õdX>S×Ú³@¶Ý~'ú—5Çõò€©ŸK¦ðž»ð�7˜…`ê3œÛÛ›µž¬âü¶õzýxo)¢·ù$Lm¼ö³´Ïð’”/I«Î!4a¨�\ÅÁùÔñÔp�6ñz^þ—W!Î¥×÷ObŽ3íém“Ý5%¬|+Þ)…>94S¢9˜¾£L§cV爉H4�Gað† Ö`À‰ÜHö Á~³oéýÇs&R=×çÂåh@˜ ’#ų­Éž6̆cûDúdRû­ÔTg˜ëÚUÜ'Ó?Æ×¯*®žÛÚ²L’v¢w®ÊÄ3Ãu±5µ”âi¼°ˆnZwëœçš�äl9Q³Ùkøí¸IÓj¹:�õÜ’ÿ\WùÆO\d¼‡f¿9%r¨yÕ#;Š �ˆ!rÙ;X©p‚Ìobªv6ÙÒµJ/C¥ð�/°P"îî_fÑý¸˜!–{Ò긧~Üϸ>ò¶¹/?v©©�ýÒ][_ äE{Þ“šwÙ _ž|'ޝ]ýØÝt·vj:Ø(†ÃXl´:8O/>}�0?Ye±‹g=:l-ß™×®»bpä'¼-ºðÝ ¸�³y°� u¬óQ95÷w%¾‰¼÷§ïI×ùüÉm5vY¶¿Ó¡ô¹lS±ŽÊDQ)|š†8*v§1Ig×´°v/ßW³o3·½.IEUÕ¹êç2üe˜Ú<�ÃÒ�z™³$QçÓ|ÏãkÛ�ǧ!îr—ñ081.8Ÿ¤C½·UwÙÇ—ÿþ¼I£¸^E±ÖC–9Óæ|îšušÈn{|h¾¬¡~¯ë[EÙ @1à‘æ<ϙ۟”Çjyà–—åo›ê¯�uayßµ_~Z®ò|=—³w½�ï+õ»þé{Ê#¤´ïÓ¶lìÛîâ�¨Esç'5«ú]@T­¨pV/„¸ °AG8?%þ”ˆÃJØv%¹�ŽˆÒôõ¶Ç: 4ü£‹F›.z`›uˆfõ@G?ÛwJ:ðèõ÷DÜ$–ñ~æjd Gm A€Zw&;ÆÝ7ЀÀûqá °ÿ²‚*Z$àÿ `g¼ �6€líkïôÈ�ô„˜Ýfg CEhN‚ÃM6±�Ç£SB$̨iÑÒ1«å”�q ¤ygB”ƒª’(ÝÔ M™E£R�uä4–óÀÛ/fwÑ û{�ë~”²Ìe)]ò”âÄ$û2Tèh©U—5T…1Ðègp/²tgŠÊߊù|©!µ�)�vˆœ³v:Ž@ àâd éEÒLl$OßÚ3 j @ÁÉ�Èd0ch¤ÅZH/ál¬̾þnÛ«_´ê~ØbdרmÈÿ›sú6kû_iËËhS¹fCŽ©Ûxp½g”û í.µ^ýï¹4äø¥Í5Z ñøtÚ[õ$0�ùË\ E$oHTŽÉ 0Ãñï{çúö]—úZÆšÛŠ·V<Ùòw+U;±Í&u s™Ûnîk-Øâž~Ûmxß5ßlù·ïmöë}JÅ’}ÿÑÓœ¼äè‰CäÇ¿lùaòª(£‹å’Ûõ8g�¦¤þiTÀ4B44&X©ŸÊ<)“$β­YþÕ…Ü-ùaM{’¼m–]ž9 É÷º=Ô;çãqp·¾7I5´ÞˆBÓtnˆ‡õùâcŒÏ¥ãO±º§«#\bó[>Û|T5ª·Ë¶Ûo»0Î!)üñ^MË`œ³.J�±cÈý?lõøÝFÎd”\ˆ–´QÃÆ£:â5âÌ#ÐB]/ðu]4Ëÿå#¾€¼Ü €rKõ]Þù{°mà�0ž–DçW9Üé+.&kq<�^�ß"Õ7žè~åÍw6ˆ'Ñ�ß…åÜÀ˳ÿÕ�D¢L© `ß/…å ²DLÔ'À6vt#Jƒ…‰÷÷obM‹á—l᪻ê�è2{Ó» (tW3**4Úøçü]ŒÂKOµË1Ѹ$x}<Ù6Ö¡¥Vá1ÿ¨_zêÖ€À Åe„J5½¾jyé‹1 ÆÝá"ÀíåçP¡üvÏâA AT¥×ò(J$UUD�&è;= bšF´"–0—�*fUåùûaªa{3¡P¦äß%Ò?Ê¡ååð0~Ŷñûž|þ9‘—ª“5‰.ÇÏ©ì(£›ZäÔfz»3ƒH}ñÁž“òœÞßûSÍêàd45ëÔYzï?Ùc>T‚inyÊñÎçà™¶CN¥Ó@0n J j ¥æóMÍ™~œÌeó§Ïñ$ÏÌÖkß5ç½vÈñ¹ Æ÷x¹‘SX¨|�Ö'ÔñCÿ«’ˆ�—žî|;�ÊÛìÂi @ãíÛú’œqüp½Ce¦[ÎÝ¿ÇÌÂ3ŠÞ >STìrÊ(·I4ÿd¬[úG¾¼òspâôús¿ÃKA¿º¼Y ÀŠI?’‰7…/èαڛø[Ò8ÆŠîa2½¤@–mAæ /[ÎíÉùE[,Ô��y>¶Ý0Á–“2…IÞÍAýäú?oP,Ç'S 43n±Y~óqV¤ RáhÊå2÷¬M¸t`JRL+ÄDE&4”,róšb±¸Uouª˜Ý·'·J­[Eí©*m õŠ«½B¥õYZÿ‚º{®âúmîIž+…èÇ¢h%êvQ™Ö­ÜbN½@«ü›ŽëöøÅÊf¦›csplu{T´F ÀÏwž2’›UãLN.\uÿå„bJ•öËh°í9{¸…q"vÕËù“4‚õZzŠ˜×'ÄlÈ;‰Â^Ã1ÒU|§ü^ÈÞêfìž×;ÓtDÇ€^4‹G„¼.œ’¯¡äùÜõãck¹ù%ý™P™ÃCp….ùïèv;+Æ-N¢Æ_R¶Z ZséUç‹ÀÓ¥ˆÏFÏ‹Ýc åÇ[¾ûq) \k¡!Д�•ÈrÝÅïç#Fd–ýf×Öù¦îÚ¸µF�·¯sæv¿Cné«ÛµRç£4#ª}eާ¬ÏÛÑhEæ4nƒ»×î{9l’aå^—÷Ù'‰µ>D!ÎÝ}eÍ}œ3SëzèÆÝÚ%.‰�sÎŒK¹‹×Óí¯ãf�ª™¦|P±!·^]ñûÿ²rÜ-»öº+2 ù¼ìÙ€+6íoA6Orn JV˶1&s(·òÆ®ÊC-OggSÀpô MÖ�ªÿÿÿÿÿÿÿÿÿÿÿÿ«¬¾Æ·ÿÿÿÿ�þù{±3ˆF9dŸ/3x¥÷  Ç‚ßDÕíçÜQ€»¤Àð‡g4¢¨}�.8jhO °U®“lÙ»% ê ÿÅÿ #¶ÑUz“TqÀa¿_ºµ­QàBT}{ÃÞ�×OµÃ„¶êC6·Ù[�íÐ~~|­-À �×%jÎj€Ãsjæ¢ôL} ¿è(+ŒÊ�ŸY£Ëó¯Á@ òö�F‘ìJNóíûßâ0ˆWç€Ïý½ÎQéxüe­RAQé\æ9̸jºYŸfÐ^_ Fl·3ƈJ¥îQ•*ít�óðfY10�6O\µêöâ|'›¬»¨D µt¥z´#GcµäÕ4¡@CM÷Ó;ü)*‘�{*´ÿ5?�&ã7AýŒx �‘O4¾S.Zk�wç¹óð(Sá ÷QÏkWNEBáuà‚ À) ÷'ævK0('Þe£¯X`ü´úDs÷Wh™VÏW.7ÖüÚ,òÏ4 ^ÑïÒojãK##l¨±;÷ÝÇ<Å�_fcZøÍñ‡A›çñ9¼�ÎJœÛÇYë=~š|®�gkþªžm¾‹©ËÛþx¶gñ÷ÙÏßñ³f8“È 2½ýéÆÊ+“‹É.:·z‘¹Eµ w¸ù)?<¶ñ©J^y<´¬Qêȹ‘n)VìqŠ6«’¶ŠX‹Ã`»Þ•­rËå‡L#±>õ¬–ÃŒ´b�· Gžw~û½�ªo†´n9®FÐÐZ¢OP‰.Ü3ü'—¯Ó—�Vf…}†s1À&í_(ãl�½jÌÛí.šLØ•Ì.i“M@æB0€D¯Ø[ÍÛæ*Ã�štæúõä €‰à‡ÿbñÿ"ú¬âàÊjñ8•!b9î2Hf*IuXúº³¤JÉÂî�½§"öMkû®¶¥Pˆ.í r)œµ¢’UñÄc9Þø[üAÊQìØópß| þ«›Š#e±®ê ™)ÄZv¢ô™æî½…?j»ÿ‰»ö)pmš^|Ô®ø”®ÞÚ-Ø_Ýpu· ç�ö Ÿ+Í;9ld‡ôoÆ«Q‡Äó†:^‰�ò£öÙ¯í•c±»O�ê©ÿ×ÿ6mÏö³ŸîÖ§Í­¦$-ÛeÑÖóõqSä&w�¼‰,¬—<:‘œ†Â¤Š)ò<ÈïÂ?#Òâ8\ºªZ§Ñ`O»Î¤¦ ÖêM~ÌWß8Ÿ¬—ùüï®;SÕÏï²si”ƒU¹�ÅYs=wµE��›Âí¶Ë¿Ïbªïæ|�K;® Ö$Q}úÏjéÏî|Q�“u¼3�µ&­Ò ߨ øÔ?ýxmy[~¯�ûZ˜�ǸÀ@Q 94¶PÒŽœN,Ðýɇf‹jàà€ð ÒMg�ÖŸns>�⧨ª2cv-?¶¦Rµ1²çð�Í*À 9\1õŸ¢ê·€^0úv©…ü뺭9SK{ ­Tù½ÿõôÌp@@„â¨Q‘sù7`ÍVѾVØ•�Jô¨-}e1õÕÞ¬Üîp¬¾~ÖEè㱺Z¸™>§Ô]‰ÇÄp¯Txôó.–�x‘¹÷c5ñÞÕò‹nÇCz%oý}>ÆŒRÇúä4KtŸ»´l·h„©ÓµnÅñ¥~ n/V®¦AÀ™æ:µ >ÏêYvõÚR¥èD»)°õ1‹]R#‰ #á˜>éž=v2Àɇâq S»� €8Ù) ë-ŽÖÖ# �`¶§{ÚoÀ üV ‰Õ¨cÄrJÖánø9|YÜ7Nî"¶� Šž»J|ïZ§ µ±§’ÀUª ø²ç×p m¶Îo°¦¾„g�Îe�oCä§ÍXè éït r¼Ífâ;^¾©K©ul‹ÙÉÕÚÆ?Œs7Bf¾ÎZ|Ë|ä«›w¦M±Æ…Ð’ýærþŒ¬=ZËqñ´ZJÙ9d9ðLÊ|rÙ·±=^�ê§Dd֭ׄ¨"9Ï‹5‚ò¸"Ïžod³lïwGìNIIà@êj­òo_÷•¢Û*þ ÞR‰R«ä÷1X5æ˜s•ù>Ö,}¹LžJ`1‚sÍÇñ2ºK&ÓùB4-®Í� ÀÏæø°®5NÿJCJ4å±zM)rî] ú4ô²q×ü¿-«:Z¬¿/Ãµkw+}‡!ñÂ.ÏÁ©¿õ!§S,SAjaιÓÀŸG¼Z8?—OJ9 ;ì×RXfñR¾Ã�.¦tR46Zîuúc]ÍZ¾/6”¿29Ùo÷í‹>U´®±2ãÿ¤zO}%ù\Yz³|›ÚΗh>÷{Z2ß=�{Ÿ‡¯ÐšOœNK&¶\²þ"™¤´1 Íi) Šâ¯L¬9¿ã�´HHk”º»ýûùS¶†ÖœÆÿè�ÉØ‰V�^˜>É^ü”‡¤©±µÏ߯±!†ÄñÙ¯ˆ¼jƱ›²è±/›¹x5íì\.CéäÙýÎvN)R‘¨°¦‰Û˳ܤ�¶û´5¶÷q!ÒeANý”ŸW‰ëÈýÃ~þyΆ²½ nª‹ü�Ä”!¦lcÝè6l¯vZ_~«½ ùn� X¹sNÿØÓ�·[~çÅ3y—èÚßUW“½lÿ3{ö}D;°žÖèÛÅ-èe<=]zó5þ.t›Ð Z}š®ï‚a±š~nšX¿ÿß Þà†·ã.€.d;½ÞëÒÒýZŒàBePÏvp⨷\S¸Ðîé¥iêaM£Ê¢·Bï3ŠeNH€íîe5*‚Ô=�îÉŒ½³ξŽü_ª^N¥a«w§¶H=k¥¤›ØüìáìTõËïáÊœ³êQk­¿Ì/mU”ò)ƒ½5$$êQs¨šÛU¢.Ó2ª=f�Ëg)箵R½‡ˆ Œ(•¬å| ÿWƒ=¦ˆn@Ò©J¿íûÔÇwKË^öå>3[Ò"4÷7�@äKRïUîC ¡¢¨Z_=œéŠÐ¥7Ÿ™’�jRþtÛ D(")Ë$Ù#«ÔF?²Š)¹�nYˆ¡Z‚¥jN{CÇ9z@ ±…â¯MgÑ.êÎGž(œ$2 ¡O(¡e‘›ý¥ËlCžÊÞ9ŸÑ}ØdóCŸ^-ÝÝ„™C“T™¨}„-C²¶áâ¨îÂìÝO•­'÷ÈÜш1þÿ_Ñ›Æéw®úYnÆ^Í2Ð!f¿ï L:y‘/ô3>eàùdñ&[2Aì=!vÐÍïÁ\§Õz \ l‘ 3_ÿ} �Ó$¶7ÒÜs¼!ˆ-{& ¼oŸãeˆŒ8�Þ¯Êû?8ܤ�Ärûd5—ñÂì†S�ÿµWoÇ’ê˵ÜÌßðíû&Ñ“kwGìEÃ|—µ¹ | %Ú:þt{ÑðÛ zº÷·½�Ô0!ÿd¦­cõ‡ÿ×ׄY¸¢>üÙ¶™Ÿê²@„Fúä Á+,œi==ûɶýܬ<&m4žæ³�Ú §%”C›êíéËþÃØÙ¨)<º÷¸d±)  Zƒˆi�IXÏm2z²§ò(Ž¿Ë?¦Âù«èê¾ÓíáÞÐ(é›ÛG­úì8É�ÛÛ÷*ïði1Yù{xß1-ÁÆ¥Ö×Yå�_nÖ ‘X�C)€zñ)AoÁÌ^>’!¡Oµä¸•`3ùk®Á ¼6��m©ôì2EEpvHÑÇÅ_~™¹(mã›4|ÏJ~=þ‰ãô¼¦:î5x"ä5ûW<ï;ÍèT¼¤e÷¸ £>7'²xë2whšæ½·Ê.Óq®xÏ#ì&ëåÇO#ÞÑèùN×HfHÍó–€óOYÇõU>×ÂKÿí’ۤߋWÖ겯Ÿ°W?©½•“A§¥Ì­~[Åõò®VaËñe8!±#øÑX0»ßvÛ°:„k™í†õêzNï¿äá�«%1]zºÎij…jµÒêü[uîÖ÷×ñµ[ÿ/·f¶Ñcù »õpîÇZõ˜ÞÇåÙEnÛMWüâ©M~÷mV¹.-Ü~¬ºã7˜ãñìÙ3ºmn·&ª’4IäW¤ÉÒ‹ÿq‹ãâY?·»ú³=>Cº9l~ÇãÎ�7}vú¾ÝÏÇ!J×á±½>s“·c¾‘ç¾>Õ‡ëçuÙïêÓår^«€€£°FÂàüêz:ˇ|(i•Æ6µg7«ûú²­ï½çÄ<9€ÝÄîÏ2$ å;5¬Þ2:ö7…éÔ«º¶n;€¥‘1ôXNwy§ðÑ!ÚýYëô±÷œQÖáG ýZ÷]ÏÚÎ݉µ�‡ôD6¤nQˆÙå}#ˆ`jÒ8߆ï�MÍW…º½Ëæ1Y<æÚyŒ1h³ò3¤?z8ÃzZà¢Z ðšLÁ7c Áë,;I�_ž�žÍHÀ­a"#§ßprs�—e®‡r¸ýBQþ~³;(4îÒ]Ó|غy�ÀédˆWN¿Ï‹Û“÷ß²´äG|54þkãüìøí7§vórk?Ýɵùó.ù_óöà=w�ñy·¾ëwKß_¤�üZÔŠR£²jsÒ�÷dqô’Eq€ !‚~²â‚ßþ¦ªÊ𱇫Þq?×5íÙqµeµ^wËÕ-|eEn/~Ûß69 OÕ3·;æ÷°øàK­É­Dè¯G1 "²±d"¿0|-Óqoùžú]5ëDê ØóªÌ¸ü¼_�c»k9Ÿí/¯Þ–Ͼ“ßïÕøäËñö7¯ýôcv?ê[nÿrûÜèýÉ'noåÙõ:™kP¿;5róàPÎò.‹DŽÚÜWŽ~ç©ñ q”½ Àeµ{øùÁ WùI1.³:·q˜$_ª/³‡®<ÅÜ—âï6Ë'—Grë¹1§‹Ò“gD/n~Ù£W¿ ܵsaZë¤ÁcÅ/Ï:Ù²ÒnÖÐw¶F|tï¹ùç<=½lœã˜lãÄùIãy‹9|ckl³7ZÐÖ�(÷?ŸOÖzný×ÖÍü�þ‹,ýz5?Ìöãÿ�Äc7žÎë�÷ñøþÄG~šÉÉÙk“®+)ŸõˆŸ¸òV­ mC®Èané)IêÞ ö’OÊöü¬“ýÚÒI,y¹å\žà;.$pr#ÎÄXÆœ‰`ÿ±Þ$²€¬¼/òMø3f5ŸÞðg2FÇ•N.äWÑæòŒÕâÙöÏð�ÀU3Ú\ØúÔ9h7þ&ÖÓô?„¥sˆLD·dQd^õik·w.h ‹¶Fhëâs~pðõËé¸^ê~³þ�6Ûë@GKi?ùDëq`ƒ‰z¿»v@’hA2fÉß^Ïoàs[ªÆ8Êý—‡ËG®BŸ&ä4AÓšFF¦ï±þ[€=€JAq¾ÎKk;àD†÷Ã’’¢ ’2G^Œ à‡®ÀSp_‡ÞÁa#¨'PdÄàÁÁÁ�¬å±.Ð*ë��©îÇI  Qš=/üäÛ½¶\ÛÛ—1�5ç¯y?Z)¶Î½µ»9ô³¼£Ã¦‘1Û•½rn)ÿZ¾D˜ç—U'ï¸ìþÊ•b�Ã긦O© S¶*¦B:3ä<šžêj…ÖŒM"w•cUµÈC<¾e¯‡k»·§*t7™ ž˜/ºÍUÒK¥6¡Bz¨HT¡.€˜!ä@^kÎã�sj?@TûD b.osoã‘?ÂŒñ§4gúÙÿ÷¢.Ñ#þ»}â�º±ñ-è”—%·z+ñ9ߺ;ô1À¡iFß§ÿï ~bú nWõ€Z·°×íÓ¯YÌÖ4£ÃøþœoÎ>»å‘º¦7{{áÛõ|œüL/O§ÆèW øù¬WÖ›Ô�}­è{°Œ¹†«Ûì3ÿ¦'½˜Ôt©Ý3òQû˜)ξ|Å£X¯Çâ9Ú,ËÀ÷È‘Ûÿ›<}Î{ß§mîGlã Á*w½�íϱd7™JtOñÍØ¯ü»²F B„žDk|¿ýWU¥Ís—ëb°Fµ1R[‡ëp4þµcy^ûþ- ÚŒ2ÅËF,åpT_ðLÇѽ�U:¯‰†H¼$–%¬+´ñ㇬D¥@0 t–úƒ;m¿NæPÊNä ®`Q±ðqîÎLSͦòk²Ò�ð}èßËÖìñö«­�íZìÿ22WîfZ ¼~ÞQp‘ËÓ½FÇ%÷´¿ïƒêÍáѤïST¦==wn�ß&³Z.•YDZ”]l1–®�ÈùÇ_øY®ÇôÿòJ]c ¬eòXÒ]�êóÒEÐ'¦2�lèûg5ºÁuN¶ç€ö®Ñžó;*ç íÌÁjw�¨¸'gŠ˜ðç’X*Lx‚–„žÔWüªq¿�{‰Hz9ûHÚ{ÛïyÇÿôvŽMÛ ‰°d×›»¶ÿñðv·ûПOÇóyÞΗz±²Û ÷:–r~gWó>•×f¸øySõ�¬™÷Å\tE× ÅýeõôØÞÿ·öÔ7•óÿÚ»ëaÜ7¿Û?]ý¦û{½^5MÔæM»Ò÷q7Æjê µ¼jïÿËýs<Ê~�}C׌ûòœÜ‹­¶ßwœÑê:—*Þ.ÍoÔ"öï½ör˜ŸïסXÛx•v­ q7Lš÷Q~¾«î{}›c¿]é§*Öÿûísßì>×Õ…Æ¥d6Ëï¸ôwZ]~ÉÓs½�ËuÏš .XYÓËŸ¨6*I'üøö5·^`AÛðûe»Ô?Œ�[ȯ’�l2: 0ôRçâc!0mûOggSÀ€ô M Ò€[ÿÿÿÿ5ÿÿÿÿÿÿÿÿ,ÿÿÿÿ<Þ)<ð‘˜Ï?<†:Ôw=!þ@ÚÿI|Á—-?k,,óò÷�³º¸bçFzñ£îÖ‡³{ÒzýÕ¿¡ž?:sÁ¡•Úz)®ÜœìýÖñÁ=€åÙ€n¤ÂºþBj½R?úßo:À‘tÀ9úöt�Spd¿Žžu69zø[)hÿ!ƒÂ j9ïWõ|í�ZTV�[@uÕGæÑp€-©¿6Eö€€ÇaÊ`¯lÀqò' ðÿV³CøÖ#þ~Cð Î�W–ðó¤Í禅>fQEv�ŽLˆŽÃ\«Î�VP¥v—yF•ˆË|õtýÞÝ ¡šW�q’Fœãt(0‘™ïÅñ0³ ýš/õ¿uF€(pHI28šJ8»Æ<ýïßžÑ.‘@yÍf‘ééñÐ`„ìÊ�ž8¢ö>«Û6oM¸8Ð^{#/ÎVçª%6ŽjÄÝdhaž·]ïá~º\2f©_(g¸ÃÃù,@3úc|û ŒWþûMœ¨ožÐLñxéf¯î©~Ü~PÆ]Ïm—»ú€Ah¦…[VBý•>ì}þÿÊ‘lÿõñ²¸8<ñR6n+úŸm‚CÚÒÇ` ¬ý™tÞ}Žâ5£Ç_Ô …w­M¤^ÌlþŸOzš+ÛÝ(×gGð­�Ž ³Q´t>ïA@C‘‹é9‘V¿•1­GçÚ‰Æ ýSNjÅÜP4`艊N´aѱi@K˜™×7tŠ0K.v=¬âýòä€h¢,šªÞöò¾·oIµv³—@àS/,d"4"a Q¿Ö&ÑzÇhÉâºÓµ�ÉÛÖ«@ ¢÷ùÞÝ»¤¹Ÿç 1ÂZqðÓ+nõrs¥ØÈøÃ.Ž{áo Ô.—ù>&Áy7g߆¹Å’Ô¬”Sþd Ïœ±I½ãóòòÞ o öŽùàÏÐñ:Å#7äýáè‹=ðKxÝjœSgÜo8©Š¸>„öæeþ>�´óèÙV>{äRFy.q\ó½ÝßSe5 "q}Ìnïú·>5¥µ‰ñ&Š«%ÕE.g�Ûoš}wlVÎsŒƒkSk⪘ótsúÇn?´û")Âf?¯²tß›±ô×LÒía›%E’ömS/Ç}áÌmHêíõÒÑzŸ´b| F|«ˆÕ–J«ªÙÓÒ£9.¨üí¦l0|µ“¼v¼õóÍô*ûnV{u‘—c3Я& xÈ%.¸�ÓÈþÜÂ%µ~œvœ;}Ob òb{Û\Ñ5Ô¹bLR³NK$/_Îï�ü ®4 J“§!¦à`mÀ^÷âJì¦Ö¯ÿþÝBt$W8¿þîw �î¡¡Öñhçš2›ÃZ€îíÐ@ÏËt;@¢(ôþœö­Ï·3µ¶h­€¢ÌMPáø:ù�ÚàðÜ�¦ TdÝ<]Ø$ÒqØ?þ¿=°,ÈvuÀ&ÂFQ„Ápö-ET—ÕeQ´YÓlÙ­ÖK÷1«åë#µ’Y'²”¡ªªQr|1TÝÔúJ3GEJ[·ÄíÓÇÏÒRJ×af1ªb£Šv¯>‚*jöQC+Aëv´mM8ö))@‹Âµ¡Þá½  ¶ËKµ*–N‰ð½‡Ó§O2€…!Àü4\bœ$…ØÂ2ÉݧÞo­,0§i‡�û†gWîú¬€L¤ÍϪ¿bæ]x›HÜŸ8Ð.ý›½—ME4f|p’”{Ч>fx& I‡¿'ø…i’sòl¬÷ éÙ¿¹cɽõ®4Œ0.6€ 0м)¥ØL Ú£>Œ_,X[ó|Mû#ô�òÆãæÊ,q×ioÿ#û©Ríu¾Øä;5 �)yŸöÜÝ`C.ÉÀ’`9®R5•ç>%Z %hÐüŽ'ù3XF›5Ο²^å?ìÉ{îH ˆ�û‘Wà =´h=ÌfªZö¡½y‡ÑH‘Ÿ–ÚÜÛÂâ�£¶¿õ! ‰ö½&ébV ßÑW˜ë„j”¨—é—¥x´ÞÙdº»Øß&6ú§[e¸²ä´"«Î3'òŽU÷bI'G7.ÃDrƒèxV/Ô=˜Ïén¥ñÿ_¸FXY»[“_ç]°0®n†wc‹ŸRÞ¥{ú\éþ ¼tuúzkÈ(˯ÇwÀâ™¶&+«2qþ×�fùy¬†+ë½uØPSr~*v[ë™ïí:í»OmY½I˵vªQ£áÔÛ0ÓioÆÒuí¤TT¹Î—¹0ïßlk¯ÚýŒžÊ*RïœÏ_¾(°«­¶‚ñ±ëaßý—þîkvçãXxSøM§úuÃññ*ˤð&É#£·…;·ázÏcK›{S‡©*‹KÛ´)Q°b´È «ÿº9I.i7«viR�¢þø~îÆ!Y¼ñ.R“dûGlêÐvŸà‹¾*Æ)ñªŠsÎ&þÿNj§û~”¬~÷rþd§JÎR•'ˆ– ìîiZC)^�ïøµ\ߟõgæ¸> ËI>¬ø)§×RÊ‘ýà­Eôíá †ßµ”ªM¾â:Z¯•�ä¯�¼Iú;Øž¹ÿahûË3Øé»ÒmÊG0ÜV` ®j¨C~ìYŸ[L͈ÿ7ÜÛ=´öÃ_‹œÏ]€’¥Ö½Ö,Ÿ¸‘ í{c‰¼!z�é/_~L‹ ÿe»©¯Q³÷ë#g *­(Þ�wÆKVß~ŒF4ªnãàðÔ¦È9b½þmÃ$€: €~ʱã#×µV¡ èùkI yð|ïEUj|i`øg+àM9Š*ˆÕ17+ püÊ×J Ä—�� ( Ý§¿ ;ô1 �ÝÓJN€ˆsyõ¹­t¢³°Z¯`öÑîÜsPú÷Ñ-b4ªÀCD©yyÊ\»(Ëff`ÊKêÁS•ˆ«Æä8ÔzPÓ,““p­Å!Œ ¨­D@ÇÑÔ¨¬¶^2…˜¡ÍV?ð¬k@½±3ª9"…FiƒhˆÄb’@«ìEŽj1)7¨'¥@2$Å>©<cJéÝnväa…ï7 ­-gÃ|AD™71Ï?é\2…é}–I4¾©SÚBã�\ËFÆKA�äêo~&ÞK€Ä;¯ö�r§ å"ÅÍFpïÂûëIIÍ{œ‘a�™Åc¾üe¶F`�Úá6}[×r¢ ]Ÿã8H 'î«Ñxm ÏK'›ÌÒµÁ³ŒZC?ÿ§™…Dbû#ÈUç6Û~„„!³å>z@³šüMú¼òÉ –¿ýTa75+%ÔûÿKîh7y vó’AÈî ˜qjÒ…¨Ð—�·]OŒFij)´x ac<¥~í«Z'VD���ä2»¢Mû¶Ç¯S’(¥}ŽÕ‘ã' S^À#T‘ ˜–r¹wØéÊ0ï±5žv7T\z1´º ö »‰fN¥sÌ�ZÆ�`±hØž Ä^öëò¼ cV¨;<**q\-¾ï‘EŸ}¯fâéèŠR±Ç:6[V¶Æ<=ZMï=—‡CÍþœŠs8‚ž§“ï=ãK`ˆûš&¼xÛÚ¾‡À™.Î5@²vSQù3ÇPUÈÄŸXMÏñânÅvm¶Ëô?µœ»lö{ÖªR-»•sÙ{<¹—§VƒN“?Hï/5 ÖGšá®:Ýgæ“%©Ìy[«–zãó]y—²l}ãÇ![2Ûóý6ä+�²'re¦XI›½ôØx {-ά¤æ˜™äZÞO—#üÛoÉmÖŒÝÖìAžû®“]5áÁZéò�‘ûŒmAç;þ ·µWæž-O ÃØà9ôáU´BÕ»Øo³0 ÛÕz=ûïqŸ5yw,ÚNÌ~?w÷ä¸ý¾‹(Ãû$N4öß¶¿?ÛÈG.8'¥OⲨ¦zȲ(w>±]üÍã}1.«}·¡ff(Ù‡ÓFáLÇøI¸^¹ï½�Ò¬D³¥¥á¼l¯ »ùÍžù;ÉKZû@i·¡- íÝÙï$”·Ð¿¼…RQ•Zç�P•C¤�÷ó•Ó ˜öðßþcv¶aÿxòàrªh2%Ô*Ã8À=@“ êiP%¹¬µµ#Rs¥MÑ¿ýÔ'ÀÒŽ£ÙëÌ$?œ}µìq‘˜EŠþžY§¦�,äk_îáÏ-`1^Ôª�siÌ˵ø™Ö@ €J–o ?z«QÔçD­ûYÖ¥@Ñ�=ÃÓu¿˜�ãžhB÷Åël$ðÀr™hEàU¡ÉVl=ÐCk“Ç—Uk‡S[`æšZèc'ÛŠ¡o÷E~ß"¼¿”¶ˆø �|œÂ‘޾j+€šQ;Ž˜{’Åû²Î5ÒIê]Ó 5EEË,ëä4ÕõÊ¡ýÿÔõEa]\·»gª­= â�´ù€Ê�*ÎÌA0z2Õö´V"qŽí…f2fi•ð p¯P€¢ö¾Æòâ1žÿüu¾† ¯JO/ ÔÅ>»RZ‰Løóó7{)oÎõq,\sÞææp+é Å,N—ä’¾¶·óïÜëÁke£C¯åÞÈ}¦·)’±´òü¾iˆëkýçµÖã�§ÅüÓ’·àHø-®}³7§yÓÝ_¡lqÎ{•¤hýüõÛë‘*)jã¦~Y¥ù©2V©‹áu>ŽÕç¾¼DD·á5'å󕘪˜w绾‹i»M˪­Ìü6¶¢BùöcÛpcU;v ¿'׸r¼¬Ó¯Ã9OggSÀ�ô M *ÌÉ�ÿÿÿÿ0ÿÿÿÿ7ÿÿÿÿ2ÿÿÿÿ½Þé;é6Ô·}ß OÚ'ï.©ø�”8IØÒ-ª¢*5V�6%Ûì$_þÄê7íØ{¿ñ­‡ ¨T–t¨‘épp²ÒÆ >ŒÈpC'ð=~jÈm?úôyL×ÕÚnùáï_KÔ¬CBk]#è!xí,¿n!e¦{@U€º\Û“ÿŽ -ÃUzF»y©Ô½6ÐÏXDFësÜ’¦€k´„;‹©ÛVmËtŸ4¢¨©Š(@˜1W3«—õ1@ýòÄö¡¹°û~Èü2/ ª©ªÛž°pÔ/àà0;¨ L Ӯ¡OhõUÖX¼«–5k`ôçëYs{q~¨¸¦Š[©µµ§KTèÐ 9¤ŠDcFyþ¡Ë‹é\Âh¨Ê鉵Ýï¢B•Ò"^úq—ö‹Ï– À3à!Ü#ž*ÓŒú4KpôQ=O۷ɸ“Thi ’bá{B)C`8ýi•‚}FôëéŸÇyLec”ÀíÏùŸiÊôBõêö÷e¡þ™•z*¨çM­cè¶)C÷hš 7ÒpØßôíÌZž˜V݀؀uýK1ç•'¸”CW€šý¨°* aƒí¦H𝥸ü�S ¨álæ=‡r%oî—6Pð§tý1õ”Bÿ ÙbÝ �É}6™æ7ªÙ6ÑÓŠÛ!‡‰çk»÷ljzGª´¹ÇTW­wK™Ÿ†£FÚx¤ƒóvg?G)o�Á�s¶#ëëÝ‘ÃZKÌ嘎Wë¯ÉMŸ/¿‡U'µ‘êDu—¨ÄÛ1zÄF�ò~ü ^à�|¢6õD#wJŽ.nÿÕb¿»ü¿~瓇—ë…á›b·ŸY´E¸Ô‘ñß+æù·˜"Pñ¼sN=œÑ6ñªp=ˆ Ûw”HÄW|ËÉÑH€@V´ù‹Æ6Ȧ$±jÒÃWxÁŠ+¯Æ$/ˆÖ�m¹º\•4­6Æá«ÿЉÎ˱¿]°”%DÀÊ7¹ÁêÊó™Ì…wùo-}~�[�ÂQ\Åú‡|tp—ìaÀ[ç6æo9EC˜ØÏMkFáé &â‘F�‚.nH6½Z›7Mg ~O”ÞÅ¥·°Ãá¾¹îÛ/;Jÿê“ǂÂiä�� æzþ™ìs gÆÕǽ«òüUKí0÷>N£‡yñ�ðí=ë'çv¦ý2 š]zw®~®T¬¶ÊÏ‹üu¸YŒ$yrú“OäÕrâûn­j¬ø¯XŸ—ÝõØKÚh­?!«}¦h×SÃ(–¦HêÚüŸuѯ‹uG™êPýw;ÿýÞ“®"¬ªÇ<=«Ò‰QoŒÍŠg]ýÆÉ† ¥rH£RͼI% UHËkù³÷ßõ–6×¼a¼½ Õ³YcŽhÏ?êËoÙ�ÎÈí«¼̶š~�×Ó¯ÔÈ9jjš¶5J©s7žÙ;ÑúìÃó'ïA.™í¤xzjJx×ëªØge“S7¢�±·ùªÅíÖ/ôõ½ù¯Æ+)\Yb×]òA7d,°êúíuÜXÀzûãäF ¢×u½ÚçmAOtÁßàÀÐ ",TÝÞ’¾âøÒ)IûÞ†žè![œç¿î:ýö?[ˆà8uÐzîc^[+]•¦€töª0þL›ª@ºç¿Ö#ˆÂ|Z>óßÞM�T ^^bË+� Qò" ~Öd Í/{é Eá@“‘ý6è•Ö¦–])1VlL5Lk‰MΊ ûh­UY� Èß:ŒGç”6© •5_Cœ²'(0 UUܘj Úe׺‰Ã_ÔkW^ã|ufw ìÐÞÃõ€'ç%6Tf–Ð\|'1q‹i¸Eê«oL/YU™üO ¢¶]�t"0 ²çùtÂüé-&ÝÜ"]µÕü.‰&·Ÿêži¤¥œ15{äþ;<Ž¿� pi@t”rü˜R ZÉA§£†ª“€�827-‘Å$¦o—üñàÁh×[ž‘²5�. A–?;VI¯˜l¦À¾ïyžØÇ•[ ÇçpðçÌ’ 8î·¬„Mï3qQÜZHãÔŽž¡�ĦæÊw8Öáfs}L ÿj"Æ^KÿQf‹Äƒq“ûm‡Ðì·M¾K¥+úrak‚aßþý[s±Mè¿ ¥õÖï½ žy„¬x®ágÕEéØ%Z` ¶¡<¶ßõî.{•¶Ú³šºvÇSµÎÉß;Öø<1Ø<•9æîy_9ü¯wX½a¥Ç¨N5’•0ñƇôÊôâùgŒŸðW2ãÇóp‰œ!DÈç‹ù›þ_9žUÎ iJ¨ž :��#x�­ÚáÁ:›ž1e1ƒêœÐÛ’�e`­:) ÍãÂ'e‚˜¬3µÈ¦Ò¼9•¥L:<·3'Øé@I7%`z:¤Â×Õe!øË÷Ÿ›s-Kä#21ò®·$þ)ÀJRuð½ƒ\®ß7ì5w!T³q6Ác/¹�}SOþ×j&Ê2¾nÞ_Lh:®7ÚùV®¨r÷ìçÄîNW”<ªÏ}î**νµ;®X{Y¥ÑõÀoþ«:¯Ð.�çë�U.Æ9'èK¶ˆã÷7]œc}zÛ�¥†Ü]'9|Qâ;¬\’m)Úf}jEVéÅZ¯7µ»aw²"ïW“:…Ç]“×�’%àpó-òùsuµåÖœŸkKb�­ùîÙˆÌ0…FM~¯[&¯ŒW-Œ¾$%6$Mƒøà¥«Ëøšgu³^n.‚ Á´ýQ:�š4¯›ÝïüÿÛ—F*jlªr›æõò8,Ægéióºrl_ñ”³ËÁWÕ£?¯içn•>UIGÏNæž\¦ ç¦dMçœ2É ~�¡R^ÙÛ‰[ZŒ �c†OÞ�<ÒãR™ö‡�F(MÙ)t»3µ`æZÿÇÇ›n¦…t¤k’‘”oóãö‚@W*‚¨BAÎgÍé«“*ü=vPfå>ˤ Šäó¸u>#ÉqžàÒªÁŽõW~‡‘¦ED€y`iQPT(&@«·�V´D‚Q©DÂ,)…saZ–P<VgS1(f¥T¤ê§¦DW‚®—C4'x]]m-êñ‚ž©í\º_*™›QÞÌ”i‘9 d­dk2¯µ®gí:S@­‚Co^ÝfEMƒPç@s�*¹RÍ:[Dvå» ((šIxwUÂx}mèî�éú+5 d4ª�$ êØÉqk =¾‰¡d²�g&/‘ÊvÑ…ÄÕn°Tï©‹ÀÑgN[wUD ÂåÙe#é+¢¨.¢6³¢›‘/@¢ÃùB‡ô¬UŸÉänź–™"€q í�¹&¸ƒ“nØân}j®÷= j9ä$Á<½g55³Sù¤zTu°/<Ȥ5šÂƒ?Àì×X¯HP�ÆŒÚ5 :ût‰þ~g�ûÁåj¤×+§Û�éWF¥hY°ý�}ºû�öûtWDƒøÌ0¡r;“fM~sºùYôŸà-¾í‡®K¾<2þ�Ï}¦b¨}±ÁÛpïˆ#ìùþ,wªòŒ™Á[ßùçï ÏØ²j ·÷åx�ж½Õ.&³p6ƒù_›Ü>&X\“ªŽ¶a¨”Ç|ÇõÊVÛÕl#0|¤âˆs™zÎJVŠÿRôš¿†À9�™çvfùµŽÂÐ ÖNRÀ›¾%¶ö¥ÈàYq˜NRÅIŠ˜Db·ŒåŠUÕ*<Óh޵Â[)' ™™ DeäJHÀ¬ aMcrqèNQµljÞ1yå즯‡ϥ7È0?Z=»Ï¥½, ²Žª9Ëqÿ¬’6ö4ˆÍ`¡U]½Óª¦× —sý®1~ËÌ%uE~7`åÀ&ÑíQù`Ž{¯¦­ç¸sªT×]<ÒÛ3ªÌ„«ÅªÏ ãç*T¤7~(xLÎŽØËœÔÞ×(­7 ˜‘´ÐŽY¢µ¿.¡¼¿õbWS¾OìÓ ê&U7YïGg™�yµ¿ír…DµèÉHéDzÉçdå’#?À*C^¢¥Þ¿Û]f�@òÂûÊÙ›·s â ŸQ‡”üAÒ]üLZ�„æ*�{Ÿ.»ýìœqÎY•7ñµÚE2UA;+Ó$m5Qöv03ûâÇOßßFÓJcœ/2ÇmMæ‡FB,Ÿ!œwqgÚ–È›é+á´=¬!q7‹5´˜s“ãën‰Š�1fPhçqêøh7óÁ£�ñ¶³g¾~{¿.ìû¦Oñz‹Na1nb|í¶"Z´õÉ_=ÌÕ¹ç¯ý§~�näË/ôèíúÿŸZŸòfkMkíìíO^è×Þ³Eè¯f»Aé�h)Õ4QuŸ©{Ý;Ú';{©pЭîn•¼îÿÈGØÖko¨:€(ÌÍ�ù÷§±ÓTRž%(%H­Q+}zÿ�—ºù¿xå¼k­õÍ#“¢èL)ë?‹ŠˆéÐ:Hi3µVò¨\î͆–¿þT‡¿;†z˜ð ó�â9gWåЪgתq\ÛQ„¾PͲ¼™yÎË2sdÆ U„¨EÝÓ•ÄX¬¨êbêc?=·DÆ�™lCæTƒÁ=Y�TÓ0—­XQV�ÎkZ£~çøÃojÙÕdê E†z(µé2Ð:¥TåPŒ~èéä)†)ÇSôuvAew¨åüò©2˽Sëð�émNš£­öeÌ%ñ=<Ðqôs¬K�A gHȓ›öžfÖÜaî¸oÆ.Þ›¹Õ×E¯º½À+?ýf£±ÍÞ7û³ódêÐ!½TkÈÛ”¢~±WVue«XÐT}§O÷2ôP)fœÇÛí:„ œ03õ’Õ)a¬6#ûÑ<_г�˜´»Î©ó»+ó?ÝóÓOó,_=w´¢?¯šêÇÈ×&­«ú5øÿõ|ØÜ¿oqµ¯–77 A{qæ˜þvå±Ê\O{Çjj\.¾8�/÷VÅÒó­=ØPƒÿlÓÖt«sÞb-Í1ÿè%Åxoéë[Wm\rïgý�‰Š–O[Íú­e¡Ý©<.iVÇ�æ�y6ÀÀM¦ÆP›wáŽh-ÛHO¢!)&¨ðOJ;Rò Ï&—¿ë^8êñßàè¼ü8aüc®+’ñ‡<×›,On|–çOèI >ÈÞN/çÄ›ïó×TËL ã;ð™…Ea�?$òdÑw>ÛÔ^G?>m¿©�#õ?ªÄÆÙs<†BãþÇ£‹¸^k@A ” s•CöŠá•=ÔŒ:f¶½¸ìÙ žvêûég!ËݷѰ’”Àmçêj¢6åx©…ˆ6Éc§ë³CC?¯aRïýËçr᥹bñ&”õKû~àÿéiW¯xæª0 y ¯cú:¢G€Íóö�žÓ6:ÖÕÛìÓ¯\Ç‹‚žCÂüó:�ùMåzç {=çÏü¶nÏÏM»>óŒ/âÿt|ûý‡|og7¯¿gö¿�™�u»ÿß-wiñ{?Šýñõå5ZÏšîòå7:ä¡¡æ÷ïîÄöÇ{=VÃñ§±zýD`{~µ"âÆxÆÿã�K%¢ˆì—ô•³Óû–‹ùJ›ûR“DlC „‡9͈ÔEYö&Òe4>×*åh ëWïϯšµó¥Ô­îâ�i”¬ 6ÑÆ W 9´¶ùµ5^TÍÓJvj_&ÑÞ4úi~8µÁö=þüÁSo¶ó¯ÏM»Oùá5Î×ÇÜǧÇÓú‹õµû°»ýäÙ¾êƵPNýþK¯B‹t«ÚGœTúÐxk>Îü¾m?Ü’òSˆ.P�ªv)WQä‹IN0<÷c�v¥çòÞüfÝŽþ_M•Lïf”} §ÆÝé=1æíTÞð@3~î:˜¬æËLÒþ‘¿ô˜ÏÏ�*Á�ˆ Ì)¬×�Ñ_†a-vUd Ó bY°”Ò7idPw¿]@íö1ë×Ïø×Ù¯~/mнÏ×ÙíùjÿñœÕòy|ë¯7Ö…Ÿ§Üª¥©LØá¯iX‡C7êµ÷멨–Y¦¼n—g/¦õ <™îT}Sõé×¥ïÿ”ƒË —Ô÷@wþÛù2!3&¨‰ÚÓDÍÚ/>É[á>“þte—t0¸®YG]?æ9·›*òôºNÖv—HzWsºé­#(MÒ%l8ñ}Ù±/4 á æ¶ÿ@ŸëÉ#õBx]ë ¼¨×í/-}„òÖõËüõ™õ‰£¹—ãú/lÓ ;<õ?Û�q�^÷½òr �®JIõã‘ ÒyõÝÇl?‚ b!vù.�‡G|í ܾ{Õ­=ËvÐøwT³{L¤ÉÒ92Ÿ« ¸ß2`óèéx¿ÛÆc×UuÅïÀ,w“Û|4Ññ aŸßÅîšM4.]sYN)¢¡8L"ßÀ%DÙEÉõ²~ʦ_ë ß�/æxtU²À¾ú�¨ªÿnçÏÅyßàü~«R{ÝùÇ/((Sâÿ·Vè˜9öX�:³*�’\Ä!ž†°¢ð}RøÍÛº›(8bRyëÔ€k‰‘Å >_#C£=üª\‡•Ê÷£qbÕ@…`LÁé)ÄJ`2Yh:OØï.ƒCëÏf9Rr5ÿ™ ‰kRÂ%ÿ÷ÝúûJ²Û»�dö§ >DÕäÛï½Ø�IôSB~¨Víÿº P¯1¬óÍOxß¶ìk/ï›PDr|ÅåýÖiî>©?ÖЯϮ�ô÷GÀ#ö�þ¼‘wÔN]Ù“lwÛƒ:,W9ßsýŸ¦[úH4ËVr…ÑqgÝgµ¯°¨šÎtÕnxÞ„ßβl�«AŸÙî[sÚµÌ#*¾©.WA²Ïÿ9móëæ?ª¸}óøz…gt ÃävðêugR~±ëá¨ív€ïå`ða_uúßd~ßð±Ù6©ù‡»”Š"½�ùÃMÁ"åµøý“9«TUä‹3?”|ËPÀ@œ·'Énžê¹xâš]„¹ÑŠÞ'gs¶ò0Nù‡»á0Ü妨Aº ¶J©øUØ=t:îªZ««»§ÁröŠ'æ²â£•ij;SUv¢çKk«$½¹ù¶Ts$§¥ùYjº\ížqo?Pˆ›‰dß:1�GWmzaçOG®øheT»”ÎîÇwê†ÚwS÷�kjÙÀTïdÄJéú¹oÒµ9rµÝ/Ó}€zn˜Ò#›êã_ý®Ül…)ð(ïÁq×h]Mÿ?ºôMqÓ˜£É �¹÷0΂ÒãéÇQýÿ· |ÃÌEýR »/‘ì“…•[ÝîÃòøÿ~Õn³'T}¤êÇïä÷࿳Çú»ÊP;N¾þé B~äp�®•Ñ¥¦7›xJ~/¼¦0€``Qm¥cƒŒµù¯û¹cvh6ܶd;IüGå½8/ˆ_þü_E+|Ó²zuðüR÷�£�×±¶?Z»»æ]€Yñà¦óŠÙ-Å\ôá¢Gëò‡VTbã0É þhß³èÕE�6§׆Ù�bJû[ià2xnÌû–«(*@ä´æâ/lñ‹v!H¢×Eœ›­¶ ZÕŽº˜æ˜aè £à÷öGîžáAW¦‰Nk¶!ÁúsdëM".ýàí—·‰tO±ÈBm6ȼìçùèLŒHqÀz€/µÇkMý7õþù ðµâÁñß鈤8»Â2«ÔF“/[ù$â„·CevÀ��é…^Èmy¨ãÍýçt¡ó‡°Æø0�[’…œæ‡ìî<Å’r³‰–�÷¢kM«êôk¯,îa³Ø¨RŬëK«Ïn3\Ša3ÏÁÖ‰é�"q¸˜­­1™ÖPX_ly¥÷¿ÍX¥þóy¯9ÿø'4ÃÝ€XÔmp�Çp§µŽ›¸´àÇa=@ÛÞ=©›~~ÓŽ×ïÑcñòVšÓÓZÿ~ìGÌš!Ã'[5ë{Ý�ú8î«n¯Þrã·b|õî²)û`�—ò W½Ñê‘…ô^*�¾x©’ºYs·…ݼªã8?U™ ©’"±o’ïשˆøŠ/î¶vA§ONòÒ÷X÷#YêN4\µ˜°±oñ؉ßpn"òÜ)>[~æç%Ž_q0ŸÑ}ÖͲò§ÓceŽŸÏ)ÚnÎßî)”�`›�±J󳄮õ ]¬ýê_?ÐË/2ø¶�Ñ#ú÷B»n¿Û�j7½7Õß?"õþ�‚ÿ �ñ{ªÆñøÝÌ·8eK¼çQSÜë”I`ÐE3}â*Ϊɗdr)ƒ(¡¢º�zÿM[ð(¿Žu+�‰ó_î{qqpöü®Ï3¦èŽš±ÚÕ]£[â\&‹ž¦Ø:óæ–ç²/B°Lã„)7Ã��vÂjà~ºå’¬_úk&:8ÜùO#ƲÎ]X,ü%S\Ô¶$KÆ$yKV¦�a[·##tàtëüíçgÇWÏïþPt×R¸`5”*º‡(úÒ¸°—s5†çJ_W½éï_\0¬†Ä )ú|J.DFýó4MlkÖ0wÒ´6€S>~òþzóâÝ hºà½«¼þûë_•š€þ{ ûõ?j6øÅ@È;€:…ÂÛ6ÂÀ¡ÿ~Þ '©l§`ñLêºÃ«¤sJ‹ÊTDÓ *ª²«ýq¬a¼ªV§‚¸lÈa*-9%ªZ¬'’a^\S[‡Q�l•‘P)JjËÌïG«ºœeãèŽd-jY�H¢<£)æF£a:º_ôxþö»>N£3Ú}ÎÏ¿®ÕZÙƒ_˜¼_Ñ{†@2®Û50$Qªúñ ]®ÚýÙS®7Xd¹Ýœs„uýñ¿ïâ¾®×öøÊÁÚ·‚\Y:qªjÑô.#Kÿ|«Õº7œŠJéwÊ {yâÎbÔa¶†»Õ¿« õÛ*¼°eæ�$Fë÷Ê~6î¯}®—.8r×@ãÓ×Ü]ç�w¥¬AóŒ)Éå)ç[vl› ÏËq¬¹;Y1.5V8VÖ7œ½Èìc÷8'\}+:ŸîÏ÷LÿQ,Ë2€H`GË·‘dVMsûÊû\‚‡ãÔ.cc:K[¾­mÒ4ì®Ï—u<Û!?Ã;q÷^=ï/©ëÜ€e\/ ™J *´i™Ž9½OÁñ8ÑoUõ‹A„È#šr.Î'‹<Ü´Æœ^¿™ŠÇ—Za4ϱÌVÝ»çÇV§VÇBðÞ¼Í"WFú^Í;gyÕ½¤§Ä/€NÕº×ð¶›ÅU~=¹¦W×A6Z3Óúé�e°»<–}_[Àh`޽ÅM ¹é±áÿ–Äñ£·õ·ë¢/°ûw[y½OFZκ¢:ÖO&Ñר^?ãK©ƒÙ9gï%´âDåÂçs…/Wììß}è•7&šdHùÊÓ�?·C«’;Œkw&ÁiÛœÇôÕvžW_‰ ¢N•A¬ù®h1šÅn"`È·îë�ö�U—ò›&åûtøýó2çÙ¼_%vÇÇ1¾žþ÷×¾jWí«º3׺|–âùü»tºaæëê0°“{|©�íþf®É¹ž/ëÝ?¤q4_Ön]^Žcý›°™ËË<í“tœ‚h•åI•Eéеëá™»çë;VéKªorøfYQYt®OU3—ïóìüœßéñ–¼%— §EÔÎ   eß„ñ˜ÁyP‹<Štû+nˆ¦âˆ) …ëã°/ êT½žÈ>Už×Æf§Ö}·¨Xü®¿¼]Þ)¼‘k„Ah_ËïšYœ•{žšè´øÏI͈w¥Œ;'jÆãÇ’2bÔ$A÷�û•3x¤5^–í¿,à·�]¸îÀ³uyn±Öð&€ ¨ªÐ Û{wp¡+ˆîWD© ÀÚ )€GÇ€÷KþB ˜‘  êÈþw‚çÿöºp?�Vî�aÝýÂ�<Hƒ( 2¿ËA°ýECVh©—~åS[UTðøsÐz%¤§tBU⨱Šè£H €ÄT‹P*[MÏ8*)ŸÜöŽ¡E´I@«–©xàs2�c¸~sûºbM÷ÁG¼Mˆ­��†NX1tsId¯@Ù=W‡øå¸ À À$÷z6v¢Ï‘òGêt²ÈY¨Ö!f‹ó\wÿ¸T),¡¾{ÛÊ2óï=|…��ŸR÷´]"xAÿþpþÅ".ë%Ñ¢°÷FM$~ý—½¦Fñú§(UIïbΖ ëT­ 6uü}²^¢ýlZÛÀðzÛ{D5r6hª^ ä‰'©e)g·q60Í[¡}ömëøÓ‚þû BþÆdA—‡Ý×­(OggS@´ô M £4UÿÿÿÆÿÿÿÞÿÿÿÁÿÿÿøÿÿÿÿ|Þ)¼)kzþ�ùþ¡hëwYœÈWV_DÛ�S"ú.€}©²zC!.¬è~¯3„Q\ªî;C@F À…¡Ù%¥èµy¸€W T~E¥¦°mQ’üº”¤€ž½iO*¶µŸ‡?tD÷gJpÈE®N¿Ûpœ¦ŠàHqm®Wùù ·›@ èE@Ø€‰vz(ü*€{ŠDð"¨R‚´50÷snóZ'�™:-µºQóý«åðæ9kã9ª*‘ZJ@ÃA+HÕÏܳЯ-Ý»JŽã\î>gæÑÔ]M}Äé�/Ÿ7LÝ’õ°2:↠D $€ ]Fõ"«+ðP…2$0­ýÄ «Âþí½%Ñ^X@ñ'§¨‰Ï¢bƒzŸ'950@ùwAÔ‘àÈ¡ ·høAº:µ..x¶E° &„Ú|Œš¥¶)3\ugàI²Ba9µõÐñ3—Ôp¼ëÃ�Ùó ª»jì-@ÙF¨ê}—¦­�I�ŸNtã¢Ä˦Îtayqº]µ­CofíÜØÅ2—  ¯ÜÀtoy:§\q‰µ‘BïÌ Ew4äÞÕ SýÏwRû‡«+žâ ±ø¸Š4!à `C~_е …�´‡› H %0Ü�xm]Ñ|WœÖ¢ñ‚7ˆó¸ýW¨<±SS�‘|!aÔ|f�‹Æèg»ƒûõÝÅ`UrC±œœ®{•äu»õÿSXÀ„Û_­B5óÁ®‘ÊÃÍY@ùnyzdΧ;?Oì¾~ÆàéP|®NU³Ê†CÓVU‰‹cî¹Ç½¸zàîhYˆ£™eOùâü�`ŒPÏ»ŒR£ýüÿ×Ëîÿ;c#åo‡»‡JÏÜc‘12vŒ¯»*Ïá‚×BV)Ë—ù*ç’_ú«Nzœƒx)aZó-«¸Ù¾ð2ÎnF),tu —`É¥ÿ` ÉO‡±�Lg·•Í�8�ûãýÔVÃdýyN̦¿&�ã²°ÿm›P6U»^·UâäŒø(sã-¯_’.Ó9öERΫý¾îW±q¦lþ¿|uúýv×th­)ãÙ;íïI’H±„¬KV¯×¦Y§ÅY+Rd>²’UÓLÿóï1�tBÖ^šj C(y å_‹;%Š’¦ðËvÞ K½î6ΆB¬SWÐ’åŒ ÃWŸ—†ó˜ù~³Wƒn溢٨0±Ñ”À¸>¼Ü÷ŸM7½rTãû[¨o� ëÅÓÁT«×{‰·«É¹(&ž ¼òSŠ?àýæsÝ$Ü3-IË?N;„ð^‹ Š<3Â(À…CD¥Ctä¨8›°­8ÉÅ’Pçï÷X¿úó_Ã…®åþ´‡´@Úú„1åSô¬üi°lÅ�ÚÓ¯-i CÍ÷Ê'Þ‘ªÿ Ézhw8(€Œ¹Œwq ³*ZÓw Ò÷îʳý×}+­ \¤¦ÿÏ]mÀ/y¯`žÒÁ,E€€0Öþ¨÷ßÙT¹#€(fÁ#!+«´‘y$wœ�’Ó£hµ9¨ðDGÔ¤ãŽ)0‰˜â8tV]×éñ¯÷ˆ~ï�~G."ö^ D޵þ¨, 8K·Ÿ1Ç"óÒª5¨}¯›øØ@Ѥa:÷D‰®¶¯Ùã�T˜¾½,Bq?P€ ÀP€2¤uTdé®ÐîÔa,€g÷w¿çùÂõ­ÞÛ}i-ÐÁóWßɈêÇåà>]ÐÞ¨ÉûiÉm››M¤½�¸ÞÚv}lEO£Þ÷Íç4~‹Hú‚hºáÁ!€ÆÓ-ƒoí‚(¥‹6äÕ€úŸJ<Ÿ¯ÂLžuÓ妉„Ìãß ÃWAž×"zäè|Ôj¿mºå1ãË–np[ÐU?çöH"6“8lF„$÷Á ±ŠLTãF–S{À¢…Ö¶r€º­-§›`¶‹š„ÖÙÿFa Àh FŸã·³sAn´”já:á,-‰”HÙÌz¼i~7¹ê”úÀ@š¢DÞjïˇkþg_Ž~ÒpÞ�–¾QÂ"Ã{Å^��œ(0$>¥KQÝ&2J,ªêFÅóDËæ|id‰Nõyš²LÏ#ÁöÑ͔۫·K~xÛ¨» Ú`±å¤Hvã=´Ñ8/áVN]ñÝ+72eäÇ|c–„½.Ï ù5c“æjê)˜·èKacj£åÞ3Ð×ò+øøs¶K¾Ã%Ê%æXÛVµ¼–Âò¸µ~` /aú?žg ä‚eáøz· _jå�ð&�±ã>òÈû;¬GEîsØïqjVM²:(v(‡ì;ÆQR}ìMÌc¯•ýÞvëz]Œsóm�ÜocóþW«Q"‰}”:¶.;­Ó8²ÖíÍ”^‡�¿í"…iˆ\”«&¡‹ü±?úó±ò»¥ÊÓåV�i6Ç�φ`F¿8]Y¹¥Óh€ÛC‰Æl2JÙ c.“ˆ†¨ÿË,¨šÄ*Òä¸Ë#÷}Ï1eRÚʾm)?›ò‡PòÁ8¿ûÓ^ ÜÉ3ˆ´ù5õøn¹kšx`ú1 ±…-“þ•p-* /‰�êîõè_§”l~>œ‹×õN£² "õc¬·ÿ½bƒ$Õ]yÖ¿A»!?\`à…:©ì£ÛÀ•4T䨴:[-R»_ë� @&á�§Ó’¼^ø£t{z_¼P…ÐøÓÞyÊþ=O VD€#ócãÞòë´H¡À‹Ÿï$ â�椠˜5 L€\ïßÿr »á[Û" �V´–Å�»µ�ƒ+U÷C&Š‚V•GÔ bªóôPtQwê„Ð8Öòi i�œÓ]Œši@5)¤Ž‡Ï8d~pçï¿’Ú0~Žs­«Ëè](½Sk= À×§2¦€ 0dyÍÌ I1ë§@ãñž‡ºve€:Ù$I`ÕÞkÇ}B¦�i…7‡Ÿ‘Рåõ©SE¥;8¶6)—»‰Ãiá{ïVÊž_7…�}u¦�ƒ_(E 㟳a?xßÏüw(`P;fX@_˜$’S.î~�ßµš›áˆºÏàW›g¶}&rïžAŠ@·ØìŸ~ÐNÉk²/N?ÈDI}¼x cÆ‹ïPYæ¾?ÝwÞ?äíäF{•ûY_@eÉW/oÛ6%–Òp½{~FbuL™PÀÎkéŠT@€2x Y1_t}îâúñn)€d)„55h^i¦Ð¥M6´�H(hƒm€íV(*`ª;zmCÐLÆJïûŠþk`š¦%J,"þŸÈûùe‰}ˆo±òÙÛ5”&CÅp”ûØÖ¾�Häf–VEf—,�vhÔ@hmõ…”fU}f3þ¯j¾ž°î®>ÆÃÂ9.7– á‘o¦<<½MQ§iÅTëÑôÝ/Ž�Û"Ùñž‰JÊ(m“åÕ!OÝ󟮫ôñ\fÈaU+Éq§ù¦ª+ã»<û¿ eRyé*KŽVWo@Æk_P¡êù{p_Ö¬ÿ:k³ÅmZE%«h½è‘…¸=稑«:ïü>�ÏñÔÇcÍœêèîÞÁ±µ0}Î ÿ§“Kîåè*3uj/�Å`†ÄŒ†uýÒn:þ¢x뜫*¨«ßû½Ô”›ßË›©,oÞßÊeêM\Ôd×ô™Ö÷—‹âJŸhTÄÆ‹«÷_á[z†MˆÒ,2 жÀØœ ¥îÏ ]h“³’±Í9`ŒÌ0•2…µyyzñÿŸQ–ôÿµ›ò칯Ϲ¾7¸Ñ]ôZÕ?Ë»X8Šº=&þ¼£3!0oþ ê^È�“Àˆ[p–ÂéžÈÖóñH € Й[£z*j`ë T•÷éЩõòâNä�Wý¹E†9�ISDõ+!hOÿ=� ­WTjÖyx€í^К_~ì ’X™Âž^þ‡èÝ¿2H8Ù  €xóØËÕ>Þ-Œ»ä@ú�]ŸøµÿuJ`þÀEðëžÔl›ø5Ì› ­»€ßtJž;ð|8ÔxþŸ¯.úÕ$J¤DY‚ e& 7Ø�Æ€�™ªRÐzÅÞ'/¡ÌŠ™ÒYT$ˆT´C'ò$IêðT²w\l-õW}�Ê•W¾€Ä iæÞåôè**‚J¾@„£d$0+¦k¼ÊȲZþå[ç¿‹>ÚÏG¿t4x€œÁW"’ºü¾‡� QÒég'´@†ó ¬–½ óôñbo óÅàt„è/Ûò$Ç޼Ht˜zz’¾j¨…ú‚È]™�kÝùLoò;ŸÖó!h7ÙåàzL©�Ø®Ðé¤ï#úö¿ÄÓØŸVt̾{´r4û˜1nª¢•ÇhrÚVp�YŸ¬z–¹2ž¼»Óí�¨Rõ�‘C7ãö"5ô\djÞÓŠúLúþýSáÑQôå® bˆcq{jׯH#JÌéíE_Ñ·KS6›‰¦êN3dY…,ƒ�5«À1ƘJG†ÎÞ®NOP< $Ölå΀sF®:†‡rÔª´yé9Ñ ô²N€ŽBk(ÎΦ…=ý\f>%Ûh=Àîóyä5{ö{¢¸¨â9Y\•”Ò Œ…(èž!çtH%Kyž7í5‚À}®ÁpÀ9Bì mfÄÓ¢Îßs†j’åøÝådO›ý³°_ÈNøRîŽ<„[ÙfÅMA-dw Ø'J8#Ã'•uU�N?Á»�t–z9ílènÒ>Ñ—E_ñì:,@Î@Äû ç»-ßÉýº²ç›¢ÐÿlsYq]¼š½6>–{Hèú¯É=H;¨î5¯Ë·Óöjü—O›°“Rµ¡¯N“ÑÓ¥64¬¥Zš|gÈ«ùÒ<¥Y•¥~‹iyÝ&}·�³³sƒëe*£Ê�÷+¸¥ åÒé;·ß×!ÔØx¨O“×ùÕèٮټ_ÚÈ(ª´9Ä:‰®²þ´¢O“&ïÛµß׫é×ç±¶áÿþn^ÅÙ=š¨îŠx³ôõ¾®›õGV“h–ç:ÔOs:$.·ÍÖˆ÷F‡M†®«cø>÷�ÙÖãûscêËKÊÕ—�Æý+¿¶¹\d_�ÿä¼¶wÔÁS,×ñzjóÞÞEA| <À3Ó°Ÿ·¥(1�Á-ùˆg›,±ë-QT`XXãÿôȲ”w.L1,?ÞúvÞõø[/€[…èA¢çìê pÁóyz×¹¦~„œz&ÛëP­½õÿäÐZ�”v¶Ú´Öú×ÞÛ*õÜì¢:õì:T@Âb}pÕïµ�%l´Ðg-€ƒâz׳uëC?¿u–ÿ »þ±ÿãšìõþýÝl/ð¾( º›ùñ±4Ò¯/#ýZC/S~UšÙ¡FQ‡Êp}¾} %;8D„Óÿ壵Ÿ>§.]7¦�jšyèñGÍ6RÒbÕUËŠhw—¶A3‡Å C{j³¶XÅÕAUJê»&Áº÷+ €æÅöa÷¢µšîyU­èñ~e›¥ı®Ú´¬Z¿û÷²ªü™ßÌûö*´¥ 2‹%¸û4WUj)R©�Ÿ“Ö+ Ñs9Î䤈@&¥(!u­ysrµ>@ß‘9JH†` V;ïMT7lÊ}‚Wk_X1Ùçô#“'ßßî½7Çé¯\ŸãÀ)ðrÈÌ'oø¢¹_OWý^'£ÝÍÆÕœÓ4Àù]l4UÜŒ£…pfC÷ªNuî½Û_záJ&ŒÂoýO'b¶×á�DÊ_¼×‰ûéó7ÿÉdŠ7HÅ-³Ýþ8|›öo£¥ˆ+'z¦À¾‹ñ0ÿç„Á�žÙ„HrXÊdnuç«Ì¢³ß¤!ÚKúçŸ@?Fý_C]"A³ÿïXN¹S 4‚ÖäØUN«¦[­MÄ"›z&Bír#[Ë#íC3~¸VèÅ6º‡¡jp"ðTEZR'5fOŠÝkD)p1£¿B´Utz·¡j,\îÒëS÷¤l4ö¼]o¹¾áïQNâ( ´aD‰T8mƒ̽îô¯qµýjŸ]ëuk¾~¼O앲m\ÜX%ì¢sΩºÍ*ßi¬îÇkT8�ŽO K™¹Ç /&1Ýè¿× Vy=0?‡ñä.×oìBm™eå¢~äÙ‹?NAb톪4d*ÐÎtJˆ\ÿ4bþjIx�~uzW›ô�3$¹òú#Ûo°Ç£¥Œ§^¶v=¥O÷ðz4È{ÏbŒ»—JMÔW˜½<]Í»@<»Ú4ÙW•ÛœléNèT-³&‘ZÝ>}2x½8žÚ¢8üÇý£ÆÜt{ë ÍQÍì°`%3‹y5;c½å¹õ<² m�cú`±áVgnm³¼È`M؉´f¡˜­ÛñîûËu×w|³ãéñ>›ÕáãÛßs¼ý†Çv×]óŒNÇCÚœ$~æßûêVÜ×E\oÊÇe·ªâÚ”Å{›Æáá×Å~Üå—Kk‡}yh†íû³?·‡òûÿ G—번†ê=Æ«ë²íþûG¼KßÍås=¯öª«n7ì’ÓÁKý]äUíÊs½é6ÇËÿ¸4f9¼öÿð¹¾dU?ËÇ9?ì®qP/ߟ¸HÉÛÐ>Yàèe™¼fje0åØÍ`†_Ñ~Ö0 Ø–“y5 ãe‘èu(š{‘OggS@Åô M L¯ ©±««³°¹·±­ÿÿÿÿ+ÿÿÿ|ÿÿÿ]”oA9-JÛÕf0¾0Y¬*¨×]ÑÝÇŸ¶ >]ËÒ¸‘Ûæî8‹–·J¹ßæu~ù�Bê�»Ì÷«/­ÝxóDJQ$k©�Ò«îÇk„àžæ¸EóRÒzk\—H”Ïú/ÿzúD|iÐTU—TòÝýk« gzóc_ÊÚÊ2$в°´¶×#yžÿÔ5¦Üº¿wFù<%Óæ“ŠÇéx1dé½5Ô+W•ø>ô7„þÎ èÃ5¦ÚzÜÙgÉ-5?Z¿L?Ë«¿ü~>¸ÝDüùGµ:Oõ�s2¡¯X=ãFܬ¬V|× ¨§ßÀa.ƒéUüaÝÏÞùóùKy±Ýþ+TÖuX_÷·º;¦èWlíõ®¡�Û‹®8ÿì˜]Ob/�Œxž¾Ôa<¥Í3k>—ß-ùÔ£ú Ì`ÀvTGÞñ9&»tóü¼‡ ¸;›fçâcÜW ßë®’õ«¯[Ô!ðëȉ §ø/të¼ârégDc{þsâË#áNW2�½&ñ$øŒ§‡N¿]‰¯O6Øž‘Í*‡k,?Ü}ùeæüâr¾ìÂk­Òù·*ùy®?:Ÿ:æ«Vé9ÊÓ­O¹»áæÚqº­•¥:FÇÓC+T ÓH‡ª °âþ›7IÓ'å‡5»Ú�0:c+gFÍã�.j˜q< öP¹Z¨Oý�¨QY[#vý³Ÿ`|ñ÷¤ûê.ÿTˆ–~»ôéÛ_lü qåU?¤¦gÏC‡oPÐ¥‡Ÿ¼-‰¨Ôd ëYÏÍGÒV©ÌazâÀtëþ‰ÙÕÙoѸuyîÅfïš÷®×�5|ÌZå7¡÷OÏ�HØZ&yÈüýÀ‰k‡ˆÔŠºLf´³ühVáì>ö|Æ X8�ˆf³µr#}Æ/¤,aûqúü$_ù*lÌMœºfß‘®iúE]ñ�^?“Mk&°9{ˆ!¯ ‹È¦·=ùT�»‹ð�^úÏn�->æðÚæp¨l— Û‹8§¿ \O ³‹…ºÛÏÞÏ~ÿ˜1æ—Üÿõ»4Ÿ¬ßìü+òÅfÃññle§ÿv3íõ'º_-õI‡Ûg¦Hh_Õpj|.çp!ò§µ´ùRKzö†:x‰ƒDP`ÐÌzªÅ-k͸­èLJ¸”mí{Ò­r.õ¡ÙUM¯�2�0Y_ªíÃ�Ce¹…ç›züÙTÌ­{v¯/ܚ×¹çôn¼�ÈÓŠ5TŠ®Æà­'fcât—` ì"�¹ßmi}pýÙ{÷~ñs\Ïl¿¬~ŸïòÇ}ú³uyxÿîmù;ööáíãóõñ­o}ðl^×"v¿Üÿ~ת¦^qÎù¸ÆûÆOGU¨�Zã¡ú÷ùË-OB+…ô<Àœ£_.ö6¤Ë+2'�ÄÊõç(Áøµ´ûA]Xè©Gv•¼²µ&ßx{œæHÛ«@s#¿Qt÷©\õb6¦­3 +ÏqƒÖ§XϬd»´tǤlýÃá6‡©³È]Š©r}V´ü§ï¯ƒÌÑ~QæŽ?B?Ýöå«tüoú·~½ž²Ñ?»¿ž?‰ÛQõ_n{‡×Mùmoœ¨¡ëÊìqü—ˆ £»ñqU>ÒñÕ•Û­>Ö4Övç˜È.ÓÉ®8gÝ»éýèÊ%È�£´%«fÛB•°iÁÐÃÅUç 2ƒlqÝ%¡-^ÍÜã‚wñ˜¨V^tÇy_OéMbòüu« LÍaL}ÁL¸^ã�Ìu¨±ÞõÇíËãŸÿp6Ãõ«“Ùáë}/Ç´kÉÔ¾·tóLŸŸ2ú÷/VˆÕvæ¸u¼?µd1ØïÙoþE<â1 ‡hø‹ýXœÔ‹ù'• ÛþîÌœ¦on–Hœb“Æ“¯›f#ÓóI¾¯mÑUò‘bNÛW�ûöz¸øÁç;!LœüêÂ�W¯¨“i«¹™¨¦4”+9×ëášýÄÒ|¥Úxœqɦ}h‚ÿ'|‡ÅŠZcø™ŠívxòÎ}à –ȵ_œÑÛ…—/æÃt“𺞃ë¹êp¡pN�sʨ³1—6 dlEÝK*2YמV«§ Sk÷Î;çÁñ:´ÔPþúÅÕÛªä‘èôøò¸ß~_g|þz¼pîk?†NQ(èÚ8i¤{I ór]`@\ò|,2/Kìòl¿ˆœI€:¿ÿ§î@@Yʧ�ṡÂùÛ�v'�¯ßY'Çq¼C;):�1¿“z:nV‘ªgÝïY[¿k×Ö®]¡�æøöoZ�Úõ8Bï]�vÊAŠgS�ðþ¥' *U äP©*PóQ8@ˆ@_:òò»Ï‹†Ì¼.ïÍÑûô¸ €f#s{ ‘ÃL€dì8T[¯P‘©'·×Çe.‘7Î>–ÔÇ;}4cn~nÕùå7Þ>Ëy×?N%X)Ia[ߊ gî7¡š ëô Ÿ¨˜ÙTᬜ~½%FÀظ4;·4â¼F@nqÐ^AT 2FoyîüŽ5%®ocÿWcÉùDqrê|�+ݶïØÊ¯àRHÇIÐóív²p÷Í¢“Ô©o-VJ)Ž÷ØÚÛx§#Ó'Šgèv_VˆgS¶šÏGÉ,S<|a¥…xv0�Ãüfù|/__Åãîý¸êP�”.Þ|Ö,Ç�®5ßRkAµêÁñÛe«­•êꕜÔ?‹eªž¬å‡uÔ=…}K— 4/`ÍvÚš ­+¹Ï 55$Æ‹è‹gñ±tJ� L‰€¦èÉ{ջɦL-U.k;=~O-�®6Lá»¶­æwˆ‡Å¥”øB³UÊ׺¾¿%,ƒ èØ›Ä‘Õ»üë~˜Wí6ÌN—tùT»ÝF2£Ë.Ýëóã¢[o‹.®<ú‘Ê«¿Âµ V˜ˆW}¿Í´gªÖg¾/³?| ÿ{z]Á4`¾3Iþ¦i”je¶5â¤åÁ½t²ê_±º¾ÉÉÈW}Š.¦5Üb.^ŸÁig–þÞ3þ�ýÕŸÎÞZ¸;žBÌïš$ïà8iI´¸såuÅ6=§}¾˜ LÉ”ìŒï!a4- —ôpªçú Ý{\Ò~{'Ÿ¦íæ~:„2Z_ï©^ÚÝ¡+Ý•ú?­?Ëmžoëìõ©DÎ2Êg›·Ñ´œO«Ýo˜ÞëìuºüݼÎßGq—fÛ4ÿ7_¹¬Îí/-–söë‡�š¡¸ß·~Õö§ÿõRœçsôš.áüoöc¸”ç×fX»•}—fßÏ«Õúñ{�òyϲNÆa½N2ßv˜½¿½o¶›oï«„Õjº977ؾ½ëRÆbik/Ë`Øêšë÷z+nظq䂈”ùôçSÎ� ðPç–Æ@"ÞYÜ¢9Â/šÒþi)Î~�Å ±GÍÅVâ�3.Ô‹ÐGTEê?Ä¢ªÚÏë•�ȼþ—?Ü »9Kô«¿ö./àhuNºD¸ -ˆãµô{K`±EÂÁ�Z'…€ ŸÐÝ(€ýo…”‹Îê¶‚*Dõ µž}�­ýñí‰+i§‹YÝ+d ÓŸí=ذ& àä×÷»B ¨ð96ôÜìha §>>ÿ8¦˜Çñÿÿ6€hâø¤Ýt»B먥·Ï“B:`5ñ-“#É3³G Uó>R8›=ˆŽºWg]DÁ•ñ[KßM~æ^?<ªN¢�)€§«t×B®R˜*ˆJe�«¡É“5èÅ�¼¡uSÍiO(T7øÍ{<ØH!¢9� <¯è§.'ʯdPœw�œt#wìó«¿8`�ñÑMÅÏ(lS[íœïªÈ½!ú›/%ŽÏ®Ñ n·�Ùýge$Rj‘ÜÄW�¯7;{i"XÐ0ýOfCš¿£o‹š–ýÚÊ5¥Ñ¯ÞÒHí‹`tÛ£øüÎ;¿huý�6€1±_mÍ.ü‹Ca3oÏx-”ëËb~Êík„±%Œ]Ø›ª¬zÒu^ÞW×($A2"Cp2>mEoÀ'£‡¥ºªsÔã`ü—{këQI��¾³'n¸ÍXf¦Ãh&®GV¡® ,Êê$@Pµy&ÕŽ‹Y®›êë àô/ýÐ*À͸†é3‚>ÊÂ{³ŽQüš³þ<ê#«“’ý¬ÙÞrrøí5Ñ­·ªÊÕùß°üAx€~5y7‹�‡¤~ƒ‹˜U+­0…\(ýZõ./J1·—h5d“1�ù0Xâm³t!7«Ro«X� S®Á•èk©‰ý�¹ìý <[r(5�p˜²ìž4íÝ‹¾Ýv]ôMCÎÎdÌaSLÒXïí÷gzá_u`" B©xkt2åÿ÷Š“hóšËe8X)G'Å0Þ5dÏò׎Á:פ!´:ÝVÙïoœHDШ8>ʲï½M²Íót®ÌïÎM‹ÇÚ{�U5I¾Ùò'š†Óí\ÍÙ¸QÔÄ•ÊÏ¿6‡B{Öo`C÷ôLÀMXü8vJ^´@èà!gjw}"µ[€@J¼±3F'&ã)s!Ò‡ot�S+_Ël·ˆª ¢ý×¢Ð2ê»éº h¦_¸X¨ÏÖéï×èìw �]l°úqØë»S4z¾gÕøˆËó¦³ �ýõcÀ»ê€** <[jo+›*‚tW ãÍ'ÜÜþ¾((]çûRjd:ô¦·ÖÝM À°îÑ4ÿûíS·8'¶4€0TúÎPA èÛD’(Žê,鮀$–-º/좭:ŒøÒt]˜jt˜QJGÁGâbªÙ·¦‰ÕbÛÚvQØ‚„*ØÚ EÔÖ!? $á‚ÛÃ='�¿S.Œ¿©–-ž²åéê{{p´ïóŒ ï?ùq/Pß�þ§5H¯67örï^7ª/* õBµ†nFì˜üú$úÑ›‹2üm“ä`·þã¾÷ /…8G‰UïéêÎ…ptÙü‚íè0.¨Ÿp}àáµP ²"L÷+×MyÙKó]ª`ð<¨GˆÊu68d‹Ùü+±¹¹Ö^5îš:�5 ãžÆÁ`»Ê+(¤à¹Ž�)‰v0˜â[po·Ãmš¾ÈÒ-ì^—ãÒG�"‹ `Ýû2'¿ èþ¢´j›ƒfŒ P"¤ŽÀjNé°$-M ÈóB¥›)ï×dü @‹”¾l-mJ¢i2Hˆîi*nsÞÆi™¯|o¾¿ªîÊ‹Örõ´õáÂ_¯^K!—äj· BÌ7¶Ïäц[Ïý9y¥ÃNß;Ÿ%p0?ÀÄœJòL·™£ ý ¯¶ü¨¦¼ÔüÇâ;¯H­uê³Í¦;È2럑4…•uîüE¢œ¢¬ äçÈ}ïlHÛ‹5bò!¯’h8~Cùú§Çâxr.©ÒÖ2�ç'ü¿í5²6X–±NÎï4ó]¦šÄe]™ï'훃ñYå‡ô=ŸãÑ�.i�øV-ÁÞŸKy¹?¯Ý&ø–(Ž%Š|jyîùÈ”î\%€’uÉeÀ10ñe¼ÁùPëHå\ ‡Foýø¹EOe.u é×ÏçIÿ¼XPnr<½þ,óëo¤WÚJ,»Ö�©$@h+ƒy¥fJát1]uM OggS@Ùô M†L9Êÿÿÿšÿÿÿ±ÿÿÿÅÿÿÿùÿÿÿý:ÜÂ#Ú¶pþY•}ŸÅZã~1�øßý!÷ˆª�èk_DÑH£Ò“ÚYÃg½˜œÁÍ'�ã¢EœÈ¤@€ BKTG­Î²y`Ë¥†‚Rœï$ÈÈ_)ÏÒ€ j•Z¹vo¡e «Šý¥ŽãRÿàùxlÏ�­[Òïï—ïaXª�ìŠtǘ`zÏÑ” ´ð\6Ôü�Býò~ à€Ü@;þh }j7°ÕD³øTjù…W�d�ytW¼Œö_û>VD)ª¬lqîÌgiý«v‹~VçpÐ* À€¬Z8W§è¸Hué‚éfWêÛ³¾°ÆRC"sËQ¯yà½É< )¡��¯mÚvÉ»”VdnE´·iaf¼ñõ=ìC`ŸÿûÍÞÀü<ǤÛ�ª±h&ž±ÝÍãÙü&5-@æÆãxcº'°X5ø‚ï¡ÖÕóòßKèyñ×ÍAÝøœq ;\^Üe ôWW®SFÉ€ j1ÐvÕ-lù;àèó3˜Ö`}oŽ0üÊg£ÍLž¡’–Lu±ç×z¹r©Ëk Ìë¹qvŠÙ_=ܶ�$»p[ —A!CR‘ßJ0 բ´²ÞÕñ-6•¬1Yxf¸ùJ;Y–‹Éõµ }¼+6ðå;´>y^mˆFaÚUÀ hc�NßÝýýÙXe scäê_5k5ÒgîJ žR'½¯óp?ó~½M° �A/;Ÿgªe97V¥AXh0dyDÅ{3ñ½û£¬›Cðɼ<% Jð’] b³��=üÝOµ‰â Á_Ó3CöÓb�VœÜÙ[·¢nõiØÛaÅÑ0§ã@/ª÷ó| �ˆ“Û-'°îÛ¢üBZ_ö19Þ”—ÒI'�äWÿÜFÁ'óQ\쪥[8Û*rÂáSu�[ŠŠóÖu‹ÕcÇsŽ»ÕV¶Ï,®ŠíÕ˜ÌEÒøõáY{«FI ü—í͘à|î29½ïMZÆ©³ÆLçï6?˜Û{yV¿O=¦ÕÐ99«qûŒÒ´]ÞUZÇqZ­ê´Nˇ°P(Þœ²»(ô�jú‡T?§»i­gCX ²œýöÿ‘õ¾jŸ!;¥i1c!6Ñí|ªß>OTõtëúdsÜæ…^Rû�ó}¬ÿª–/�Kø(þ9¼¡5Z#†4ßjbo'qK®©>bšñ�ß÷ˆª�賺( mÔ“ÕM¥%ŸbÜ€Õ:ô¯ƒú$5¥$ ‘à‰ˆ!ݱ À–êsU€õ#*( F�¿òö¶]“¶Ž×sÕ@+�Ÿ¿§ú…dŽŠJC^g=n#*%4óûøëÖÍkÔZ À¡)dî¤/�|zm°cfúI0À`]*Y¿~¼1‘.ª€öôÙ×ÀW׳¡ks"8�£~_ âW°°u;) °õg5b‰gàF] _LîÄ4&w¨ ÔÅœÈu}~L TDã*�ý>-yªVmÍ1Zt1rñ H1F©’â¼�0 "¨ðÔ–· S^6$F¦à(BÓF~³eÔØˆíɰ.ƒ±Ö�×bnLêm”Æ€õ_~ “=‡QLí8uQIÅþš§÷}à ÔUëù…GÕǪÛ3÷êk7èïÖ§•×X�®p–:ß»Ð÷ùAZÓûEÓòL/šn¿ÛËéô]>�§ä"Žª3˜µkó-{·zοCS;Gjï¬~€#Óók:¹åïcâSwy¨Zô~ƒÃÄu§ÞW›­¿Éﺠ.gŒŠ öÇ"Â}óB·<ŽÒ¬?ÔÄ}Ÿœðý~ã<ã¦u2ÓýAÝ;=Ü\ðî¾^†ÚE¢ÙŒúG)� U)‹ÐЦkmï\PT€C!òX¸Ñ�ÜùDÙírrÐ7[f³”ß{zïóòJ�‡œö½§£áªƒª·F"}Ã[-Úõ”c!Xž'I!Tæf¸Ú{m8 \F<Dà—Ë"áý-ˆÿ&[Z«çr¾kFa*ÇzUÖɘ_nš|—g†:sõ?Ö·9úxŠgv”5¾*j«T*…K¸ÿ‰ÉÆJzϳ¼Whÿë6þj:—/_ΘF#óÍ´c*�ugSJIlʬïy¡XŽ®7”þX¶¦ë§WL.ö'üEÕMÿGÍ—ÍyÇ]ý%ò"Mˆæ­)¦¿)3>jMf+«œÞµ›{ª¡J2®œzë™Öýí׿÷ÇzL¬7:†eŠønÞÍ¥|Ú6¦¬ŒO3¿þïÍ#9so4q™¿ùÆV[ãU“ø=wÉ;ûìº×ÛGp6»GÌzýæ(Öj“‚W™׬·ºà]~ËÚ;²Á@7Ì|6øï¶VÕyºÌ3p°.þÜ‚K¼Žn‹«;Sx�K¢�Zøg¾îGTEÝéz("n6 c¢‹ô w:¶tî�ð_Ç€÷¼‡¤Óÿ8]Dm.híCAƒ*&¶"Û j¾çBƒºm°cÿNÍÑ{ù=@D€í¿ºÿ #d[BÉø¸ÿmˆÃ;ŒÝ˜œœfV{Ùz‚ Ï,<y«ú÷_)İÐÉì3)DÿÏ@ ÐÎòI@ÄppU$8 "‚�+’�ŽxÀ09‚8¹wOÈôœþþ®¤êÔX´££[*öÏP×,^UjËR b‰àl=ª‚ŠŠ"yêÁ”L<(ÎnÕÏŠ¸bøbaLQ`­æÆ R3ú:´,±�¹ºÉì‰eP: «¡F�!F˜K|ºôWiGÁAr&e¶¿ŸÑ×Âm¯RÛ:õ6í:ù"—ñàßð-ò€å§¾ÙÁá6.Î7K#€‚¾³¬­‹õß$e–®û5z£?ÓÞµ;°„=Ú.>ò’†_0Ó‰h>â<#€øÆÅ0ã§Ýÿ,ÅpãF I¹gÊöåu¢Š �þr³QÎÎI\£y7 Çýþ5°}¸÷ át‰“epŠëeu#寉—Ð]‰sÌS0�¯¾ó®Ÿ‘KêJvºã¹0¨Fµ¼-ô]¿¸Ôò5²Í¢÷ò×u¿ãú§-mœj™xPP¬m \½¼«Þ)¢â–“â½NšŠÃEX@1Š"ˆE΂�Ê¢?²s#rˆª£Vðϰý�Ò0,öÆè4îÚíú‰§6äÐÅqg?ÔU��úækàíV C¤ÿ3÷–ÏÏ+Ø4ûZ炃÷÷rÀ‹ð �þTx^�Þçû"ÿ ÿNû½æ …<6 "ñ0›ãtrPî¹Ö:U]ô¡Á!*ž…mSuÚý&¿\Úr^åè{µÈœ#>–n€µ±¤s´ÏÆnõLï;u¶œñôãüa¦ü'íCv¥˜n#?“NyÖS=7»—UåîmS"¸Y€Í˜"íßDzÅ©y}5Û›UÌ|bgmä£ÈÛȽ.ÓS_¬¾ç>Œ]žT™w»ö/oâCSÕ‡Äc QÁtIvG_Ä‘TRMe³¦ûüÊg1½ó´ù Uú1»Ÿ’’BJt�G‘*‚tYïÑ&Û 6Ç�ïvH`yL�îÁ(Üýúáú=ÊÅ­êwž†YèåÇiŒ¡º&_Æ^N®ìç*^.�•âl*ž <À=¢FLl‰2.ƒ»zMó‹axƒûSEÕÿ'f¥F8R½}„d;6Û¸¨'Z�§—Ž]€ÖP¶Š@3�à‚Q¥ô` ½GØ%á$í>k‘1Afo§Oq•“vëߨPµü…ni©ªÄÙ-zûªXqÉ',ÀS£B>‘“­7û[Ýôîøë˪ìE@×Í—Ÿ² €p²Æ1ëÎQ�íª2á`å¼>gº¨½J®ä•™‹Q\½_ãî{Õ8÷ÉŠ�(ÜÃss—PcI-^•–ÖŽ"ªŠfByÕ:h"Öâ,Ï/Ïç—mfÐ÷Óð?ŽÊ\õ‘ñ!‚„�‡§u ‰ˆ§g‡ÄÁŒ—¢.pNM…‘cH²%“9.á={L¦�·+ꆚ–+MË2­vjèf:@›@RÖ�zrU„é^ÔN½ÔûÓʤ~FÛ̘OžÜšóû€æË�À­M7iP[äS-ìfËŸ^3ûpããûå¯wT�aw2Ç�ËMòtðë–“#¢J.̲þÏ kîm�S{s¿v‹VìÞ:ODÿ]ƒ3Å—L[üÊn§'¶všÐÁ븴Gâå3¬aTP.’ÒÝÝ‘@3ñ¸,·i–b¸ d>ÀܹG5̦õVnúª×\º^þúÚÖâºôÿÔyx;¨¥2÷%Ñ7åÎáöü:=IJÞ=Ç“¸Ïöã¼�päÔ½ $Úô9'ôUáW_ŸÄWãN‡Cÿúû¼yedûTg›ÑäKR®Be—Üùô‹³:Í´4¦*Ór,'ÕÝæÖðîH•2”•†i=©ª½®b&RMظÅÕ\È–lMfÇñ캷 À‚Ç8I"�HâC”×sò|÷·3Õn»T~Ìàbmü<þ}÷-fï#Qc%®Çzí‹sm¥zȇ“Aˆ¼w™äãáRþ�¿„¤ÉR01Åh”b‰ñ'""‚ØiZ% ÛÚÞœi' P |»¼.ÇYt½žÞþGvñçb#pWײ“ÉÍû镬bÎ7Þù;ÉG"FÂ0ÊXdŽdwò‘ˆÓ°�GT#A¯ïâ��«T7«Ä¬ùqã÷iBïhû몷Ù"éèI�¶˜Wûéà°ûèª]PwTZ‰ ³lUûÑ?þ{5™Pg+=útO×D_Ÿúw€)11º›Ú¿¨�²ŽÍh+W¢réÕÚ#Þom¿gJ�Jrèˆm¿‡B”QC^µÖ@æ€Dµ¼UĬY�p>"®Ä©„C¢� LXÎ8n±¸cô4ýµósß“ß�H¼Wí`†ZµÃçà�(°5ÇH<$¶¢—ñ l`)�y“ñÓæÞÒ ñ�zc]ZS¾}ùãÁ�bDC`¬·>°Ý2ž‹ç‹îòk‚Iãîת`3ÚÅcLʯMø�—½}.|pvWÍÓ£Dl"ANª ¬ýs�ùh¯HbCo?/v=iXs_�wÕ»l¬ÎVc¬úÆïOíÁö»Ü"0¾·þ½•�?®ºîƒ¸ê�¨ Ì1œRP£çw¡ÞfA9J+ŽV©p*#ÀñÐ_²_�HÈ�,ê‰ùY Ï‘±tûÏîÀtß#—ÑOVk«q+Cêý&ÛC¯Ž®ÑuÜ{ŠG·Öª½y�@RhÖ…÷Óg2qJqL¹Î“„'`®'ÇŒ¡ÆèÍÒ‰œO½LO‡…ÛÒí%(Óß6ÓðwV[Mý$ú<[^LãV#𧨄Âïûh‚ë‰ÿ9]‹lKfÒV_EFaoŸ¿Ý!2HÛ!Ü‹[ÛS•ÍМc#%ì‚üíÏ«Õ_:}*Nw üÿñGÝ*v·PïCº”Ë>'ñõ.œ;«»o:++>%ç~¹ÎœQßdÒ:h+)¥JͰ5Ÿ¿-½0UwŽh*?Ï?¶Wî!ÿ;ùðk v™ÔU¨…én±Ä§ȳ½iÙl›PtZœ8ʚϛ×ȱô›Å$\‰�/«³Å9KÖV3ûBó¶ÝÎ�–ª†^RÔúüdº“EɦªOÛùÛ”éÞ†¸ˆv²Ö¥ÎrQÉ7©*õùè�„Éeó¾ø(±ƒ�P6�™sbT4w!ß­ß—ÿb~Ó~÷ˆí»Ù:«ù$²i¶ $Æk” ÛOþ˜ê—êoSDõJF@ÒfUuä\±Då¾&„ebV%êÒºfâõKjÓ¢#µÉŠM#Åš 2¦Y‰;ÙV§¯ÞCŸþ+îÛp`ÈK³hQAªd€OggS@éô M™Q@ÿÿÿÿÿÿÿÿ(ÿÿÿÿ ÿÿÿÿ%Þ黑·¨>$LàÒw*Ï”Ž ­ÈL<âixTžO­¨Hø¨‰·º‡ÁG:W�¹þÓÿ®SD‡“ªuC~ÿò‰-¨Rà­þR?ú¤l¦ýFçBºK¹�F·*�K¶ÝL08Ï•fg¨Mb°>CõûT4ÔVt@²7(‡Ö½füû4�ϺwŽÁAQ²!i8ìèG-Z¨Ö0¹­7’•‚ûï tu~>²öç[H-¨(* °ytçcòq~ïîÇQ€½âчÔH qœÓ ˜µpjÓn2Ÿ²Ä«ù¸SÌ2µ5oÂpTñ?‰‚j;•:ý¬æ?}æûÌÌó5%º©y@�3ÑF(©p 0´ßÚªZS¯9¸×Œæö{}ÝeC ¶?È P0RK9NW©b:QqX¡º`&Ìd2”† e÷D’x*Z9 `|ëÂÙÞ´[aåQ#GÖš‰ùáø™D©×ëjÈr"¿¸Ø^|kÞ'Üëg©îÉÝÚº4`­'EªQ‡ïÞÂàL¤ûý8½Ú/Úýñ%eˆÆþ6�Lˆ²b‹.± š;Ç"Çå]A°Ìþrà­°+—†Czû.ø x„i½/0øWþÕ¥:ïÒ,Û½Ðw¿Aξ H�áå¤ÛøÙÚüç¡�b=„—ØÚü×ÅÍ^aÛtŽ:”:Zâ½ò3\ìˆ�M~ïÌ“ë$.hí&¹™@)s×{®�ÿX‹ Éä^â;×ï°,Z¥€Övò¤k\áØ³A#±�Ç�ÎeíÅUDMϬƒHj°(F­ž3#ù@ÄvŠ?ÊŠ¨|êŸO+ ÒÕH’P`L·9F„åéÉêÙÍç¿]aûp$ºÜ‰Å´»ï<ªwŠ,€¼ÿ„Ïæ!F¿¤ÓϪgFN{É),qïo#¸8¹�öïÞ?­úmäÀ)RÂ~ï�=.!]$hŇþ/õèë7¢3È:Ùöz =ío §[ˆ­pþu¹$–úm‚‡›÷ K=ì¿VøŒÊ•]FÊ¡’køÍ'Hãy¢oQ‹M}¸o×–Çï­6®ö:O¨ž…ýÒ�|øK½qòè,ž$wÈa%³sU8+×üm;á3½Ù¢pýM¿#û0øâuš‡^âðæ%Üx{•ºÌv�EU–Ž«÷ÆQ‘¥Îf¯ßçLŽŒý£T´FÿÔÇóÙT¢3%©ne {v²÷_hÆu{páìs»ŽnïͰiiUé�ÿñ!5Q�‰+3«,‘¡N|Z©ñdr~m7�”ÏÓ~1yT�:¯Ë*MN‹=íN›e¿9äÞùh˜öi¿M f§ è�L×€úº{ým®¹7mã>¸½×^mãåàaŸ,Ä$ÍE‡&æ:dßÉ+q ¾ùÛ‰w¢…™pé»{¤ÿP¨›ÇƒžT~î{"ŠŽ©…Ø/.MTëÆ Èîoÿé®g@µ_Qo!Ü{:¡«á¡ý=,ˆu!Ùæ¹QE<0R6¾„»þñõf˦²K¢ÅõÏjÖÀê;žþDÊ;†à0¯7f#婼R= ˜œ·dR4¿¹w| `àùfª~öÆŒHÀykq ¢ø?ÏA@Ä>³‡ 1„>ë°s먨ÓP+p°U�AˆýË]»"}àš]˜#'™àÍXqýÀÀ³u_kÏ£?Q¸jJ÷YŽ6ö~g[Iv¹±W¾m¶û«_©çd³Øæ_–�¡[ü Kaô;c[ÂÏ�|�ùDªjGgª¸áuá~έ¥|À¶�}˜öâ¡´û/#—¶‰çöÞ¶•ôDWª{€º.[ôr…(í�•TÑdõ¨Ëª:!»U¯ŠÆâçEþo�è*.¡ûÊ3»ì<×.XDèxOO\-ŸW‰Nk!�bc“cSwàÌÞÖ:×[|>Ì`Ëãe0-Å3_9ð�òÞ êñÁœ¯$\ÃRîž‘VLC2›õ®ØÖÕ…}Œ¦åÏËA«}¼Õ)µëvaól®Ã’x^™ý:htc97�f}çݲƒW˜Û'×�æÛî�Çý a^‘¼Î/%SÄõ4dáEëŸ?±­,M£—¿>’ò€—{ˆ‚¦ÜNÄÇÒÝ›MÕ:„3½âÄ"ö,Uàb8ç ­¿¦ùÓ®RS± �³™³â‘{­zÑíéÐÐf?ÒYrùYé›$ÕGF2.�yì£W7iz*<—cO iVÛ¦SæJIùb-"+ÜÑíÇpW2t�Úæ2–×k‰©ç‚| G\ˆ\÷Ó0Úò.7m²È“§y¦ÊT=÷\áÒô¿W^éËΞ†ªà_�k>DÏ�þ˜j íÃÍ6ˇîÜÑúüw5yÓ|äyÿ •,TŒ…i+ø~ \ÈÏT AÐ*x'u³rIÌCêXÿ‡“ð ¸þk'"¦çј¦ÀéiW�áßÿtÌJ0Ä<]|äôG¶€Þd´�Œ›Ò†Oµž�õMã‚ê´l€›­ƒÔ?I€­ŠÖŒTÃצT•ÀŽÖ~Eº¶E¡WI Ð>D”1)µ­o©_;¹…T@””v˜ˆZˆú¯ëÁÝhU€ª(„ÎÔ¢ÀÏ߬aS|mj+ /Ô©¾¿¦Vœ]ù·ÿ| ª( ¢�³3¡†RXÄ@Uí§?|˜²ZLºÏﯜbz*Bog€eÑðY–nYDŸt!ú˜©håAD€z€@ÑûLƒ‚ôk‡öð¯ëéÜD–òˆBO+×�µÛ­š+dMÀcoŸ3¡"YLª­[#ó=Ö«¿M…ДjÓ§1t�ÛÄ=ÏAkúuY$ÔqÓ�?è¶$ù³¾Sj}w>IݵwG@E„`‡ò«ˆLö]þïe«1}zEÄôÑf§D½tÅì¶vU­ì„Ê1˜HMÏ€’9qšöd×ÜV‚•JÌä ›ò‚»ræ+¾ƒ¹d¶ÀÍèärÙ[ †m#ïÛ[]�¢ÂT÷N¾n? †‡¯Ý?)ˆÓé"Iä&¶5a&Úrœ�„|Ýð‘žQyaS÷…P®˜,œ®†=| {ô$íÀtšé1·š__"õL‚~Õê!ŠàlãèQÇe˧7ÏZÚ½ãºãÍ95<>Qíi­ ÌRÜ ik˜ÜËŒ{ �Pij�OëÌ¿ô4%÷˜ñôì,›ŸV rª�Ôü¬É/{­,Úl,§™?��yµÌ5æ5öœrMô‡#²Œ´ÿu †&æ”,R%ÌÃÅ~•fëîGþ=&=0ÙËë"$ {z]g´¡¬y÷Ï@«¹Ó_¿¸N½7åóŽÍÏ�ñÞŒñþ j`üÿ¡p)OBÁofI÷ fa²¾°¼�‹£Ê­‘|ÜzèD ™š�þtSŸ1I3=²äW¡€ç®à¼þ__Ô%ðõæ"þÛý{Äì^g™Z ¶÷ÞÕ'k‘Y�š–Ñl{ïxNØÌñóó+2rR. \ÔW*. •½]â5¢Ñ›+)2Äúƒ.kZÔ¸Áˆz¤Œ±Þ@ûoÙê¦Èù_´ö-Õ”*ܳªÏÍ€|ØOÊ`Û‘÷Ä«R¥Ä>€øPÖ<²™  rjV$@��ÛcÀk�+a–ï{™ÄRû¡ñ(Ò(¡©—kÐzùTïcg_?ÎM§(ØÝZBš§[mì9þ�x" "` Þ»žè@ü¼{jÈͺ;€Â˜ç¼§ÒEÍTçRTU"pÎ<  0ò÷ÐìùÛÌ8€z¾¾P[UÄ©:ŸÏ™ÇóxçÄQò™£r½:ïˆ?C�™WÕýøô!�u¹}þKkWwmThÍpÂ�l÷<�¾ú¡«˜„9LxåêÆ„æÒÚig¡î�ºC«$D45ëžÆižò;1'E±}�ßãÁ;'H‹tÌÉa¶íCÝ6<(c=y.0°U)†Q° �èóu[bSUÉÜ¡ê!4̉ìãñxZ‡ƒyK!»`h"’!qz�â¬çÀ‡ç4î)j‹wº/ÃŅÞòçÙ¾¶Ø·¿Ì2‡TÜ1îÖOÿ�ÿt›A«³^¤Ûåæ˜Bâ¾3tïúc¸Üx¾”÷T„‰êéîyX1.R³dÛño¸„‡‰šR1ê/îm÷øc{cׯ%½{M»¿Ä†â“äc®;mþi,>=Kþ¦ãªNßÖî &Ý;…ù¿j�ÿ‘géOqqîØïÜâˆv-(><�¥j[{äÇ&ÕƒIªJQµ5¹òõôòD1­,Nr YkòlAÕñÿ yUGb’•}¡ÿÎ�í蕞“åÞ#G)wµÊ­€/'Í!¯g[é™ÒÝv×úê{Öcr}zyžä-ÿf¿j,ôöËÛ{W×ÎÄŠ¤nò Ù†!»öÞ62™£ù×üt¸ß:|V%‘šoˆÿ¹Â(¿é Ô!e>¢~:ù:PqÐ(÷ÆQÀÎË“­‰s¶t<ÏÏUµ£á*ºŒÜ äÎsÂO¸Ç¼_pb¿÷Ô»]äñ3skå|œ×eÓVæ¼^WµHŒþŸ÷œ+÷;"(ïh€V¬¼¹·•ôio”ió»÷ú›µûN… Øs$ˆ¸ê�å‹ûŽãÕíÏ_¥'�ëšÞÞ‹¯,"µÅOøÅÞi6buêw‚VÜý"IÛ¡¬+4ï©øÈ¦¬•m×e¹ý* ÓÓ…°ÊuÊåGLH±YcžQ›´~:#&8øSÆùPgÜæ±FÇù&+MyžÄûä MI—u2[°�Žü±/%@öwâœß9¹IÔe燷�%Tæ <86‘»1m9¤í�çñe毡ºŽ“�í¹pÑmùêðµ\v3©5¾Šµ ™ÌOggS@ùô M‹Ç%ÿÿÿÿ+ÿÿÿÿ.ÿÿÿÿ0ÿÿÿÿœ> \¬w*.šÔPé;¸[Â? `åA‘téÕñ¼t™¤úv麸—wõÎ_¼½fиô ³h­ð¿�/¹U†¡ •�ÊÝ1ZYD y’Etö µ^2“¦(@�Ç@ßh>Ú‚«¨l/ …‘ (éÛ¸Õý(9RŸ4«�ŠVÙ‚nOMu¨õèW’1ÁEë,Ò¹O‹Ó˜N!¬¯�®ÏoϷ䳋N)ØžHˆ€#‹*ùz?ƈ¨PI”È ¦Ã¬Ë¿gƒcŸC�C¨�@¢vxN?¨ó¾R�JÎ0ù‡ª¢9½ís…Q«©‹áp˜Ú¥ü!‘È««ÓΑšN‹vjW‡<—-¯9¼h†F—].R»AD¤‰­€å ßw[dE8¥l!¥0uËw5¹dUñšýb¶(Š k¡¥§q~ñªªhE¢:¤Lðª@î•ÊÄÚºÒœBÝK¯ÖÛˆ¢c®Ñô^@3@4HÕ+†iSÆ’ó™~NTTRu):Åu…ü=G ‚8>•×�dJN Ž¡HÔÛýå\´«°î q}[øx šŸ ¥Ó„©Š�‡á¹ã¶Iñ³áFø!ûÀÒ¬;!é—· o«`û[ZÄ¥›G nËÒç˜�ãÓÁ¾%Ó2¢65ê¶NjÏ^aþÿ­D=aûœ»ô.02U~åU¬¸qºK�¤D¶#4«Ë Û_�™­\5k<\?�¾g±±M•*•ÙMÓM µGñ—/µâ�ðô*Ž÷µ-êšn1j÷ÿHQæÏúÖ= ÿΑ Ùôz‚ðpôGÎ1W½ó 9´}ÜEâ}szÝí¨©ëmL¦»ïRÑÉI 7œÃuM!c,ˆïü—°ºWiÜDц9œ½æ–î)OÃF¼ž:‡ Å”ÕRf–”QP�òÐvèÁ5›Åëƒí�î u{'\‰ÈPæ¸7£�qX‚ C†ôñÀŸÑë{öJòGr ,©2íYLÝð÷ÓNW(¶-“·�ëÕ`û[|<¨Hÿ ÿéÜž/}Üðõ×>Àkù‹1¿7´%’×Uò•÷K!ãmZÄóE§ç¿Â„»ðÅœ–ÍÛã>ÿ­êãCì…2b¢§nÕ¤�Í/áþrn¯™Æ6íoYÉeïÀwÞxüx”Ž$™ÇLÏF{Oá{Û­›\øÆrK^vøæú·ì¹˜(¿_yž¿®vno¿¸sƺLÍ:Á‰�÷¿^âÅW¤…øžšZj¯Y•ì(S¢ŸÚ’’åîß_­ÄÊ_…?²Áë×dÀ÷ÕÓµ}ñöDý¨ î¤A�Š'5Ý2-¶¿e Þ¬ÊWD»ØŠ`ÁÙÛ‰g,ƒ¸!…‚ø6Ü]Òu¿ØX‘O­0¥Ÿ/ôI6ÖþeÏ-ç4·~�˧"WûwÅáÌà£T�pP¤Ë‹Tjñ':Î�2D,9ß7¿)ã‰vEú�‘%£}ún·Ú(µ«€¢Î¦¡RPô’_ô««°þŽè]¼ÍZ©UÈ¢i”'*´ Ú;ÐSUTE(¼ÝÝ'/4žG6ÀöÙå»ç¾TòêNÃ4 «šzƒY»Š›šZ�ŠH4Ù­´ìOÝwçÿõ¹"ÂÝ�ÿŽã�1XT1ƒÉ>[óÈ–i©„ß\VÎ~,Ö3o>k¬Šªô !Š4�Y0�ŒgÇòK£ˆZŽŠ9£dý÷ÄY°¬(Ü�‘Ï5Õi%O �XtЦ×ú4S¡‹Ú÷:Ã}Ãû·äß6~ÛŒ ?"`<ÅÌëÑ,’ÂD"ÚÓ †*EÔ}s»K*\J8lúÞJÖx“趨«¾êyX¾ÄUHØÁêcöñw=ªÕ¬Ì|Öú{o*þÚ°Ý× MŸä£@÷ndA5'ACñS�Éô}¡½v-†#wš>"»=oï³-K›=*b(1üâ=šÓjyZ²¨ãÑŸë%?y,xS•Pðìm"¾¬‹ã6›Àò¶…j…ÓÜ6§ß›_œêÉÃzïÿz �º =ïLG‚/Pãºþ{)n�=¤hüΧ¸Œü‚sßrÎŒpT´>ô…¤cv‡w2{¥§J˜Ki0Ók‘[“5ñÐdO>V™ó‹Û>«î eMôØ/>£5jM« �`n,r�u0aS¦sÙ¹ -»£Q­Ã ›SÎñæ�=ãÇ´;%kshKŒôZ鲆DÄʆƑ›‘H£ÒV­L=¨^ð5¶'÷ýFM2í5“Îâ‰'ÉàTí|gUß·Ç圚ãÌtÙ¸xÉ ¾¬¨ûfVŠ Ë»O¯°áa?÷Dò¹òíÃù¯8ÿöÍÉóø'³Ç%Çœ,(™± ª§ZŠð‚Û½˜²Q¯Õù‰·Xç�õ�ÉÊOÀòpÏ÷'�b¸Òá]ñÑY9…MG|x·ÃL—Žõº™f&¬¼/S)Э¥èÄu¿]ÎÏL½IIrûÓ¥œWRûÌ÷îxÚXæ æÃ¿6/6Üäß±Fç¼W¥©òl’®^ѽì>¢Ó¨êêê^–l¸³ª=kã¿ÿÓÁÕ¨‡õéØ#þä`; ~.·oßĆ¢‹ÖYŸf´Ÿ'À꽊+Ýd�Hw�êþKº°Ž­wI\ÜÁ‰J"´F¯f�ŽÎŸ¬;ïëp¯ü¬¤íù•ŠƒÇµôƤšðþw1`àÌÛËÌ[Æœ^ù[ˆw„_4ç!˜ôÍÊ;phTàAEp‘¿~µ‚ú6BØeºšˆô>þr ,Û÷ ÒS¸Âøø«Øâhå ^AŠ×Z¢ãUEÈTÔ¡ýÝ燧 ò«¡šŸ>�ÝbÄÓMLKÈ$tçùÖü¨{Ä/•�çæ¯¶FDD½ЫHê”s~uŽkT@J¨f!""©Ý—™¿ßšBZÁó Ä’nˆéÄøGn(’R/¢Q =Å<¿õÞG¸ýŠÂÌÌcLþs½dÚ�DrDÍEÓ,óˆYÞ‹éó˜G;ÊœÝå«÷ÇÖÇŸ;­ˆ��£Å׎ˆ¸O.í•(IŠ‚:«#å#æ5�ˆ@§jŽ�’µk«“R•ܜك™¾—<¥v-Ši\„ â E`ô®‹y}%'»å Ù7M3-Š`õu½šññqx¥­’ÖzIÕ˜‚yæ¯êâññù‘@Ç$H||,%�-2@˜¨›� ¸fÛ‚fÆÒ)ô\»Èëì¦õh(‡ÎéÕ\Y0t{{ÄsóüàF‡owDêú@Öcæ('ÖsÔ-œ[]Âã×'ù¼(ŒÔ‡Ú ÷àZœ¿ÖS‚¦Æy’”©¶WY§*¹m¶©2sæs…5šþõ]<å–}çĪò6ãhnñ¾À¤«œ¶þâF8ÑùY2¢ñmùZhr©z¸CI.þÿýb?¶ˆýf‚A¿‰¸¿j@àqÉ̇òµÌV„Dn^Ë_ì” z£‹üÜNï1¿'íüû¿ëà½ÑÄDïw ¡ëLUмàpºÚ¸ÞŽd2üÔÉ}Uo¼ÙŽs\�4POŠÊÄ(ºxWáRÞ>½q�Œ™¬ ›e®o5é!šÚÅDhþó¿B§:Rº¿Ê„i´7 ÿ8Èèr�õU¿+>ëÏ ‚Í i–ÚñRkψÃÌ`×cÌj®„¯�n_ÆUvž²>ö@òû““Ïü¡ÓÊ+¿ö_°gY;úcvY›Zyüœá}¯©•šzôã2K‚ ¥¡²ì‡¿�õž· ø)¤•¨pè>¿�ºRÅ<ßÓo.Û�áRTŽ È„[ SPº'©%Y ˆHU2½L4^ûLL7”6ž•TiGçÄÿºá¢!lAjÈö:€ùÚùõÉsû'fŒÖEaiO]¡²^>æëreò'J9u'BƼÞÊ�±ÕJõ­>££²”Ë�û“<ÞõÂÅN"ÒŽY“ùœdý/c\r”m®õ艦• ¦§,ZdP±¿ö¡þü²bxýï«Ý€iyVnán]ðßArû˜\"ü¹xéÓ`TìGkÊÁO¿8d8U01¶ÝŠ+{Uéwmä<Œ·îÇÖªì"Ž\Ïhäݰš¨6»�;ž9þ”êq•ïAnÇÈ36¬Ê=ø6 Ï×Ãm¤yòæàóÀ]€[óav»þÛ‘/o…y¸�-�eGßs5ú&ï¸pþóþ^trî}ëûæ÷€rÕúÓ»ôË­}p¯SÛñìÕu»^›Ï¨"›zoºž=q )E J(Öô¿€D4GÔ˜:\�¯Î‡«nÄl®Zû„!4I¶u(¯+³ç{+S[ud (šU)²²<ÒÄ-‘8O©š¦"*hYU+zÙ�©¡Ï¿ v«Õ TPÿhReÉ*‘¢¨ à8ÑYUjvNìC�ììw§„ª‚•Ð ]ú#Mã‰; Èêu(±ŠˆZ•RÎæDA@‘>êïÄœ>ÒL3}·œ3c;#óüBg»%HF�ª¶Z­´Æýù89Z)‘<ûåPË~iû~ìŽM4�&…Â稙k¯6Ô˜”É€¸?‚Â0\f1�§ÇlÁÁæ"BúôÑE�Ö1(.P†�Aßög§ddcsR0·-ó nxuWžÔ¤Ç·Øÿ¢\m{Cäã|j�¡eŽOžþü¾QÙ=ó|5I¯+Ü‘àôƒÃ0 ?_úè~6ÌûoÇ»U«�DD âæ£ƒ5oH¨ ^ÔñS>®/ �"·^ESFºQ&Pº»%†)0ßëR?øûE9¹Ì8ÍÌ£y30–=ßÚ½æ¹Òiø›ßÐÛ»€ãÃ[X¥Ûx<Ïký·,Nw›Î‹/ž–{U®Ä(ÞQÁ[”X°Ë•y˜½™§wL;ëçM­TýÞJ îˆLRÉŽW˜"%¯jÎÉ&|ƒ›,CÕ”Qª<÷˜.k�^ÊÆ{k}³‚ø•£fi8�Ôi‹ûoíÛ£›æ/?݀Љ¬ú­žÌì1Ýà¹ó°•�F¨Hèf§�M™ëDуó^~¾�N¥?dîè1‘rÊü܃£4•Ê…r$õ4tãÉp¿,�Š;%6ɲ W´©‰L¤¹øVwêß`pÈ)ö†S¶ÛÃ= ðaEú¿ |œUεÉÐ}™RÅóÝê™û¸²,VÊ9Nç9[CŠ�ÓÞž9eÏ~ƒq“îôÚ�OS$ËXžR©ËŠ †M@0/‹Óóê»þmO¿(ëÅã�ñé�y2C¹ËÐÿá6õUl˲©úÐj©ç¡ž–Éwà0};€ýåp2gÇ„û¿&Ëx6MØOggSô M Çn\§«¬­°¼¿¸©§¬©¦ª¸¯²¶°°¶´³È„ÍÜñ¯“~} äoììã…BV�ñíé—‹ŽOÕT?»¬µê’Rî×û·9d³Õ»k»Ww¶•®@*ç’Ycþ½ìß-hÓcèSëùdX?á 9+ ¬?›#4Ù*‘¬"¬Êiþ­¨«b@Þà&Æ<îµX}xjµâ®¥mð¨q¨žâ5NqÏrÜo~pè·yPÍéç+¹ë{ÞÏ6ÿ†ÄNéîߞ阔¹�SŒí·ìÁÏ¿œ–Õ¦0ÜÁ'©%ÛóÈþçnûãó‘k³ÔÿrÎ×÷ê�?<})—ù ÷¸L³,³/§0L¥4»ŸŠÛ+Eëù«ýˆrOñ%–“˜DJ�Ìg‘”âL©ûW"Gdúù¤CóK—„R·œž®,#¯ =x—��Q¡ò‚O óöúðçv”3¾_Èáþ�!Uçþ ñ>*æ˜W<ò×Ë×$æ�R ŒLùP5^dÜ4òø³Dñq¬úùó=þ}4ŽW#Eõ¾òV²ò=FôßÏîË[ªëóªqJ,nê+ò¸­T¨k¸!sØÏ³ÆèžœåðŽYM˜¼Â­5¨ ÀÛŲ޷kêÔçžÈØ`Àß’Ù”5M‹^ïtõî§V$W[kôØ/k5‹¿¹ðàU£¬+½ü=)l£¨s¹ ¨ø3ä…9 ê h3è5¶zKý±ÚŽØlí'à7,3/7wñ ¨Éó²Ç—âù¾÷ô)GΞ†¯ƒ¯¯ª7ÏèM»î…ÇUâís W÷èÝ”óõ~hEíÓˆxùW—u]²‰6«'ñgˆœZçó¹â!`êÏ|ÏEwC ã¿7k’…H�Kó[t-k,±¨¹àM‡³£î é|3ø7n6ìåoLt¼>£ýÔyé‰q;/³ƒ7Ï‚¸œ`óOy¼x»èª·3e<Á/ҳɯ„kgÝ;¨§LÜU;@¹nîûÁ·Þ=|…RJ]?Oe/sÇê_Æ¢]ÎÎ×곑"Ñ~?ò¹ZŸÑ/† Y¨# UÑe?cÇÿîC¿s�˜;ñòØ#^ÿ:.&¥ªZ‘˼ÍêrÌ`®)DŠF'‘zùóI]¨oê~?vš|Øã`]ä:Ìuõ¸í/ïýv¾ýêò T Í)ׯZÊÔ&ÿ²è^À»ÑB½i¼}ýµîMÏ·Z¼+gýü¶ÿaÐ{÷9Ê_,7´·_Þöå�?çu>‚‹Tª�{^Í—4ôþi³oÿß,5šÝLš¥¯zlI\ƒƒ”S_péÝ#œ]Ü2¸öÍõe·G:î°,·}k$F:˜óµÝ˜Ï¥ÜyGÉóÙÿ×ùö7©ŸÛg5þŽàW©É¹tÁ9¬Ëtú5SÝô3À ÿ4Çz”ë Ì}Iãp›Ãz(ˆ«=ôu·çqÑ��Çwç_KsÄøÃ¯~¬1V¼»n^zâõã‹ÐûÝM|={²Oï÷%ÅìJ”r×ûfÙLöƒŠ,ý²¦ì“)ZÆö¤ñ[¯ºÜ2tè«&Ààro�íyã[•.1Ð}x~O«ÂgxB묣·½Çî[St&-[iôÝnÕ‘c×ô%¥«Ë•ûþP^Vʪʡ(õ~Ò z}3�9 tæcµ…”�¾Ñ5?7Ç¥¨«ûn,åÞˆ¿0›qŸévÅ­ [K¾ÕàUU9K)½«D­T­nÙÏÆa¨Gñeê"u±ñu-ï6õ=oj¿J›Ç| Í�¬ºIý²›E·jÕ|ùœj·Ï#þñýì|ðW-͇¼>ÚþëF1oúí^TÍ!~üú>'V³W¦í‚»l£¨yvGVÊ�(–@DฬbÊ @A©@ÉKÅ7¯‚ O¿Kaà’žÎý‡™Ä­§R ç×aÏï”è�Œ<{¬u9ø»S9ÃâÖ>õLÖsÛ,$DÁ+]S÷¸8Œ‹œòdÕ>ÛùçÛüú&QdòÔc!éq~"£6/•ò"ÁÓ—S¶`Jçóñ¸aGÎýŸWÑËÊZkþº�j‰SCe×jì'�Õ,’i†bϨ-ºX˸&…éDŸç[g nó]7GÒHòµ«ñÞ^¥ABh‡¥½tåBô`£%(¹¸ów½æW—ô}ݨ÷y<õ½eõ&ÏF/ÿÀb³ë±{)øÜ9=«åtäné>?üÛYwÑa3åQ}ÑlþÔÈ”U ¬/�fÏÂK$GM·lë–ëzçûTϰ—ø¯Iûðx òŸ»¢&<ŠÎõ”�éDP‘BCf±ÖRÖAÕP‹Û£œÝò¹bJì�O÷½†=çAõÜ‘ÿµZ½ëŸŒChÏ“ö…òóü|©=Ÿfbý—ð€pÛº@©½^°Ëœ%Ò&VKº7ÚZ�*.yW�„d•N¯bÌ¥¹¿¥yu}Ví5–ß­©, ÑcL2þôõb“(Ÿ™š¯êj³?~œÿ;ân°>®K3êcü£y2Éj:Î/]µïPÿÖe� 界cxÔnÐC Çz+VÓ@2C즪a·8íªÕ}Ök7Ī9 š¯ºø+G׈*H•Äßoƒ¤r¸Oþosgw�ç']‰@Ôé!úÛhYµàñêHâŽiX²W¤%Vì° kò‚c‹Π„R6”ÓPrþéj3³¨ž€iµxP1Ú6Jñ©×ÇÎ¥ºÃ†ònW7½§Hn=ÝÿYŒU7¥5ë—òe¬iÎSh4 ÂZƒaµª«›˜>£uhrßy{5Qd—MJƒcI­]‰CðÄa{x´™ ¹õà›D?/ò E[«j½—È ²ã3íVráx¿gJ—î°pÊDœ²˜R‘<Ÿaxšæú›N�Ïó¸/tÓ âzDW"ÜáQ®vÄ‘3ð8µÑkø‡ÿ´û|×1`ãlùŒ­?Ø‘oœõ¶Z¯nÜüryXŸ¿Z¤¢¾¶ªrtV­‹ÅŠÕQM±›‹.)ë­YÏnšåÅj”0°w¾¹Ô¤œNmO\¡™ç­ø¡òûÙIã£|Fç¾T¦ñÓç·Ô{¡ãK 0ÇV|YsÁaÜé8�CuYê*mo=ÓOã\¾tó·M%â:ʧg÷k·âºÉº}<ÆøD¤…£0¼†�¤êt„lÚìヱûþùÏÆôÔzzšÕwyüs!ûûyžÅUaØ6MÁ™¦UË)/E:´Âf1­vÓ"8:51 ´š""NTMúÙ_}Ô95e<>ǯÇ`«o˜ÿE‡ûí…ïí è~·‹¼öºGÏ{Ýic�ϯÚ>³ŽŒØ®à ‚…‰ŠÁв0òˆœ¡/ÎsÈ9ÿ€ik'ëmÕœ’d•<TúÂ2΂s„ÛÜËÍ© º`6[,¾îh¼;Û¿Öê·Ãžÿ$bµZÎ×O7-×�œMc¥%Vk=ïY‹£MİÚÊfØÓ¢V±;X-ª¦QVAlQ»8¤xæ³ÆIi±>•ô=V87á=ÂÓöCÄÊÎ>‹]fOòª:tªŠ­M<åEÔ4Õk®'€Àçæ§¤Ô•æC7/d÷»ø¥˜å'=Žü\øHE‰ŠO¢<7:jö*ÌŸ8¥7ÏgP‚IåŽGË= -E4!n;*jŒà3´ÿ4ÀøÆW-ðÓZ)nÉö×c•¦ |æúTeá.:‡éd³zí¡¿N?+×ÅÿYSüµ©ù‘Óüì_7ÎW>3Óîrç÷a�}3Mý8ÇY|n_:Y�\‡yÓŠ<^¿•|ã^óë´íMùxSö`a˜µZXg/k[«À�¼O¥yöUpsn”þ´€1¨wÜÆ­Ú½7…�v§r¶|È�OV•¶I¼F�š…ÄÖü1yù{Àeší{ x½þ”xÖµýúº³ÿΠ“ŸÇÏï�\YO$öð¦Q-Üvs7\®À߰ޏõ÷§ýåû¸ŸÎ#òûnþÓî‘»â cïã±ñËÚ\‹¸Ë3’|m¸ÔãzÕšþÑÏבj®.ôu’�Õó難7žy˜þHê…<þkiÞZšK%úm!Ÿ}Óóž«VuP)•ðkž‡1åëµ/ºBã¾î¾¹¾­kÿ¯¡WÊZ�¹�ÝÎðƒÅMaLDxªéóH˜ÔRâi³?œÖûèfL:­ÝLíÂ0Q/Êi+®³¨ÐN½f;€;Œ{ ,ˆO5Bâ-µH9¢U×ϼ†¾"gïWPÿÑìÝß~~8ûöã‚�kT{Ôüý©¦Ò(N¤ÔSÑÿây;'¤à*F·(yÂKË}wrî–ƒ>,¹¬[ïêþ¾ØúÛI¾S_¦JŠuÙ5à×ÑVÕ¸${É·Ü~º·Lî\´Çú�“~ÈC¸’�X¢`ä}·˜_î›ù×ÈÇ=ÿøû÷GiƒÏ+ø¿ß–[ÿcöz–w_--Ï5NŸÏÎq«#kÿxŒM×ý3_%Óy¿„ fæ}éöŸ à gy[1óž¶ó£±Üµ »1Œßƒ�×Ð*…ÌÛrÃ}0+ÓlÝüçÏã9þC­¾D½×·Í/â¸]þŒ¤¿�}ÔþúÏy—‡ÓŸÜË9ë'tŸz–ÃVkƒö¯›ÄžöGøÑg—¯:�–å×5»4»n=>–|jæþ7|UPo»/…;þy×}…ø,ç+Ÿ¿»Ù�Pôž¹]nYåôcN·ÿ¢}w}_©‡¬>Ï #»31“ç›ÒLÅ›ßnRæ‚%{‹¨kÍûWZ]ûÏü;¾úæ°zvï5ß�ýWm«ËSDyö¡7ÎÑ+}VÚƒÖ;±š·Ì¥añ†Ó:õßçÊõK€F½·ÏŸÄqÿsÛy¸-¿IÑ‘ÿwht÷eÊÀçòr�õýã˜~Èû!×lTÝjçeûÉ3ë§¢�ú禒2FNiRoªÑÝ“=öÑÄÉÔîUËôA¿ŽI�>*Wnõá¾Ñ,\yÄUÜ})~—©þ½5ܲöÞ$ÿGLôÀ¯iòpª¥žÍï»1�ÛÇa¿ÿ0敯®¡ºSEù¥õMZEÝiô‰\¨äIõT^'}½Ö�ªQ‹å<&Uô ¿$ÃǽôYe§b¢.­AëznŽýê«Ãµo9ŸVŸüíµŸò|Ü~³×’~w{ÊìÍ_Ejöß~æäd¬qÕög…ÛK'uEÚ™jJ™Ç‘"ñõïï(rœ-‰$’Œ[£ø¢—ðK÷|{½ä#Ëó¿ÆÊ[¤×þ…§i[)³©Ý~µ]ß­ñJÏïÚã™–',營JJëÅÆ=dÂwŸ›ãFJ½û¢lô0ì��!¨ZØÞ�?ë·ÞMþžÉÜñ“̼‹U¶%ÅPûÛê¢,´uµëþux÷·Ý·r¥©"‘ìqU#²îÜY%¹jó@}ïßÊÛO¼~æß÷5ÆþòIç§¡1^߇è3«õø¿_j<Þýø�í|¯éçÜÛêÞµc6¾× }|IªaNåus^ÝWV�gw5tå¬tµœÇð@ǵûkr¾½¿ò˜¶x{©Ï§ØsÕ¯»qŽ1®ÑgD£E°¿Û‰ùŒº§O‘”¶R椽�­ãðw�•îøÔOöÏÛ a”6i�oQ]pÍpÏâÌNAm‚.·j®s’Õh…|kæ;XNw·,¥õ Iû§ÈÌ¥!”¹�©Üz€BäÓ¹f¯�ûWåîû—Å�æìöæ¯Êïþ3óï?ɧԭ½Ï¾ôEwóóµ´ø³?k…žÝÔ»þàðnêçt!•³^ÝÿîŸ�'íÁE€�ÑÌßöoyxã79#E§�]ÿ÷ß[Ó¯/7¹_6I *V®\»p·ÖÇÊZݹ´*WüÞ¢ÑNkR¯]gæ&þB•ÂÓžý0{(2Hß §;¡ü·Ù©YÑ >@ÜÖâ&£ü_äÚ@´w·çôL›—´Ç_]jSXΩ êeA/Ä£ŽBš¥_²ß?µ'#ÿï¥:æ9F}=ÝØÏé:þkï{¿xÎ×Öx'†‰5Ýý~»·îøý ú·ß΋–õUdÛIí+Kêœ\Tš«žTp?y604a *¥J; úÿ§Ik}•àþ}w´¿Ú­G©“fšmÌ’O,2‘ÿ!!ÁBKmõPûi�ï½÷Þ‹Ö;ð¹‡yrfÈzÒ>|gû@_ˆç4ß Ü¢ëãÏ8 6¶Û/¸I�Hx0õi¤#]ìfWýSü©dW¤Ð;•ñÒ‡ƒV¥2ÿu”¤l¨êm°Í~ùGuêiY6¨ÏîŸp—Ã<þ[3ôç¯;Ÿ?úIº²Ûÿ•“bùÒ}ôýùóõ¼Å@(�'Ãù÷“fþPÞD3þ§=µ¯Ä÷¤„iWÊž©Z¥úçFÉ�pQQë� Y±ºÝíU<÷nj‡¬ä›—î&€µ¸ôbÃï—œM‡>xrX@_0²æ# ðøA^ïÌbÿÏóaª®ñCÿ®€ª¿,aõ !›?Ç‘‹<ÔÕ(×' û([¿êøÄgÿ—Ýj±ŸûúüïéËkÒØþ“2¨æï7Óe[ï:µÿM^ݵŸúÊOE­tîRk§ÇÂïÛù%æñ|þ„þ7èYiÆÑúÙ¢´.È›o»Ô� Œû�­Z/G§'BÞýn>ÁUNtOå×Ä;wÉùA9ìN+¶Š/noÉ� ³S¶D¹Uû…i ûŸ &Àó¿ûúÓZ� ­} qô%ý…j�yS’ºaßKuÅ­H…‹ýÎjì?ElOœåÍê¿¶°S{Ä'žl×ο‡íþmý¬tÅÿÀÉ-ºÖŒKŸÕë“Úg­gSiܳ™fÐè§Ïû¬­f®¼h_è÷ªbá{ëa s']ú& ÜŒþ¹.r]üYÒkñmVW›ÝwÙ™$a „Ôù`ŠìA”½~"ÖkÛ¯®ÓùåOþy ÑvøßÍÒ:õŸoúZíïôµô¿nËOžýïÕR;?«YW¸¯ëê¾7îûV­Á»žN½¨g<ç¤Òþñsùç�çt@3§ÏJ=)÷W;›%2AÏNgŒÍå|ïs;ž‡¯§[5÷t•ý=ç¿+ÿkãlμߨN‡áðp»+ÄÔS_$¨öϽ�Û¥>‘„a½n–=ð4`¦-ø§üWŒó¼¨“{ž—ýx¾þ³twz=J-µT,a3à<ÿaºâÄTy»¦åAǶ@ÄÛ0¨ù'ï[:}÷_�zÄGüg÷Éi8QîO}sTНç-þ½|Éy<ôévWŠmŸ"o³7¸~þ£†Ÿïç=ЧšÙñoš§'MºœúÔÁ¹)âz<‰ó³iŠ>Œ}>jò2Ѩ¯}uœþ+xÏ+†C!Óm^*�;é5I5wáꙟŠU¯ÿù¯ÕÿöMûýw¾y×÷Ëuð'_—\¥~ô!Ñê9ìÕô§«ì�Œ¥Ëâ¨+ݰ¬ÕNe©=~ä‡2÷Ÿ~ÐiëÝ��¿8pŠ¥FœçR€Ì’ÞþžöÐn`C¿CòΘ=÷ü7Õ>ÿïzÄ»ŸyÜöE®ÔÆßG³7õ ÛW?ðŒ�wŒ°?,w\ÕוwßMKbµ³×„´` G®Ù ½ëÓ´‘Í]¼wÝë±ÚÊòqvœ%ý|º:ë¶·û|zJy< aò@î×ÐWóÍODçqZ.ÔÝv€U׊–ïÒܹ7-_þUÑéí™^OäÏÿí¢ ¸ÿ|Ì÷d7³TÝH¡–Èã®ÍOâñ�û¹ðxôIÞ]ýÈõúQïtÖù§µ¦æãÙÑÐõ/ p_ڵ뭯º_e²^�z~�×ùü¼ÎëZ@Æý×=ž8K²¯I»©°Õ?>Muî)ó|©é–¾ÕgƒÎãí°ã©9ÚÖuýç\΢]šs4ÎÅl¦™&̈Jì!7Wãô—~Û©øp©Þü¨PüI[ j|þ¿ÿït<ÅIÈÏ»ïy_?^–ôy_]]Zx¡¯—õGA”Øq 0bÆÿŒ»³_ȶ€ÜŠ2Äø=r¿ôø¯Ú±€ìàßÏ^¯ÛÊ�[ëó·ö…V1÷Žô%h¤«7×ÁÎÙ2Φ­^)ð·oÜôv5[ ¨âȰ!Ê….z¸p‡ °úà1�³Ä€ÚK½‚"Wþà§{KŠF’K–[Tš ¨%##óÖC2tÊiãÞòÏyjÐõ €©6•a¨ k?$ºBXÞ{þÞ#ï¾÷ÚPù÷YQ¢àûõ»–) /u„€ù[° ”rÎ)•Ó*\vèxŒÈ“£<*àaJ7]õ}~“ôŒWþÑç#Zwƒñðn>¾øÿåÆ~¤ÕË™ãɸ󌋕¢KkEl»ôÓtiöóº§ÖìÑÓ¸uäD ÷³]|É#=û 6¨Sò�Ÿ-uã›\‹_  �î 9þÐG?dÅe|8žg5Í‚ÑoÞOŸá½5ûs»ŸMÊ!©9]ÿ{Ÿf¿Ï¯×•l6«àpçÑ'¹ÍŒî»±w2Z“¶Åv ~ýVÌxà¾ÞxºA22"ZÎ$"�È¡ÆÇ¤ßßÈ�+Ê2ên“CÎ÷ããÒù-6OÅ»ñ÷.‡—‘üu¦zˆ½�Kî´#Û'o™Ü1 "ä›o�kŽ5jÙ~rcÅlK;âp·Ó¿¹ÑFj:º½_*ÕÆ9ÜXq�@‚rUªK@Á,+ò™TÆÐO¦!I@ "*€$J¢$†A#0Ð:£·ý=å( `â—Î>¦ã«>}�j8˜Ø£€‚ùøuIÏmƒ.rsý\Ó¬>ÑåZE¸kVï�Õß#mn‘>‹~{9ÿ÷Õ¿˜Úß<ô·ærëz‰_Ë)M’¿¬êÏçe>‡ÏiÌìÊL\â‘õå´Ï—O»=&¯yþßÿÿCw8ü’pš_E?â¯ü›j—o®ë*¤!‹ã¬ŒËuò»m®/{; æz:ÈùTW/¼pñ,ÂÀÆ�²–ð»š`ΧGÈ(À«”ò{Þøÿî;ð+¯ÿzqg¤òü¾¿®¿ ðލ)³> ÛG®´&Þâd„TÊΤé"-4<l9þxÑ’\GR#Ñù[IÒ¤»Z'¨§-ø³©R ÓJ‹¾°Ú?¿z“a=�´È@ÿHº`[µ©*Šˆ²ñ‘Jd˜™jOäÁi*¹>\¸ZéòT* `:ðléfbj…n˜¶çk=yýÙÙ{MI¤ªýœÏ|ƒšÓ\oY@gË¥vüì]¹H ˜î¿îq„\1�íw„¡ÈãUP�ÂÃ_+Ø€`ºçú­¿Š€@-šx ûùcÙA«P„½· ¡ŽáÄD”@”âš…G�ßù~ûX_´0Ån>Ò�‡Ñlœgw©Àw,pƒ�`±~øa×ìä•il'›;6ú¥züÕM¿†Ma¡IRzqyÖ� E\úÖ�téI-ûÁ“²Ÿ«—Àø!êò Ë¹¾^pxZ�„ï�ìŸ6Ôë~ßÍ”Sæ1§ˆÞ¨¦}³'^{�±UJ½àxû�C5)Š#~¹3Ltµ›�XsîÊo„oqrGw±£¥·†ÖÎ\÷ôÓ¨æ»K[¸EöÕ:CAâ_LŽ6Óûþ­ÈS÷&–~wÇŽ˜úma®õž·fæ:‡ñ*¤¦ãCVGŒ{ä�~ùü½½†Iƒµˆ× à,nÆaI>:6�D`Q&N9Ì=¾×!ˆ ­¯_Ûha£b$¾- ÁXhäø(èÃMQî�‚ �õ'Œ~H#ff5€1…³DÙ›µ  Qêdvà¿iwAÎÜá¿@6#kJ’À‡áJ ¾ýDh€ÝùÜŒæf‡¹Y•s5>·]�¥¹üdõŸóÈW>î_¬\[QQi\™»æ‹W;5ބĆ¼Ìœ ОkûÛvqñºZçQâ#Y ¾Ê’¬Ç蘧u¸º›ýE6ÿv@Y�’«˜©<0£$ýØûeæI½LÅëÀ3-II@8Iü:‹»Þš¶0Þ•ž!îWÄ�¬&ù¾µs4ðýÎ0Üÿ”O™Ô�:~x òQ•B 'sȱÅ)hÎ{nà™ sHA{øðáŸ{ˆ9ý¥e>‹C*ž³öù‘Îb] Y™Ÿ„ÛØ}—ÿ±¥ËÓ£Õ>óCv<~÷†ÕNÚh(Lp¶¼zT¼‚~�sýøM­Óß9æE7½š•«UÞ^faû .lªNÙj[lfQ+ÒÞü¥Íx†ŸÎm›F蘿ÍŽùMèÚIA˜Ø:ÐVÆ0 Gäì2lž ,J@’SáÉÝ—ðœYú;£M=�[Ū*- ¸Äv]�X‰´Á&ŽM I�DIp½�A³éÎ{UZ•';\žôô×$Üí0ìÙ7L�–”Eˆk¥õz¹Î¹è’*ŸÝQ@��09@`ŠðSåxŽÙlE:YÄÈBnÎvõê�wO[Ç}ÇXÏ| έ]+ Æ´Â$v¢�æÅ©KÑp3gµ®Â]^Js2¡�¸³Ñr�¸Àø¾möûF¶¨9ÈÛŸ5?Wïùt"Sx£mÚ ÷Ó¸.Ó9SÙ·4qú°Ñÿ{%óéµéÊ[hú‘4Mµ¬O_ÿÈäóy¬æ|=Œ£±uf$òI¼Ý¯¿Ÿç¡O†Íðë«u^8Uq!²E²’Äû­©Em'¿ÚŸ&)£ÓÈêÉöóssG)¥Àìüï|Õø@teÞÝe”cl¡êã @YÔÈü�·r>—êãñù÷¯ eƒ{²‰ž«¥¤¡·ìc9 Ï娄÷düþæ€ù2`:vpšz&xRlsÛ°M°±>)‰mL�ŠB�*“À‰ì‘ò¦6™[ÁJV"ºy¼§¬Öüøºh »EŽÆÑíáæ‹¬ LuÍcvšýøýgxŠ6ˆ eĪ� ûàü~sè~ Ë)©@�Ò¨°ýø7ý¦o©“ßð«JŽ—ªËh×÷« ¨ƒ‚CÓãÇÕ¶ÖdÓjO޼[fGÆs @ƒ8âv˜†‹ÇC Àrý ”@$ðc ÝÏîŽÝñýëµ ÁÏŠƒP ‡<ÍG«Ð�ÇÏV»ß@…>¨XÔ//"Ó/u×[}ÆÎIQÐTÀοÑþÿ¶ Ö‹²µÊ&§@«ö¾áu‰~>”‘ü[Ð7 zép…¶6QKýr›�®s÷­ÍáÜ^^Ý1•Ë^l^E¥*È`( A_Û“�˜joˆ´/й³ÿËLBn¯Î÷nÎÕ\l€tß_áÿmÒj¾x´Fíf=VOd»Ú‘üë–Ž4ØóÂÅ`¢s¼ß§ëÓçþ8«¼Ý!ŽªF)BÌÚ`ü�bÁ¿!¿&ý~±ìÍ6zèàË ?G‰!k.½e÷óOUáþ¶0a ûÿÿ@ÓÌ}˯¢E�›o\wdM�ûüàöùúowÕÙ„8ÑÞºù½Å)�ë.zìØ?µãéú{̾ùXrAø\�Ú_@$LƒÙ/—¢ZÿÓµ>O¶i¬Îè™a€eÁFgaâÖ«åš;áÂ:6.¸Bµ6zÖÞE`@kjÿóRWR—În@TX£•¥Ã=Þ‚UÛÿ梆 v²ÐĹ@—>Ys†¤Up¹ÕRZ00ùskû#å�Ï,\I„µø¶´Ö`À_{ûi&ß󨎆ãi40?¯©�/øáÖÅð¤éuÕ[¿4ˆ@@hX;?+íìÊò–¤\¨Ä:0%�G £Â:ñ0@A\}P_¿<™ª”¿%®8 ó®˜ä¥ãüöìÚ—òbá'ˆÜ­DF±²ºïÞv�s×9«ýªX{­Õá ©gZרFþõÛ~³¢Ës»JÓí,Û!ÉÖd¡r®•]¶ÖfkH›W 1@ ÀÕpåX¼·¿]\ÇQÑwëË*dÿâö¾%·]‘«æE9T®Ùø(¯æõ.ÍãuôY»Îë{—MW†2‹Ro7ä™»ü7÷2Ïl”¯ç* œ]Û|Ôµÿ¨Ú¦hœþ¿+.œ±d³¢Ð-ý÷�‚á¹üœË˜ý6øJwiñ¨•nÔ£&Užb^¿(Èd*ÜÒKˆJŸ»?ƒ+1ÆùhûX �I‰˜fmØŒ••ÖÅãêË"Ù·«½8¿p8"ÀBmôÆý…Ð$ß  °%x®]Øm¬‰Þr°ðmÀü¤+0l}àP• @[¨vï¿Ü�®(4@Õ¸òÊ5 nÿ¦/I‘€p4‰…Y€K²èI 8|$(vxPy}® ”: P²o]K€™ yü÷:hÿØ]w7@,U€ý¬°B#@x«]5­CŸ#”%AÁ)–¨‹wèïý,æ¹Hò¸Æ‰£rèÏ…ò†HŽÑ§FôY¢Ú%Aâ"è›Þ¾Ö=Y÷–Æë+-V}Ôn?DE�Q×7à"ŸãJ×®j|>:ªÑ"�mºv¦>~Ì.]Xך“L‰‰ÄͬD€3$ 9„ysËøgϨƀVïcþ!v…Ëø¢€ÍÞWìDh`X~ùa•¿›ÉûÌ„ua×ZHºŸq—Ú•½!9¿÷‚–± .%ÐÍ,‚siŒhñî”+t~_àG׌0&}Æ~…_”Ñm§û·Æ¡\Á ØÓ(ä[©Ó¹>”ëcJ†’ó‰iíÄPK�ÐüZÏ®úyáÍ«RþéÙóÝÔ¯Þ×°ïtÛ>s‘ñIÍÝŸÎdzDòwQi‚ÐÆªI Ý?KÖA˜$åò.—¬�<¼ÕD´´‹—h” íXj£vµPȲ›˜OΠ¾¼×1jA�z1aë–¡Î’o­»3],ëˆXSžå×ÿLäÀh£áþwˆ/Ñ› þÕB¬º+€ Ń€xêŽs2F„¢(š‚mlGî>ÞU މÔ!Úææ¤6«~€ ñÙt#«®ªÛ9:ŽpRÆ=ùôQÞ—µ6L§�T–sò/´cž �½2Ã0(”#§�­'”ÜœD©VèÏÖ%óxKJ?ðXaÎ.Ó÷ <�ù¤YûúZ)Õ�é'AÉâøE öÓýGhå}EÂþJ ¦>ădå¶ÀqG}ñH•$ô†¿oyñáÎÙ¾¯µ)ã1géãÑØXäìA|4ÑÏýe,ƹXÃër…úøQý–eÚÀkcÀùÆ�ïW|ywm¡ÕRêã/œ_ã9úèò:ç×Ϻ¬“)Ø`BHÕÔò�.÷éTW×9N›�6í1±ŽL·g«ÏôZ>Õ-=ý貨l’tPñ¶é²xÈÚd:ǧˆÿqrÞ•Þë•8ˆ yl̰<Þñ•Êâ~, Ï` 0žÙ’ÙnÇl 3QØè›Xóƒ Þ)<Ð-è*è žhé? 4¶…X¨µËÇbš®¬}V¹�®œŠÇs]Çü×÷@KIä¾xÁ� Ž7I"W“\h侸àr /9ÎqSÜ;o.èŠHûz®Ô-ÂYé ˆTXÁ$öÇ{ýÑñ÷\Da&ê#'¨€P|-®Ëœ€Á_¥»TZ�¦ÿëkîA’G¾l}½ý»u€BžéÕÔºî`æ‘Ýv„Ù_³ê­ý‚.TÖ@¿,Ð] [tp€‚¢ ˜êçÌFÑú�TÌ!ÚÙ‹öÈñÍò�/«Ö[OƒV­}d¥µ[êö�xN7ŠúØYcY‘yÍGëó<§Ù¾zì[ˆôºTU]FûF´Þ^Åy®yʧ�a+ÂÉ`rAV »ñ+„�ðÞ4qœzµ$ ‚êÈk«Æ•¦Š'8 xòp p’pÈ ÑïX€Ëå…ØM«€áM:=Î4ñj‰Ù_~D®Ë˜³w‘-LJ&rl‘k;ólý p&{häkS�3Qª”°[žÕñQ¡æÒ`å*ý[Ù=Oí±½VFdò:Å6Ü{ž_xRV¼óøíÅ Õ„šÌØ„©ø@Û�¸ý½¨Ò"Êw¹‰"ÓÆùß<Ü÷Ñ œrp1™àÉizØ`¯ÕÒ¯�…â˜ß?³Jršu¹ë‚$ê{iÓëɪ¼•�(Q"‚±'8ÎÁÆ,YV%’Aö™+§gáÈ\_ÎQê½™m¶}cáw>":È+˜¢ÿ{¯Z½'Χbkß>Ô¥}©búI¢ÆÀ‘PR†²‘‹‚6˜Y†¤´àßÇû�PÆŒ:c©{vãˆH@[ZŸ—Ìf³'ëu@=¨†7‡ [Ô_ž4/·]‡¿¿Ì”o±;Z^¬¶Ýr'ìƃµŠ—­Õ:е÷ŒOîûd.ýÓ?Ç›ÝY;Îf'_xGÍ‹·vÍ"v›–.ý�;nÍwLu¾(“ì€èàè£ë/Š»•¬¸×?ÿräa.‹8ß„ÍÝþòö6�¿]J|éc�E1Û鈬-:OMÐÿ¿–ÚÙmÛœº&»6&âOßÍtJ‹ªF<|pä´úeŸÎÏ`“fw0}îëÌúS1åý„:h Ah[Öxy´É©'Ô� QA"€‚'] ê=Ó’±Ü—çŸì“�zݤò3�)“ _‚uô˜‚øu… ¹W\¢/ó¨DÉ—c~?ÜrC;‘W<à7ÏÊô�â�®òŠ$@¼¸ÛcÜ$¼VÒ,¶zÚêÙÅŸZ›3€Â_Å´ë¤L'˜nž-áb÷îy—ø†z'F½„ ãù¹fÞÄ _Æiõ:[e…FF(¥ýþ�Âó•â2áß 9�„o¯6­[Ïl±7bˆåVžZ ›"f¿c¾/æ—öÎm±`ôïÀ¥6–¸ÅyÔLÔ¢%øÅK"ë¢ø`ܘÕ:·L¿¾q²¾7‡gÞgã·Ê–]Þíwã¬~C²FMY3óÜÙ¡©æmV4£Cœ¤fçêd�'~“õ«-G5J¾2ÖÑu÷ëÿy¾&¥°Û=Žÿ⿜c].]}(– »ìvÌcŸdÅ'Y0}ã­ÑSïéq¤‚¯aŠáˆžn5Ÿnëitƒ¢r57ØkkÛÞÒHOggS€6ô MѤŒKÿÿÿÿd¦¬ÏÐÄÈÊ䦩¬¬¼É»¶lä%è¤bv ñWˆ³"ÿ4¤Äº(!n² eÑ`(¦+Æg/�|Ù–Ãâ_7¼>¾�+¬í}öèO�®ùvÓÏR#Ú¯B‹™ÛŠƒ‹EÏžæó›ÜÙ�ÑÄ*|#§Öh…ÁÑGŸþ:Ÿß»É-ÓÔZþÕóÑê u}|{ý̾¹Ûà_.'e¾Ð�góü³%°UÙõÕ§df«¶X¸±úõÙ‡¯wÃO\ùËÜ­©¦ö¦9ÅË$¦¢àëöÏû�™s¢Ñ­B‚ScºÜ»þéWÕ-{ÏX‹îº—\-,jê˵֩ÉA* @ÝlÎtœéBFrO¥®éx9ìŸEARA^¿Š6aÿJujD¼¿¿¾£gËinïÅŒá½GŒ÷ÐÍJµ Œ€R~V‘ÕÑ…)üßÀ¾·ŠùÛ[VÜën´^Î/¸º¬ ÂU:‹X\addˆþ{<[+FL™Õ5cÊšµ¢ã@bÞ»a'IRûØ÷6~_Ƀ @[£N8�5Ž¡5êD€h�‡‹’Ф$ oOI'ývýu)ø½ÏòdÃú–",^Þœñ<Š»ZYíÛr#'©ÛΞ=Íé}õ°¿œ×)´¼|ý$OÇ] nû½…çbÜVó‹»õBE=eî­¨“¾Íq%‘Éë~Ô;o¸®äá—îWû~bš¦¾çgЋa³v}ƾp_±�µ3\ˆ¥%y¿gv ¼äõ¦jçk uÒ³›d)yDqz_È”qv‡ç§ÄÇDéêKmw¦Šˆl#aíµš0ÿ΋ëÛËK=rÉïþƒ)W@'Çóµ"í€ÎecÕ¾±¯Õ+· `fDâXITëš¾x_èF¶.ˆåÊÑ‘íÞ×u¹ßY^4éT^IÅPs9W»33¯SñOvÁýjí×…>Þ”vá¨6Zuܽ‡IZ­‘9Á˜©c|`úÛ�Ûû˜4í¡Õ�ÜœÖXÝlË5y±˜ž.ë¿÷¯á†Ó4>à"“qlºè�+%!Œ�éÙÈb†üû½’Q•PǬ¹ìÚá=ŽªìŠú¼�Ò•÷Ô•ÔQaÔ‡«ÎÌblUT�õ+�1X÷ÉÀ¬•RÔ˜ãŠ1Èñþr?çÑ6À€�ÖW2�¬ç¤Ý¡Í*Dãìñºn½0Z笆÷] YR-¢¢~ýà5¦†ßòuØQö7¶L‰oj“¥X.Óu¨ºîÄÿ¯(Èc5k”Œ·¥ùØ„‡Nõý'ŸýÍi¡snx·<ÄLš—¼W½ðØ_�_9jºG;ÕÆ³z4?V¼ËÒ¾ÌÎÉuáÙU½ƒyò&ûï×Û‰5σ4I‹ëï›õ8>®ý°_må:‡Ã—ƒÿl“gTlÒ´ÏWÆWó¯ìøœÞ�Ýùþ{ʧ4óïçÇ“«÷iÝÿί-•o¹éÎ÷¿ì šê~/¯e0)ÜÀ]ŸS;o¯ˆMb½Üm™»ˆÙÞN•|ë±ÈÇÕ¾¦¼f˜lå3ƒ/ßâV¹P%cÑeNr ¼¾fYùøt÷ˆEªÒö ¯”ïñß•ŸSÒª—ÁoC]GþOÝcVgüâ7TPs-› PnˆŠ!ÁË>ÁììòáO—»¬Y}ô ×Õj%Îð’þÉVù]ðÇÓ¼TÕ–³UÁºr¹³Lëÿð­¤siÁÓ8rú‹ò þÑçÿ?�Írµí¢Þ9»ä<ÝaP±¸ºð.‹aµiÓû7è:4ÖÌcíOìÛÇþÈñõƒ¿ÿû]ë¿ÈY¬®Õë~¬…Ì]³æ±¾ŽO�ûã¾±l,ë´ÏjJ†/לôÅ™¨Ï^î<îý¶.„ï �ÎÃê|æò ¾â8�Üæ�U–9bmgZ¯Øô­·rWåê›Kð^ê’Íõûà¿©,¢:Ö“²nSHÒÕSßóå:p|3fö~~©×ލeùBxç<¶ýá̯3m¦þ»÷ÿÌóýí¦/þŸ9çx<ŒיŮ} �~fÒí Ø{6¶ÚnTüáR¿½.ƒ-¯lÜ-¾äjÿ´[ÿðøz¶ÿ ìߣ‡R¬¹*E.O»±˜ŸÇo¿~Õ‰¸Oö!©ëSþÊA�e²,ÓÅìm¬™ ?§ ˆné~§”ô|¨]N«&Ï_V9>GÏ�E®¸¾êƒj׫«^Ô¦°‹OEåÕÃü®âx¶H×_w0ŸÎµ¿¶Oøz²aÉ9|ÿ@Ï0÷ƒ[ÀÕhUP»àÛ}«7>páš®[’¯* tó |í %Ò¿TªÃý¦ëµ¼Ê´¸mýìoš_Ƹ»Çæ^´c?Mîz»n>q½OWþˆ€<â“Ï«ˆXsX"Sï\‡sãåk�äe�%>yWºÎI†£T€R¿;ìX¶¢ÃÁ½h€ÜeƒkQéõš=Ø›ünØ c�³¶ÚDZõ4 ö¹;G+yGš¥¦m…‰Çè®t)òòf¬.â�Ó۾̪ÿZÈ’�QDj¼¿M*е÷ù¬‹ëfþ?.wyÇ/Û7K|·Í€Ù\ z—H{³Ãükr{�Ù¿}|¼Ïb~|U{›F_~ 77_Ôç�ç]ÿÖWw¶mz …ä)ëfÔwª�¹~®óo÷}<—×ê=§>µ´?bªæº¯™Èª’g2¾Ûy\”ž ÖÇñ³Þ–^÷ÿÀȺ,S¶rÐtŸù·Í’Ñ¿Çw …ÄßuÒÙÞ’³Ýòºø-oï7GFf¯ÑÜï3W±˜j€ìMgñîôxg‰» vÌ�›V¥Án¥Ÿ­×>ˆµ5lëÍ€˜nh¡÷YtwÒ³c~]í4ƈ»ÿôíwOkÅ)N�ó›óòfOÿªÓÇÇw½ÿ±7ï?üï9™†;„.¹ÃWuÍP=¼%ƒ‡iþ´GÍx|ùunëýÛ·|ÞçlxŸ>ô´†å1<‘‘ Úü=p�<��wÏÍ’òìòO'(>Y¡›.Îò«m;otvš1סUaîÙpJñH¿­\GüDHÿê2p·Êlë6÷íU‘ÃTÕJÐú^oé,ws¬Ü8…oŽƒ}ý £ËȨ4N¥d×ÓR¦MÞ'2ÝYx…9.¶Æñƒõ_Ìö©ø±B{“ŠFƒø˜ÖãïöSíµÌþ½iïï8·gƒ]<þýG—ÊR¿x.œÈnLŽ\Ž…ûc[Ѳ @œÆÜùF´=Ñ™aè‚›O·ÿ«Ÿ}§ü½xÆ™ M¬îä³ÄÃÇ>z¼]úâLp~ÕbïçZMc¯—U%B¶‚‚ñ]PîßÇ Hóð6ß./µì*ŽÈͱÆtð&|Ó�Å/UlŸl(²ž¶°û,ôËkÌýëý~º4ç"Ù/ç©|HžïŽõóý:~¿*>"ZËX<æß®Fh%ùX}Ìç±äT^’ªd!Eî¡õX ƒþ¯?àCŸ ¢¹ÛÑ¡†l{¥xÔé§¾v™ñs™„²ÒîL`Ò*ÊÜg!>°\8A¦‚ðUcšÿìßäØâp©œ�^Þƒz+ÜMî7î ;•?íV«ý ló�‚Ûe#�äɆ9÷ûezÛ#ÿùâùÍñ¨Ò —jíÑó,øƒ4ç{ŠOäñ_:%éO'Eüö?WT\óUæùïk¥žw‘”7›TEOÇÎËcŠ·t Pøkú1ÞR¬‘cùýå?×1õƒfƒìOèr4ïÒ“ó6ë‡T?zÙ<á}Ö¥ò¶N#wìªìA®ÔÖê)´WM5 œ–k\7#%çƒÚ¥–( ‡~"tãEªf�¢\zrˆŸ$t¯¥U©îâí½ÿôÍÌ;Ó'T._¿?†…úõŸZ;úÒ<ý8àìM-k�U/Ѷ&ÏûЧIž1Ö>O¾�âhøÍÂwV‘€¢Åg„€VÅ!=<À Ÿî.‡›…âÀ5¹©µ²zþD>†‘{»®l¦o«@.�='ÞÉ¿76_2ˆ6ü ÿ˜°-¾ñ¨/ìþ½H{UÅÏœ]áðÏHÁÍІûà<Íis_Ö ôÉVÙ³¢¬ºÐ…׋×왞=9;KÇGiû+ò±�÷ߪ<ÎRNÔýûO]gG |ßÞ½fÙκ?¹> /q�Òœ¥ˆã{ýŒ ý{ÑAŸ±ëÊ (v#ñ¿™ Äuý6â>F"÷zÖ} =ï/àUþÓ«ÎD=j2Ã쾓ƒÇëœSÉ ÝªçÄ®ÄÉ>9Æ(ù¨­:-%ÚZ÷y4k¶§\ —½¡4bþ&´àËLÚ'qp˜Œõƒ¸; å�íI›�»ý×)|¸½¾šÝÎþ·-Ññ7ÂÖmö=kHõl†<(é)Ìw®5ôè$sùn}vãÍâxÇ>“ßîß÷íΦÑYú°e|³“ï@TƳ=bÎ1e”¿6£ä‰‹~þ§'Ö+’ÒSadý?ß릲çQ&È =¼gmÔzsÚÑüåBäj6 þOmŽäüùÊjPLk±á'Æ7u6ÈxÖ$˓ٹWüùo�ãºØ’>áÙgû1º×­enüòŽÀiƒÙÚâ‹@NYóÔ+ãl‹Þ\i˜.$§³¾=žª@Àm\}»òÑÐg¾¿¹am]2+§¢Rùtñ¼ùoÍHö@($YÃ|&»‹î�Ȫ—®¸c¡õ«×àЋ3qâˆ@KÐÜXá”þµ.wd—Ý•˜DôÝíöv¦x9·md¹ã¡~UÉF¤é*¬t�áø�uçr7Lù4f·èÏjîkcÔ™éþß#À]èª9Î,'6پϯW e•ësNÕ£›âP±Á«Òßë&�||Qê5qW³G‰pöqDòÞ#ŠlâÁ}b\Ù`!Þ/dÛ I[PYne­¹\|Ñb_|M+ZGrÃÜ‚õN¾”kGUÂm�ãÄ4ÓkãÝ46<Ääå®àçÕ­&�?£¹Cêñ]™+>Dsåòÿ”eòzÖ$ÅÑÓbw'd`_öÀÃGõ0(f׿É÷‰“[¡¶î´‡ÚK”ïñZ$ûÏIâ „-·“Ï}0¡�iÙY@Mg÷ÐñŸf¹1  ,„S Q"Y·Ÿ$é6™JØ|öz~ík;Äýüýæc<þújs®÷÷ÃáûN‹¼&}ö]ý>Ý^û¢J"yŒýp] ŸÏ°9†hþ�Ážv}ûÖ§ûõ¾¹·S\wã繪~¯¶OÝLq—ÛãÒm¶ÿ´�¿û÷îóþ6§G=~Ö‡ìY>_s<Cèªzz ëí%­‡ÛùÆ«ÙV•YK3-Çt¸ÞBfCÕ—ñ:ëÕ zŒ¢Íî·yl›U�~¬®* €€›[œ'«BøöUý‰`‹Íqþ»žLðp²Ùø·¼G�?`"×|â÷@í&%b5­"®ôyœÍ/‰ì€vÏݯúí&fƒáj\7Ö»ÿ›¤EÜûŒ«·FÔ‹ �p¡!·tP€Þ̪7€>˜í¿î�ÝIDžý~DÖa+*bÒ  hÈš:žzãkZ:W×Q|=Ÿ�=‡8J¡ÅçƒCì9)Ôaäñññ¬-Ö¹Ÿ#ÔU._õþy�u¨M6ÐgC@_T¯£/ÿåDZÉaZöÀô¨ŠÖóûm­Q9ˆªGûÑœQ"ó=„“Åc‰*}Ÿž?* >€<>Äü7M5TùãAADVu˜T�Óý¯§ÅPL­æ¨Š"ŠPÏ~"˜²¨‹E9µ¤ ­¬®t ªˆ®1%?æVü†@{ ¸„¹ø»|dtð»…L‡\=Àl%Ù»@u@·ºÈ˜ÇÈÊêC¨z<ÜfYæžäw% Ù„Â�ݰ0€”òüúŸ?’¯’ ïæšÙÃþÕ¶öã}£Þ�ez×u¯µ�¶ ™„;ïŒ5…v{@ïAh¤»ý‰3,œ×ÿ{sMÄĩɔÔ>nÁjüþX—ó)îØm&ܺ(±b¼Æî\’±÷|: ^QÆî×5ÛŒ=pV,¥íAzGx$£ádqÝlúêÔÁV¿ª0{‡ìÌPblWÊ�ÕÏhÿÈ’Î�~?4²ñú=åÝâ¼Ýh¶˜¿ü}vÕ_]d¶ê¨“]èVŽ}%�ÿñ³—Ô*6[žßí­…’Ï»À{ Ö¬‰l#ÚÊZ­¹)�}庪*Õ#øMþ ºùgéÞËU„[‹ß JÞ§ªG¨2;&ê¡êh¼Ãe‹ÔTE}d4;-(t|TûE–yØKÉ…q%K¶(QÔ 7ýÛŸ;‹!ãƒKY†MòÎíuªI‘JÀD%TÖ¯òï@ÀWʵ탗¤wœù‚ïoN-)?z ‰kpNˆøÂáª� !‹WéÕ:]±M¸^o8^Á­Ïy¯«+ŽõÁj˜¯Gæë ÿˆµ *PŠ:r5Ç~¬ú¾a93‹ýF¶?€hÚ½ÓÔÂ|ƒâRóÛ“-*—ޝ¡�Rùué§èèqBÊÛ{ØYH/ש+sò^D14¡7n]õ*N35"™#.‡%ú¬öû�>¥h;Êú+a;)ŽìŒåfM�Ðþö¹Ü^ræ“ÙÈRvÓÿ›ÌÇ®V£‘fYa7Õùå®Ý©>G4yª"‰/⺠f] QHªáÔýß˾÷£,ëÀ�15“Çb8,?†7¥ýneMíû�Ý�ªõVYg;É=ŸÝ�ÑT9 §ì=úUJþ- >¾ <ˆ3èLl>…ùˆû%bå˜ZЍ¢ãêÀM�{Æç«é¿ÿ¯"ƒ§Þæìö‚H4†(4ÀV«œ¥VÂÏ<K½6ÜûÕÑóEíñôѲΒ�ÓË3â [Ê*ˆ3!0¤D²&Ÿ¨üƒ>5Å¿3�'÷Q±Ë"<ª_fVϾó=/mFé�Š jÖ¹x!eYAQDê‘)¦{jW3–”(ⱦ^Yùäøã^@PÐ:œ¥´ž!×yLXy~=IÙÕú›£+E(Øh}Bßíõ«…Š_Z3t–YÜ�²S˜NuU`áˆÆý±m1‘sή! *ŠEÄ�ˆùùxZÑqõájXÝ(ûþ÷Wú^ƤHUSQ¨S#3%"&@W_êî/ÿéá“îè"¢ª¹ß8$sT@éYšDS5�퀕¬ú¸©EDDV¶É‰{FK^ŠU7{ö¿ËbêkÜ’Çâ©ÇÐS·…®GoEWëòµÂäüÑDÛ}A4œ+Í:¶‚§|Þ]¼„‡¿fvˆ·²wÅz†�œšØÛöù‘–=†«êßò"ØPÌäùŠÿ)~³ãƒXðM×£x 6˜M£5É}€1õ3õé&õ(að2?PMˆ¾+ �ß…Þ伄/+[Éÿ8E�Œ"Íb.×ÔNƒS”Öu 0n[¨6šàÛK¨í®YžË¥·K7oUˆæ‰xžäå¿Þš0÷á<Á�Óã-ÙỲ ½—»Sq±;…-œ~´Ø¥3˜Çò“qÕëŠUø´§Îì~–qªï“˜¼¿‹b‚»Ï\9~c{GûÐ`q½fžUùqá†Ä–O©isíõ±i�1¾Gu†I?!Â#ºA„Gê¢� $ôÌùÝ1㜠Ì8óLv>ÏçÅ 6s À�£õñ$ê“B(šª#’Ħt±¦KPUÏeÊ:Û¼ Ý+:Ðj[û�® ºÁ<[uŽ7ì×úüi~.Û¡îê�¦Ýx�HÿÎC‡ø´¾ýL‘ßí%ÓôŸì¬p®_|8Ãçaï·�Õ£K¢%2“†…š•¦e š~bâºïPÎv56°ž£Èý8_Q¼ë¥6ùèö_|a}»Yøp³…ÅÁ+Y÷†[èï,�’E i(D �çîé©oðÙpÕ¶™0Áõê^Õ"oá£sÖƒEÉØ�‡¥Y�U‰Õ/�²€”Ñë[÷ȰöÞÄÑM“Vbbß„wÁu ’ø™¿Þ–Ùqq^Ô˜©ÞoÿvÕÖm|>¿CQÄY¬àìjŠã¼„}|dæU+K~#‰B·DÙ”çHQ Þ¼�׊> :…[òÖÀ5`‹ªtU齟PÂÑG´mc¿ðäÍ·ßd–³žýGþ%Adî0þWî]½ð„�ö©(`lƒØºr)†ÛTظCöq0Û÷õi‹ŽöÔ�ÿå°ÛJÕ¥Ù³JkŸ[ ñÌO:Üï€S‘´N"( S"Ç/y•ás“5ØCjvÏþµ�¡Ö‹â˱%"d`ï¿xŸïóí˜:òI­`â(@vyª(Ty©#PSÅ* ªKU@uKÏ“zT1°3V´ë±Ë:ý µ/­c›DžWê¤ À‹  P¤H¬�ðêŦJ: ªy„¹¸Ù‘, uôRA-‘¿¯�ZŸïß­†˜�h !2)µÑòjÕªEõªØóx´8€N¦tÚ‘C—/—y¯_¯é&ª¾ruWË?‡„ÖªÀlEyº ‚‰XDêêí }U;n !Z±Ó/Ç�(4æ5ueidõ�ö²ãõ¹ó½×øÕ½×Xo×Ô½Õk®ÑíLÍxš'gZÑE.³öDŸÝ•7±g±‹ œMãµêºuÔü\¾Äƒm{j_ Àq>,¼‹Ê?~Þðû-ñ¸x´Ì¦l=|&é’2ç³:é5¿ü%ÄáíÄ�©¥KY«©¾s‡ ¬\5m¢ŽÄ¡:q«¼TwI*X¢—å6iö vþ|Ô“ 6ý%î޾¨a¯ÿНýÊõ?¨ß ¦u¼ÇiÖ`ü\OWxÒn¶\¤ºs2�¢ŸÀƒÎÏUH?5šü8Ϧn|£enõ™4 š/*7¿Roíät8¶ä$�wj» �ç*‰t=™˜tuQmãë|îLÈ<Çv¯KÚ”�†¥ÕH[©�ŸR�¨7¼ì¥z–Å1$,B�é†ãĆÇGûÄt½›à*K “ 2öš‡ñqˆ6–�ûK_RAQdj³aVáÜ�"PhgÞ—A3%Óy^Z¦¬ñ'K—Ÿ§íp$¹îqh‘'…Wóü€ÌOm�k5™s´šõ"mùnî[³|Æ­¶þ ]$ª£)bLv5/ãTK"K­Äý°ys)j2æ|àI·ôQg(H=ŽèrçËç·ª–Ù'nªf×=ÖŠå8[>§ª:K 8‘Ó$5‡Ãæ9ÎVr÷_H¿™­ÏÛ¡¢~>ÞVÒ¦ÝÌú�K5!ÇäÑÓMLè/ØÇ»ó ö˜AD‡øËý„Pä‘ë¨c@¥÷*ç��àUü÷ÔÙ^×'A‚cŸWsã¦7w%ê-B�…gÃXIaéHu;4å|ÚwƆPWƧ—wô۽ˡX¯Ó"kç‚3–¶ð®hºìòê¢c{·¿ÛúšÅc6F⛥TómF7Ä(¾Ý½?m97^uðH(5]²ëb®uå_ÅOggS@Vô Ml±Tzÿÿÿÿ8ÿÿÿÿÿÿÿÿŸ¸¸·ÿÿÿÿFÞÜÑ-Äf:‡xFõ!�òÄT¨ÎÒ«X#6 íe7ÿå—›Èñxm“xð§€^¯ätÄýè…g€9$Ü p…mC\�i„ÉhUžlÛý†˜°/ÄñÙ£5y<…ŽëþèÎ[Mª€tnƒz²t?õÔ•gë/j‘ šŽJ—å�Do|�¿ËÍÓ Ô&W&¡z Y«yü+É:Ô’Vpê¿IDbÞûÁlFÏ‹´ù£»ÌZßšÿ¡«ö×çÛ*ˆ€‚",‹* ã£ÌI¦Š¨ªž,�/«òžé¬qrYØ_"-"°{oEt¤O?Ûp·bõ¸cªŠZµ´y»¥?/&Äxm]ÖlCE gÆQ€CWÿèÜq ¨ÙÇÏ:“ž4O¾~|x•P=µÑÙ骄LÙ*Šˆ°ÔT)ŠŽÆqï,&‘·‚¶Šjĺû¤¼VÅ0R.PE€FïàpÍë!èbjfµ5´W?ÀmUÏ­uD‘12†Ùõí|bØÁ�"b–¯^ÝÕç{3ônž¦€+i|o­Vß5mw†ÃÙãÍX¿nÔ<ÇgÈ ¦GæÉOZ\‘eÕ‚[E¹þ¤Í�úÐò°]Kÿ™ªÜpðÎïßÔsê­N<Ùñ÷º_¼“9—¦+=*kôÔnaé«1Ðoà¼+IlÂ&‘x�´Âƒ«?úôq»¦ðgÉwXäUânMq¥9ìªÙÊ–AæŸò0݇I�o–Cp?¦.¿/»î¹Bz+Ñ{ìªý¸I\ÄìE°… ù³M*áæ¿tp»~‰5¦ëLØ~i"…«ïæ'V=Øö9·ôí²_ïȦ Aw£g4ü-„ÇÝë±Êxí =îmÑêø/ï�¾–xIÓnáR™Õ¾Á±�…[°¯ÉN6{c°wðÿ·¤çáÞ’¢ÿ¯ñ~œU¼4ø®Ì¤H˾Y°íÎŒ<¶ï»@P›ù-<Ú"*ˆ:é~ ŠÅjDê_,ñG\Vä<¿›š C*ŽY½r¿n(i«üpQ8•U!“$U$¬F¬Tô¯R©JߣƪçÞsMW0¼‡:•„°<¨r«Ýžn¶W�ù¯h @ãÅD„ÓÁ¿Ÿ" O‹!3dr2-Z™ê"Ùƒ¿I_*NYŸÔü$á» Æ«{þ‹ –"`eVJ1Ü¥b/ÌWûX‡Ë¨ÖçñÁLÛ?ð�?˰Hpý tB¿Ìr²æt¾�Ý€%� k’–ÈVÝ*¤Ø‘òÑ%ñ0  Ò8µ=™Ù°i¢4I¯žÙêždSžûWq–§{¼Å%ä«EI˜m›Õ �|ÔRŸ�¢{çÇße�‰,oþaˆÜ|…x�Æ9ðjKq²›EñÜT6 V§ÇÙÖÖ²C¤½¨jlg”�\äp¼˜þúZ/m9�µéÑÜ}$3¯OŸúLªxUå!]j’­n®Æ1Wë.'~ºW‘0þ <¸{„¸ˆ ¡Á ¼.È[U1³‹zKæDá,C�50øÏçW1 á¶³Ž~–"�âÆž<Ùwûš²tSJ°˜âô#[BØûÃe¿ì^!jK¸>'ÊÝS;#bä¦o�ýc›Bì ›XGãSJ9s¯všIõºúŽ%n‰iø{öX—fè¡;2¦Q¯ A“äcñív?¡ H%23$µ OÄyj,Kª© m¦€†t(³÷� ÙÝ)̸0]ߺssÿ-®ÅUU.Xy¢_CÂÁŠ$¦j¬!íqt@®íED › VPQê¶Ãß?Má0›SŠ]SS­ÞùPŸ«iY›ý4Z;�B£F缋ðF­NÌûD�GìÔAÒT‘WA²e «6„S÷T@UG˘¤«– G÷(³DQ­žÌ³«¡†bŠb,õ�¾áðÄ‹°fæ2ÜcTû¤¾�PU†Ð}ß«Ÿ âÅÌn�/!˸N «`Ö*‚) DÄQEËÊ+µ~™]F·6C8IzÝ2iX:Î^Œß`µ€ÀÔ�ÍÎä`_Üj¼µò\ÈGgì?Ó�÷Ôt­¦3¡ö·g£Ñg£ê)HFJéDð}è"™ß¹—§ñÎJ¨ý…¬mòTÔ{™u·¾qëh]zÿÔê.l'”ç"JLkjzgÅV•xX¬$îÝ}«ÍÉ„ßzÔÕ#É=››æ8Þnféœö”Ö>J»§‰Æ¯Ë©ûe:¶BQNpX°üSš;cNqíu]Œµ_·þz!ñ¿¥Æ¨8ßôfçNÐŒdç³¾o¤ø”¿V<5\ؼ†½V~§-lï §¥IˆV7-wµGò¡îSÄB´´Â#†‰�ÅŸþ÷G|Ú+•b3ÌÀYc_¬¸íó`Œ1ÃH ÌKÓsêì1·Š6KÖmÃw3œí–£Ó0à¾ù ºí…ƒnüÉéîöýuF/ƒµvqWožzaCÈÖŠœèŽz $¹³ß•p^w¨�¾S5j×ö©˜ûe0´€¥ŒþJågáÊ|ë#œ�¯ï�nÜ`óXd»8í÷UF5Z©£ª¢8ð-në‹uÃ:Þ¥Qƒ{8ªŠ¢p¸ºÉ/5÷êtñf:„¿ù/cp;~\ëê±8ñ¸¼Œ¿€Æ á$9ΙëFwë´jÅTõÄZèŸô—úx5¨h+w[²·»ŽS€ÌߪÓ7¯2*õú.5¸òéôzPç·Žj›S‚ŒÙüÜ@Z;üS¦ÌEã•e�É_Ǒى¶&לJdIϹîiaò5Ô:_�½  ÀÓ âóchý„vÍÌtîq¾ZZNZý=Oê´þã&"ˆ «£ � z15ÝÙg-dý?r¦)b9ÔT8T¶¡L¿KGüãĨԩ܋ŒI�nmò͘ù+?á' g¾âIh�_Ex”ìþÅG¿{¨ïtõ<ñº—šµÁÔyžFÙ°Í=–äSãáuÙí¡�Šª?`Ñÿ`’î9µZÿ“½”�4[*Îî/�«‡}n…=ó£½%á5^>«t\¬˜ã–*(SËé&>„Îù¹£e…œ•³<8»£w˽*�Hg?õd~ömù§W h"“kö½•ŽF0¬k°S�7X‡9H›ù™¬ëM¶Ö×5£�ýln‹Më· œîq¿fPH~ü"¡ÜÍÃ.zSH¿z4N¬Á^v‡‡Îdñ°5\OÉÖhY½¾0éZ"À2ù¬Ü7ëXvë÷’‰µ{V¿Š¹å­@N* „œ<Žš¿—O|yÚŽÔ‰Ä×p[ÃPØÖÒý~†Óåýwx;j68EÇÓͲ«Ü?‡Š%༆¶oý¾ïsøóP"°ÐÿÆ¥ºz?¿ÏEP‚zk ¯ <ƒ�kØô^]Wl|³ágönN¶ÐÀChñú5»ä`Š„—›}ú¬7š¸h›O1��k˜Ã«Ÿv›†‚–š¦g2å™ Äþ{Feµ¡ÿÇ”… ë¹­N%çZS=í‘ÑU·Ô;�š÷cõ\Ýêp¼Y<­·¤|ŽŸßáP¦«Ë*ß™�åÅ­[îó=-/S´» áó~wú_¬ó^’P4_ýùî*q³ ÿÏçÔ×ñ\ŸLvýüôY²$Žòë¦ZMú»¶›m[îÛ’ùƒœÛ#0ËŸ{ájÿÜJ°×¥aé[<&Õ;ºôØe'ùOðœ—g ¨~´Ov¥Åm#L>PIºÚ÷(çcNñÕ˜>Õö&,–¾_óñùsòö}âÓŸGùüå¹û‘ÅðóWþéMÿªìe�ù 8A¾Œ£"�  íµ¥ÜÒfé½�˜f¯àzn® À€ìÒs导·î¹hÁî¬Q�ýÝZ}¬”Æß]÷©©öÖ˜x¨+W”9;º•ü ¹Ú¦Š¢«‚5rŠí?õ9Q^ŠÀ4µ¼ºõg�õ^’4#Òð,ùãžU.\ó¢À¶ζÑßÒ)›%?ú‚œýåvá—ó'{öþ·üð4þþòÛÿOªñìÅñÉ‹÷ñ¨ßŸïçÿ>¨…þä—C±î=Zð€oŸª×°køýs­ž°"öª 66sÓHMÝzm9|ª$âsýžØ|Σ‰gÎdo©°ôªZ1?£íÂÄ5Õ7Éç͸’LaºAåP+Ò.š÷T{éi”<’¶Ü.ïœ5뻈ԭç7k¬Aœ€©‰<óŸ8Ù\þB3àG'Ðw¤± bjQ»þÈ»Ûÿz|õqë_õ>þêÿQi\¿µYô=œŸ2žÖÀÿÈ-³öG÷ã'³Ÿ¶¬ÿ¼ñ3= �ÿÁÝrÁ­Ø™¢&£¡Æö.¬ÚƒM_j?¿Îè Iÿ¨Êú2øµcêGe(¯ýì¿yNXÙÖ&S:âOѵ¯gr˜wj·¢h]‹¬Ÿÿãq ƒH%œRòÓõïñh§ÎÔT§«süxŸÚB*õŒ €‚õoþcd(©D pÉXom\²Q³Úí‡?=O~ŸÖ*r|h `õ@ Ȥ€w2‘e”ôÁÝJÛ‡ä5ý=£ÙÇè5-¿g”¬•q¸°�Ƽe)ÂÓ¼óŹù¾­ÃpÑI¦N‰­5À=ï¢Þ×5w"DGÕÒTž³_$ûçzÒ«. u;ÛÑR?ë’VyTï?ºï²©ªÁv~ÙŸãÐê&:¥ÅïÙ‹÷Šv‡�|Òy†•T»�[�ÍÞ[¿ꤧ‚8ãÐçÖìð}ð 5hÇ[½m½»ë½íÍŠ¬B¿|�YÏ�ÙVv:iXYà¸^ :ŒŽÜŸi¢FŸÕ�|ßf=¸d)‹µ¹«Bw°@pàä8ñ6íIãeË´¨hnáȽØk¸ƒ’Ò„*¶18šü´¿ÂB¿Fï W÷¦‹ÍŽÖwt`$aæ0¤¹¥ÝêllÖUßá9S¹Ý:H$jPÔ˜'U«zAM?߆½®lÕŽ•é(ñù?çÊüxχӆ…ÙÄA¼;0¾½$_&³Y×xŽ’—VN»ŸÝYÝ÷*³Zî*RšÜ¥˜ezªFÙBÛ�·?mæÇ4×å#:Õ——r}TÃÒŒ»|Œniü}ïâsô/GÇ­¸ïkSŸ/œï‹–&ìò|½2X¼õá3í‡ûcã¦_ܶ§]ý:7çãá¶>¤‹yݪº7U›Ï7†õ¦•¢?'uöwï뿎ֿ&T¿üÿÙ•²ÚL¾Í*ïdoG[e‘·~vü¦»†ÿæz¿œŽ�e•ºÆ•fÔÜô&›4 ¥QæŒZø·º£ÍäM9ÍÌЮwÿ­ßV+h!Ÿ×ó÷%�?=e0`û]7ÕšU€Áªm�Œ„/ëÒ´ô—ÔtêÓŸ×pOggS@jô M´7%dÿÿÿóÿÿÿÿ ÿÿÿüÿÿÿÿÿÿÿÿþ\‰)Ôг 4¸ƒê¿Êàñ(%*¡—ë嬰á«+éÂf_ý§�üÏ1�ÛM~âvý�«å>»ð DAí] ‚ pàM™ýJ½[¨î0µoÿøÚ1dÖ'b!¹Ò…}}‹•0µÔèZï¿ý¾ÅWòÿnðÿ»«6¢QS&"P©Ýœ¡y;À‡ŠÊñ’ßeÚyêâúô…–Xa ´BD­5”Ï-0ÅIàùYhˆvãYö­ªQoYu,¢˜��·rõ?3œeîP_K#€~€� ˜hH€sÌ�[„›ïÅhºmØxŽÎSêðYL�«dmtÐ÷¼Œ¾Äµü3€l6šÔ5ø‹ØÝ°.¯±Rg�Èh@ušdêYóõð4M �¤SŸ×³$Sƒ×ùœ»ÄÜc¯Á³—˜D°pJ$îý½ñ6ûäU»7ûƒ‚&WÛqy3$¨p–ôÎl(‰È}ân"hçÞÒ%S´FÐȲvø;ÉÞþ×û÷id™ó€ùYéJ¬½™c^×a›4 yϯ~a÷%n‹å£ðl‹aøuëô Ô^0áÙⳂ̵'¾1žn1ò<ö±4fztÁ’#Ó©s¼x«¡†�F#Ë®ƒÐVQ†¾;¤¤þ=>ÅJånTä]{î§êâ¤~æÆç,Íú~‰w«»ß袋§ë œÝ œ4Ýeºµ™È­îZë<›âJÆ]Ö/êp~åAe‘ ×q\Mz(|×1ñòbó·üsjl“7­YkPõñrE‹*—1û­LæÉö7ûžíùŽÌ�ü²ó8Y›Ïa¿ø‚†'N&±êèÍÆ^Ÿpé?�Þë4q¥„´$Ò…%ý¹�¿àÿóý¼éßôå€#0L^û�z=0VOò8±¬!Z( $ *‘ÌÝsfÜ»êÌ×®Ñe"æÕôÁoëö/’R«ºéÜYc‡ôز?,™ŸÓöëîpÛD…W7¬€¢$pöÛßÜÇ MTRZY–½Ë¥†–_«äÐD‰#à cŒ\ph‹Wç‡\˜ûNðøÝpTâ1mÈ.7(m’ºhòJnzÕ{£H„¾Ÿ8ììë:x% Z¥lô…QjµÄ�½ü†,Mì²{öå}ýy^·ß›gbRŒdýq)Cc"1&)òü·}ÿû%<òä¹N^Ãv›¯V]¹q;þÚÆ˜¦úwßyS÷l½/ Ã=€<:iMãœL€b\_~˜6«VŸ[:šï×ÙS�xö»w[Øf3¶…7^|„�_W|ÁädñYêÍ Ø`> \ÀÚÀ¸³4T¸Ã9ø? m�nADM)ÒÕ=#ÜØ�x¹û„W±àï™\þËkÈf§ R¿m  Ê 4®~rÛÜqãÀ@&­àÈ}S�Ï«nâŸÏ¶í°ÎtEð¹ù#oíðŠ^1o:†áp¹µ«À þÊTNƒŒûÙf•Ú$ BÍ:LºÆ¥R¸yª(Š×—ÏDÆB¦šjô’ÛE›sÿg%Z¦(j+4€l˹9TO­LH@$;d\kù‡³‰u­B’ÃŽ£8— cBQýÕƒ«±<;`WQb ªvÁ]56n%€`"@[‡T C Ûôj»ÓbqG‘饎‰®1½Ô‹ «b•Áâ\˜+«…‰ "€L½Zû7Îó8¬þTÃ/G9ˆQåK•WAWE¤°[(ô*¸=i5—BUÕ|¬8Ô*¿ÌãÙcˆ ˆ0ô\cJ�.£Æªu͈yÌAÆÃ0$€"ÚÆÃ$tcKêÂ’ŸðzìadOÞO'vþ¤:ýÁQ½ŸÒ÷¿ð7G#Ob9®.·/•ÑÀÎÛá¬ÂÔ=JiÚ&÷˜nÎ ¹ÌoVãì˵ó¸5�·¾œºdŽW€ü£+×mVùH ÓÙ­k©¦ÍŸeŽJ|R[‡]|h©9ŽÐl3Šö�•?ÁÀ[|ì¹½ Ï96¼ýÒí«°ânÍï0fýÙ•ùÉǻطdCʺåä4Æ0“oÖ£µÍrç÷*áÝx>ÜŽ›· m‰{›¡h÷Ãà4^ZÍô‡}NìtÙˆÔÙÑTz“öÙåïþ[ÕÉ*d//ÌMm>³€3¼~ñÚUÿ-Í©=³Ú¨Ë2µÃÖY8NÓ,Yû‘D‘·GT9¾œ~@á=÷H �¤RáͪÞ逭 FÈðìßjS¼ƒŽ�½q¶ºUÿ�>&lÙüü¶ÿz¸µKS@È(©ÕlÓdp5 0Ž‘(ÿõ )n��ÐÚ Ôü¿Õ‰f]CŽ4Í×ú¸% kãh� k{‡,JÜ�â1qVŒY,öšNôÂZ½X†[ÌÇaÒ =Ù� /sJcÿí]ÄýËÁ¨•3V<mÃsź§YÖ¤¯`çéw06M\ùH,Z“�A¡Údç³àaãm^’yÏ&‘ó!ÝwXºþ43�bñB/fó‹Ð ‡~\ Ó¯´ÅדE¿�[I¾ÚÙ1Ý3œìR0ÖçÍgµ,Ýz�Xñ.•Œ®(òëõ\¾ßMcúñs?–«éº–¬Ël–Ÿ¹û}Ó4ÍWòu€At’§µ@Ó�¸áÝ£–;o[ ø‹%㪦¶4°o,Îecù™‚Þ Ü­šÿ€}ôŸÂ“›CüÀbƒèÁPA =v¯Ò‚ýØEéÂnä2~eÇÆÃOxã¸Qæc QÕAžòÿ.ܰ Èf“(À€¹"à èâŸb¾“]ýÿ?ÞµÊÖ?S+ ÷ÿø`/´d¤sôöêø7²;µL²ˆûñ;\ÉAevªˆ eAÈ’w¹Šïv‚]G:ÝdG×J5¸=J-îv»1Ïݬ‘9*pj ²ìïAD´ ÇA)Õp(ŽýWNp{I5%}Å;8„“c ˆ&†~v•Z¯�AТM‰”Š5¬èJy5€ÑÕE‹—×)¹ž‹bÔµZŒåõEÕœŸ¿uIž>{�ÝW=OÕ“ÛT]žÛbª)†Õ*-�8$‹EòêNj'g¦µa2 „X SVìSAËlŸ­%C´h¶Õ!Ëc`Tb–ÈJ  ’Ÿ7Ûé)u� @eÞÙ™ÙÔK«ftg zè½¶‰ ‰´ñPYdÅî@Lq—ú1;©ÏÚ¨.VÚÕÇBõu \¢ñÚÖ5ºƒx# ¯%£öƒŸ‹Àñ¾!|nj8ðq]pë·4a� ¹WÍŽp¹ÂLjNšæõµ=ëFrÊ}á \D¯ÓÄÆ…•QÿÇ žJ$©³ž^]{DHe,–ôÉv]Ñõm®˜Ï½Fïg™#÷±ü[Ü;Xÿkvµ·—…^Ÿ,çèì�ªl3f-´éå)CúçmÎx>¦Co&-ô|F,÷ø`ãœUr*9uñËrÍËüL¯±$ñÌëY”È•”FVƒ~Æ¡� s9xÏ¡©SŒ¨þVª1Yp�«Ïóî®,qQ¿gÅÑì°ýe•¾L¡ýð~ɲ%lé7éDÃ9âàK P–þv¤V+;-R€ˆÈ‘P~ÞLß“²>£ø‡Ô>R‡$ÀÅR–‚‡‡EØÎʱ8–Žó+.R÷½–^&.‡Fa 3ÇUÏ©®Jk¨a,M–±�-�tô/q@mv¾£Zpž¢å ÖYÐ׉•üúëË®ÈÚñ㤕޸T#Põ¨4—SŠ™lÿGüës‡[‰=¼H�¶§ÌÄ*kܽtÀª©bF%"9ÓYb÷#‚dT`Í$3Òè8”Ø€ÿU�ÖÑý`eºm‘u8‘© °°"“»‘»Êά“…3,p–‰˜²ÂÊ`‰Š;°VhEÎàŒ¦,¾ô^ªý©]ÝnïÔ­�"Ö%M·�>Mrrã£&ïÔ$uk¶ã#ŸˆHT¦Ñµ;îÓn³D8Œço›]qFo9n»õÚºì@òr£�ëGì\ƒ°6¿ØáËtÇ–+޹- þ\¬3-~hFkÌÒQáÎíiõ‡&�ÁÊ¢6ô�w6_�óý¿ì£vWÕ—°¬[ûK³àK;âýʳ´_5Œ…y¯¼õºÉµwJ¦¡£Tª³üB‡¸©!åõüócLÙj&´1³óÅ+8¢úÕ*Z¼Q5ˆ!ËÐèe }š‘´(‰Ã©™ÔZ�nƒЫ£uDB„6u£jfìõúÈhÛ @­JÒ'rjáoq̹$Ý õYJSAHÙŸd€Š‚Ķ?ª@êõÁ�ç y¤¼r]• ®8³ë8+°3µ¨.ÁŽP©U‰£UtÎÆÏZEx‘Äi½*µ¶ RápUèCj\µÅ1£tST°c[²U¡N8]Òm¢ÞF>JÁ €}�>¢;lõÑ÷fõ2º&õk‡Ã¦ž  ˜Û‹œl­�ÅØÿû€wţÊcei»Ÿ‡ ü+�õÿ¶¯7#“£Â¢/v®Ò3ðÒ"KZ—µåéû6ïÑwýâ�k0ÀŠp;£Dˆñ+ˆ«å§Ç?µJû×rõ^ä¡Ýë\ƒÃæ ¯³�ÅH¾^¨ÿÓvhTÅg>O¹’‰o½øêÈZÒtq6.œ¤¢>Ý•U­ôrù¯Ó¯ëÈ"³¥Î®îyÜKöd×� ,>õáØ¥UÈ\bXã À¬ö}ñKëêE�¾ýP‘¤DÔþœ£u«fT�ÇP•¯_ù»Çšu愯¦c�JX½Rè�š±ÿ« åBÿξ uSµ‹�ÉfØÍ`_ä¹™µËÓNýZ1²ºq*fÒ÷;äTÔX¢‚²Zk_ÓK²-„œÆ¢)«q,=70¡ú@5üH�x.t.ã1·N[@ãU²d5ËbUƺœL¯rž=Ÿ-ÐàºñlÜ»m%;¿Ó×c`À EÏ6T]¾÷уn…ïò2ó�Öy2K7�[•–q ¼n£ÕVABoB¶æ[—>ÛÇ[º‡[ÙÄŒãÓ½·>^?JËdKËû™{�\<�†Y�ôéBåhF€÷ÿõ+->:.ÝJÌ®Ïÿ7b%,ºm‹×Çj³pj�¾ëæJÔϵ 6féN¹Åošñá1£I;$EÐ…†B§Ìò|§Ö)Ý.œ,d)½Vš‚%êÞôó²Ï¶3'ZÝ£…lº5αs\%ŽÓ(Û[ëË ªçx¶{§Ôç[!e†šNhuô*—ËIa‹Àh€+}DƒŽýáý.¾“±I¬füƦ7g~ÉõTtž4JâŒå²‰ÆuSXk�Sç³´[öä¯Û �³ir{‰GËèN¦ò¶ä…Ú¬ŠæÏºÚúK(wp¾�¢î\É#«þ@™ Ä�À5¸fùàEÕ“Þ%GcÐ]½-˜þU+7âÁü¼æzã/h¿òbDz¸´ý' UÕçíùàmÞömÇÞå‘/:WôÛ:ê'oyD´­BŒw—#[¥<ñ±óu¼(ÔPÏ@röTp­ ¼Á”wIKè9:RqâÏþè~-´úÉKj"ò.•ÌèA‰ê:½ÁUüããB.»‹-J�MC-ªLK½Ù;€ŠYÝû/eÓ1g ©Ò K«`¶yê\€C‰€œé ¤PŠ”§7.Ryö=p¦Aq y+ˆ+�sì‰"“€¸Ç#:]ж[:dä¿ÏC ËŠ©Ê´´X6Á!õ9аԎò=pò¤�×ýmìí¦iůîZ–š“I-2€AÔª�òÞç„)‡Õµ§¦‰hõ¶÷_�«faêëQ_>Õœ²K<‹Ê€¨ÉDMµÄbÚ0D¦:>¥}ì €ªØdœ˜‹Nï[ö±ð 1£K�8À즂jd×ÀÊUî'-Ã({ÓÄ‹KeúésòD�WqÎ[%EòÚ5JÌ#Œ¥ß»®ú’¶úwߘYe‹Q×›Ü:CðʆH1A޾ÚéüÀùÒmú”(µÐ;¯­¿Mß­ò©ù|uŽªµ»,;S â!™Þ—ËháL0$_ÔsVd�<Û÷¤Á8ÖM%Ï|…ËhiU—Ș«~u.1}ÆdUß ¼uvËK¸^Z¡]’)&¦ï–tÅ<ÅCÂÍ‹¡Ë˜òŸxÝxæ¹S\0˜uû×~«¬Ó‚Ï]Dm÷EÞʸøç'àð­ÍöŒîxi¹ôžþ¾·ÚGôEBüɬÑ@eÕÞlåË€�›I�o²‰”B•Xµ:®‚ç´ù,•ÉŒqüë.¾èµð°_¯ïY„áV»tm�Uj¾‡ÏÔÃnİ|ÍþìÌðû¶x*k3.¼s)hGc"eþaecþtC?yÖŠybôC[Ñ9×ÄZÙžË×À\7g”˜~~¹(I2éBÀé8°^~cLþ_"mÓýôÊ×»Ç÷Æ/�¯^mÅìÖ@  šmýîR3ÛË#†>ìnŸ]zªJ&Iª�H œ5È>Ú´xó[¯úsÙeßûÃL¾¨‘¤�…ðÅŬV'­<ºj“FqÓL—ª­¾jö š>É0¯}dabhça 5K‰rá�8¥=á¤ss5çJÀοºmë§°¬nñ4tŸÊ QÒ†D_¯·%+ ×íêŽÏź¾Ér�tcpB_Ìõž|�»—5ÿXG¬ÝäÃÇ$,÷ˆs! L“h¿ößÒ€óq8äÕZãÞâËÆ€‚Út½mÜ«Ù^#y{©õ®OggS€zô M˜ š=ÿÿÿÿÿÿÿÿÿÿÿÿ—¥¯ªª²>\ùmz}Àh þ îÜê„Á•L{iOÆL©¢ønœ±êpŽ8²eÕ_ÞŠã~Ûˆ€ëxlc9ß^ *¨[º�ˆ¬ ÿ4˜PO«ò|âJÔ+äñßlR}îRð‡YÜûV‹ N¤Óÿ=§j»K`ýÂñÄ;‚4Çÿ“A4N$:ô}n8&ÔpBÔþc·]AôpD² é‹Dï\îúÛ®5"c¥ÎþÖÙ&/ÛÊo=«�÷ãÞ µ(@k,_vÕ¬+Tj©€�Úyf¨¢¨aÉ«¾ToS¡Ú/õ Xî6"Ýyl E2]¿PÕC­¯b½·Tv˜@„®&"†Å´" ºÓ @кÿ÷ïܱÈÊRv±Zâä ·+ŽŽƒˆ^�k 㔟/ïÓúœ�‰ä±ÿ8bùñót@„61ü‹“ÚLUWL÷óÛÆ*«ùrXUu&§€Û7€H“O-ŠâùèCV‡G¿ÖuÌ#C-^ÕT¥Å8cùªªÜ»Ÿ™j¤¶çñÀ“jš%v»iaHtùÓÏÀ>À†#ýxï?“†ªŸpð´WpŸ¢@7ˆorË|~�°]…„]ÕìûŸ‰Ù熺¬ÚÇ}’8,&ßžW‡V‰jaÌŸ © Â»ÍÝ×ñ²hÏ{ÞŠßß"»Ó¦ó²R&›‹ên‰wzPO)ì¹­M,k D>Ïîµ&׃R©O/_º±ÅVlð{Ò¤·S{˱™¸X¾2Y�tè½ã5SKNܱÂw1˜bS!Òš7ìŸ.W|ig‹¹…Ô¶öszŽ»sßb¯ú§n$‰½©ÿ˜uöý›"±µÙÛy?Ï»·Ï’Ñ/c#«÷©z–Ùc¹Aìòøž³p»0Ì8žéÈ¥4ÐÊúE­ Õéõ® Æe?Ì(‘1ôÇM ‚ÊN£ý?�zÖØu™Cöaü4ã9F7yöB¨®Z2ý^|æî-ypHYQûª-ˆ3J ¹tŒÙløèM,*Ë:u‚ä3é‹ÿhã´q>ô5üPnƒFÀ¯§IÿÊüpvÝVëþ­¼¯/?ŒOjÈ”Èëâe!#dÞ|¼Ÿ@‘^ä)•Çâ´óSB><­m:#ˆ¨¥Â+·A—[]¨9-ÖÓ¿úàäørÔã`£ÁüÜHndŽ NAúC+í�癓i2Üš nE6W½Á?~>¢'ÐÎ~0µÚ@®ó¿é1›"ui`Jñ|mÀÑÉ:lߪ´›Ààô‰Þx ‰g�ªÈV �Á'‚˜–›âx¤×�CñÐyË 8k&€UäêÝ/ú`oRÐb„Ì|Jý1~­µVg¸hT ÐÚËÉ!…ÞiÒA«!j¢dp¿á羬‚ƒ3±K`Dl6[ì8·À‰üSÿ×µ~±AnW�¿¿§€QK„nnÅ(R¶ZU0yýûŸ B7®ƒsÐëR¦¡DL-%ûÕËªÝ È€˜ØÅjZõíßÛAÃÒ%‰×Î:zøö2®ïœ—QЭÊD ™Óúß'¨œULy¼ì¢Žr¶“€€¢@7qù=2á¼jµHWI`ÍT?� Ä›}Ëit‹±¯"\œÎíŽAUʃÕ")*¦IŠ“€¬9ËÓ3•©/õñº£‰{fë3­õ¤{K2ক8ËEÊØÜUÿJ®Qí_YüÜð½ÞÖˆo& V™a%t2Ö*IÐ=1ÊÏ[qϼ#£ÚýŒ=îÓž«úuB£Óeòb»„Uë< Ö.üû{@äÌÙH¦žñ]è‘7UŸív•^5è©ãŽnš\¸ûr ©”UÖC�]¯r\­ŽÊPg’¡ºàϿ֠ÖcÌ´ ?%%Ö=h…ùšBtxäÑr2ìw¿à»wG*ZmŽDòp3%?Eí¡S=’j«ëž#±'Ûº¿ïâ½Á•\T,_‰ÒWô°9ƒ]ûÔÌò×8‚ ÝÌŠ¦©�1ª/À‘éRñuK¨ÉÍ|*ÂÖ$M')ÉÌU:þ‡ëÂZ×ò¦ñÊ!fÂâLBeÖ,õçÿŒ*¦Åâoü}ðëdo´æN>!”u²¯}zNªã :}t÷î&_ý¿»m*&j:[ŸýóÕÐÎŒ?8²»1 %øœ1ÎM××é+™µÚN åðf·fv庣^Õ(#òù&ë+ç­–cPÔ²ßò垻˖–žæ2úšã'�#ã ߤfŒ4\J™}y»³'- ƒfIØû9¿¼ý;ݘ÷ö dÇÉí¿¸Î.›†�ù¹óRäq„˜�ËqqeVV­®|ô·œƒe³«Eh@|­ÖRjø2ô¼ .)\L§ºÎˆi•ŽvV3y1¶_Óê\Ahl#ó‰�Ÿu„¤g¼ä×þÀ°çR õȬ5ó M÷uÌRÚÌ%“s¾Q@�ÆßÓŽ2®ž ‡÷o¢à©õM,Š ˜œà-´h ŽÊœê? rPõVöµÊ58/+_œ·Ü»Í_L7#³þ~líZU_'[Ûîœ=ÿJþvDÞÛ۾ɑ§£¸IÓÕÇqÓDDáþ‡s©�n^ZÁÙùõí3·vvvý{Ì>rÀM$7ùÇ£kíþ=l³¦½QF·n´ãú«^cÀåO‚çñ6íûµv_ÔFþyÝÿ[8w»ÁÞ–Å)Oÿ-³½'ùôð£ä "<+;éê€ RåoJI{:ºUQD�óüõЦöqÖ„–­B‘ÚŠ*—™¸­šÂ“ÿê„î¦fæ@îÞ€¦ö3V�1TWteª™©fDßûë›Óbeòiþš®!Rùë|éh`b®‡SÂLAÈi¨¨¾�‚(‰œõ¬K@ÌaTÔ¹:ÌVÕq–ÉÒ�Ç#kÛ½ýxDØwÛ‰c£2 Š”ËuþtPÕQ×1ÅDö€Aá9?ÝÏc¯Lòñ§ŠŠŠ °ª‡(€ª,ÐVm÷ø¶kÕiFd�÷YËs5 „Æ Í«>]sDC5tîIj€¤$`gÚ}Nžr;óª‹?}i|¦J ©¯�þÙ!å.f¢ˆJ¥ùíŸ<ÄíjckAœwOî�v��¨kŠ'Õ:¼Æ»¢ØÕ|càôÝF.5lÛãOj¤s»�ßËÅg[¬½ý‰&²šcÔ Ïë D¤“שúd\ºš¾¨ë¸étÁTÍÇéÙ�w™…y£6öõz�ŽBÇžé™°Ò-£Ý+þËô-¾IûÙ}æûÜ[÷H¦GÊ/ C$V€™ÌÙj~TTULœ®�pÓ…È'»ýìç»?…>R¿Z†¬)Ctæ�ŸY,3 ^$ÇË ¹=. î<��³]¤yÁq¥!®²Ö)uÌå=¡¶ÐÛfÞüCÂFO×¾½z\Ï[7žøQÃwi”æë¸¶ÍãDñɨóŽåç™Ãå<¿ÊÅ7¤+.[™%þÅn×?Ѹl‹ëµúÖG_8ÌÌȃŠJMíþ²fÎÓÍí_¡- ?ç¤þŸs”Š®ÂP°{Ñ&Ïùô�¼_КrÍé°P.ì�5ø@jœñµ¾‰äñ±¾2Â?ˆpк߷›æ¯èšèSz„d=ÃÇëlÖ—L­W€eôR:æšÎe•úCÐ!&‰Óù~:nH+šuú½Ê݆²çsôz]¾#�‚g41Ë‚ªM“~ÑÊc”LD§›Žü+à‡Ê £`~áózžù|ÝM˜š � ?`1¬¾d©[‘œ#Ð µúœåA¤m÷ ¡Mc"[*‘€Ã}=½šZÖª.Á�ŽæV­òšEm‚ôSÊEŒW<[{�õ•»gí:=—µ.…Ô…ÿa×;†�(>ª÷í§û¹îÓ˜³enâ�ò,Yн/¢wí§•Y¾«jÕ>ìy—]ˆ7Uxl*?D�9Ï6O×üÒVëÃkH¯ådìMž¦ÝõnºÔûåšô�çò2*WŸ�ÛÓmݵէïød‡ã“ë7Ñë×~°šŸ ,¾…Šù¹Y€-@\úÔ8í/lF‰ñæ s†¸ìqùŸo]N#öïár�ã6CŸy¥ºEÿÆkdž'VaæiÕýö{¿vœ�‚ ª»ježžJ«©3T®@ðGËêŸå÷é€@±Ï•m9¹qW~ï45W]&Œs_N-½¡ŠuëY8M‹í ŸK"?ÅcК"(qþÒÙÛŒÓnOO¿µ‡W‰¢~“l ݨÌG|®”8 SœþÛ ƒ‡Öã>®Yž^ï§žý³áu»kþ~ßâÖÐs\òh³î\óåõi³\0é©jujV¶Ö¿×|}ªE÷|ØK܇Ö`0/)Ý‚çÛ1]»¢à¶UYÙÍ �ŒniM!‰\Ïr{DÒ£eÈKs!•ÍæNc_9QiÜ›î^Ø>>5ïiì¿S–ZM gÉýø )dú7Vl݈‡IXNñè*ŒûËþÌ›ëèüñ‡ÓÏíUüs¨»¢Ó1ì뫯úåÐgƒ0ºµ^õn5çñ|QTV¥"–¦ŒÇ�Ï7Oùýø,=«˜Qª`%¬¢sêëEk˜û‚¯zâÃññPå÷‡n¬Oð~:Ư¼þ<•†›J®Ì¡¯n°˜¿ü´*ÈžÚœ"¿y�ü£l¥ÿ[õzÌ,È�¹_òú½‚ÔíÃQ·¼Tùt»÷ÅíÚºgª ~…”yÕgoœbpUü¡ݘÌÛ³?ä#ŸêX¼okÞ*¿~=Ÿ&MÖ5ñ2¾ü³¼Ù*•œcÑ.ï\;?¶º½¢uY³ê¹·�&¬œ¬•¿HV�„; òœð¥C̵œôð,ì#ÿ¼àÑ2ä�.ù´º2B+Æ1ØðÛ<≨c¶Ï5x*ý Oca¸š.ç»úm�Ưª£s¤=Æ\¤çOggS†ô MÁÊGÿ¨©ÆÑµÀÆÍÐɼ®­¯«¾Ó¹®¨­¬ÍtÕ Ô]êv©Ñ>ê².çºÑçoÌ?‘ó6|g›^˽ïð¢×¾×ä«Ñ¢ýfé§w&ºŠöŒÅd´&)ßçÆ�‡¥Ù+YÙÓ.õ_¡Î[ ÷·À˜A‡<Èðûø˜q9×vw¥èH¼m|fࣅ'\süBÍÙ·'Žo›þ–ÀòŸ0ÞEU£R+�-ó]ï}²u)‡•Ôp_ëÇ]{éªçî P>lòÜEÅ,§dyztÀ×LúMÏã?–ýîçÍΦÌc¯õþ%û›ùçc§ÎN_ºýEë�…µ6Õõ— ¬•Ãû)(“jEl%)îÊG' 0n>¿M>M©Å=Lí�áâ;W«î~c#ïý¤Ç¥×<Á»‡‹“•Æ[äÔÞºž§ý‡>\)õQe‰³Ô“ÃŽÕS~ä8b}ªd¹17|ø“Ô™ÿuG‘JbhydóÆZ1g˜6x«Æ~pÿ f{èÿýR�õd=2VŸo< ×ýqt¿�vþÑún­ýö“óJg}ë+"BÐBwoož×‡7çH%Â�ú)BÒÁVïœ!,‡Ã!"ÝÒz±ÙÐ;~ˆ›yÍ‘Q؉÷Ö#&ÊïÚÝyæ}Z§UN�Ò×MTÞ­sœ³yÝtÓ‹˜Â«ÑkayÁrß�N¹Öë÷]>e ZN%èZ/…Ÿv2šÛUF`‹üÿ­_ûýÙåòtót?úà"‹j“PîæS[ðÔšÏÎì Ö‰ãòµMŸtéË?öSùNQY5ºzzM„·¬Ëº˜úºö‡á„ù)ÞÏ%l�ŸÊÿjh°ÒœÐúóÇcäK”ÑßÿM>êØ^OןñZÉ9OþÑ/·rÉ6Þ}벯ÕîÌÏmûòÛé<¸Á�Lãbú"®�[šl{…¹�ôÂõÙì¬ýO¼(:¯ÿÑÒößûkáEwÓþajùŸ£gkïíǾhÌÍÃqÂSû÷�=D˜ª‡2½”1KÉfÝ>¥D„|?Ó§óë‹ó$ó±0À>F2€9ë÷ß[–’4÷á£ô¿›§“s³·iâ÷¼–ùê}¿ŒëMäu¹·©T…¼Š„>zÖœÝE9\6ê7W{Ûÿ¸¶Çÿ¹­^ÿv�ËŸ­uÎyu—·‡,xôÇãÏ•×é×ï·ïZçD•|æ‘ï8‡y0w¹"Ç{n8�XªüßÝn.x馾ðÄëÌWõ«WS±nìyáx�MõÕOMÖ/ÅjÛHÚDJg:_¾×âü_¬º©ø§v�=\¾·N\ċ½½’ÏTS”ççI÷vU'ÿzgØ4“„Ç|s†WR~é1?ÜØÚøÚþG?dã3³oÇ ðÏþ¿hž¾k^þ£û}ÓŸOl”*ïÄŒx^ø%95u•ŒØ_<í§Lâ�AvûgéaÙèúõ�“d¤¼~DÎ~Þ÷_¹§u?—½¬Òæ—•{5uËÁØ„«�+èb|¥—Ž*·ùxž›ètjÀ­>T:üÃÆá¹p#%�Až&àU³ø÷Oñ›Ö«¨”Žunùu 5oÿ²j}ËOö�öò½¼ÞãŒ×ÕË.è³:l7ˆrà®ËÂüDz]ÈeÜÁžù™~GîÇw¢}ˆ<û¯Ž¯ÿ5ûõ’ÛõQ§ŸRӸꮱ3=¦º¾x“lÜ_æ­_wÅã{öSJUhÄŒÎe÷4æJ€nÅ?ýÛáa»�Ï—ŒoÑæ‰Î\óä ~™ÁÒ±no¼ªà—Ùcù)ÜÛÔýÙ9c0õ‹è\H· k,çbžúûü)ÁÓšË<¯x†ÚqŸò'â(õà°ùß<�^‚�KŽâ¥ÍyÂa,ŒÛ¬[7tí}ãªl½`Ñ`e°5n¿†Fg³'ûüú· íq¶Ö¯wÿ’»�Ý|nß~½8¢>‹�:ß^3–[÷%WïÕð\&7Ú[¿½Öûø§‹ÌyÎ$¬‡ƒÏã1¡™ñ²[]ß»14Ž<‘…¤½W(l”…[þâ˜ûntl1)®ºW„úærkã¼=wLSuª8Ð}$œžM¦(kŠ(ý»FÜ2![_hÌ'99ç�Û 5e¾ó¬^ñúÝDÿßëžþûªóíím3øÚšQŒ·EBnÏ25�ZÜöRs†AçnŒrx÷Óq{£dL_F4º}ôöãi?yÚïÇú¿¼½ýï®Ç´zëK†wÆîLÞÒUþË=ëð saK‘QòXn×X-e¿tŽ_ Ź@Xûñ|ŽÑËîc´/•¬ñÿé¡MÖ®f6�š�¾ãÙ‡e�³>�zßeÏׯº…͹pq1{[>³i‡58¢½–�¿ÃµÎ�áÜS‚»ímpøìÂs#GzP¡=æáD¸ê¼ù¿ÓÓ‡äí}ƒ›[LãÍ@Þúö㦧7`ö*¸¼oôg¾®ùè×~oú$VíãgÞ³Óë_ƒy»¯Çÿÿo_ÝÇãz[µÎ7oær0=_Çe¼[�ý™°áÊ[zúTÖIÍ®ºâ¥æôã¹(È·Â3£ë=û6öžßÙéÁ�ŠÏzÆ÷yÐåæ´�èß¡-·ÊbbZÕ­*×ÐæZ·ööÅZ{á¡ã™Ô†`¹7¯‚ÖÕôÃæJ=årš4Ùø<¹×Ñu–½œŽQTëÞ€*ëøèæ§û€úŸx›ÆˆÁeÚúÙlçYšu†ó&~š_¿¼WÙv~Û V�±Ïœ¼{¾EÍå讫pty’Ufs fÎZGyˆ¢| ðQA¡ïž½+¾•¨ÊÝÒš½÷¶Éz¸ü««=;•äq›\-ÿâX[É�íòd6•óVr ŽÈŸ[äEêÁæ÷¢ ·Íqýx4ªi~n,86ZóþÐ3Hׄó�ˆ¸LBý½$ò7 ö(µ+Û°˜¯É­²½Iüéíy.ÞÒ¿¿B´¯>ù%¡à.çÌhþxš¤¨îËs·J=ôTt•F'åRQFÑ;wÈ·JCNévÝ–f²Î­u®†‹Wâ~JêܺoßRÛûÉ3¬�®N{ ¦8ö[ü U#• iïk�Ëîäjª…ì§ãâ_<Ð=xš šmOSv(�¯yµ}{=¥Qž. lþâ�r¾NõIŒw2[žä¶l;Àóùõ¿ãÛô�»Ã¿ŸS:¥•×o¿‰�pR»õIEÞ·_ŽòæŸá<EF-¿³úóÓ~0å.ÿ{ˆéãa/‘oŽ"ÄöÍyû‚Êo_ï)?ÄEš}Ýv¤%²ñ±×¾ú�?øn¾SÛz¾ ô$æ|jzq¦7yLù¿Ä�ÀAÕµRÛy¥Âå�*ýn¶Õ||�¿áæ”û dÃùCWl›Fõ¦è/ÂÞ߇…›ßþò^\[ç·—˜[ÞŸ¸†þ茯1ÔùÜSG~—–‚e¾=q×òË0 K£:aÆÿÝ'åë5r01—Ÿ?cT�„Hy@`†ñ:TwâvµÉâaçúz1�äüѦL´œ[Êç@0Ÿ+¹tr£¼ù>ý�†÷y;ˆé:3O~Ïn£Ù÷vNÛÊ©M&ß aån[Vé#öVJyò�æRïÅjçZáÈŒsÿU-ÿ¿ÐzÖÎõ%‚ÚKx†%Z|vãC¾ñÔ¸k{÷&NQÓ^›äÚßšËy>õvÇGÉ>t ãˆm6t 7‘ìƒíyÉâõþ`ú‹‹k6¬º¥f«ö�ïbyA<䬹ïП+ÚÃt -¶*\ß1ÜåxÈØ9>p”)@”Œj®Ÿy,Šù¸‰M¤�6sL8ÄžàôÃÚ°gï{³Zi$æ@(¯Wî'ÃÇØwa!¨CÌÑR²{_[Y¬NyC­Ê»FŒ¾Vî]T<‹ÜÖêTQ7˜ »Ø]‰I¢*�[|Ó³ õÇï•Ý,š/€ÊA»>(”/Ù×Ãû”›ÚÏÕÑçüöÄ'å´¯ùõàþ·žú?yËõÑ«¤PùZÖ®ç¼Tùc½Q¢®Nü}¬yR÷ ¡*Á¤0¸®h+­Ë¡…/K5WâùÎ_ýHñú2J±½[Õ?7úØøˆ­Ú�ƒý/ÝÛ!ra<׳©ñû_×9_÷S‚�“4lˆ×C¾qjVgí6 ‰èniSà)W|Ó;#„–?Xuúä;P/¹-ûˆÝzcŸ[6÷µ{1®Òõ/–×µú,S<É×¼ÛœáÆÖÔ Ëó¹u•0c�«´'…Ã8=¾­/ZT/}¾q~Ò@�ïa@Þ�Žv~ÑH?«jÄ2د¶ú#ÿÆEyñä©/kæÝ¾bù‹¯r¤˜Áû=®ÅËWÆýzQLû·‰^žÞÄ×µOÊ\‡©Ú×ê(½%ì«¶“ub9\2l4ç$l—»!YÆ¿AºýÏ`Úaž—Ó^ãpämþëìîâÃÏä;óBãªÛÅ÷-_>_ŽïÇû¿X¾ÿ²œRüXõñŠåÅízÍïªo÷½ýÃ{¬'ÓrË…Þ~xÏÄrŸ®ýñõ‘ òs �°»ë‰�Ä#Ú÷#¶ÙZ÷nJc£Ñ^îPþ+¯œoÌýBc+:ÙŠT£fáý/œR"i±MM›Ÿ/s0„‘[¿·ú6\¿=%Ó2ûãŽ_²ÄY+ý¨§}ôè*0djÿ!<É…Ãé¹ä�$u•‘OggSÀ“ô Mµ^Áµ¸²¸»»ÿÿÿÿjÿÿÿÿ&ÿÿÿÿ-tû“†î½ÐÁ^5ÎoÕ?Êù÷YY~üžûâ¯Èÿýzï|>7V7bº}œûݱøeT«õ££¦¿œrÎÛFO¬[«A1­‡xþ竼o�µLãÌ%ï8ö0-;5%‰àCsVµ»¾BzôªîÊžó5tØkË›»¼áÔÿýú­œ2ÒÔFoZMD»½?þ0®ˆj>LI§½LEÊX³+Œ“aÚ%UÐ2ÝíK¼Ûã—)×jyfìwð+Òâ¬}¨¶ÝÜò |ë Ð= ÎWjl �z¾Eû—Ãw7£¹¿mÿŽŒîúÉ¢”oï¶Ó“.ú½ùÞ:·Fu®_ŒXxê�²=*×0ÜcŠléÔ{5ðšzC¨+{ÞóB�ö›ê*ŒbäDRòùð¡æ™>Jáj¼œUýï>}¯._ô*ü±Td ¼Ñ…" ‡žø}<¹YM&NT‰éÏ½êŸ ÊUÞ—UWNJ. —ݤÌr×�ùž¸šG8U¿1¥:ÙvTúâ ’6£Åqg©{/}—^�¸ò|¸û›d Ôëù¿5žÖúĽ^^�ºí_©ûñ?]þb™ÆÎÚõ�jÖNRæʯüÐrå^ëá™r¼XÏ�Ójˆ5=óó¹ƒß›Î‰–ÂÜ€ïcæí"?{m©ƒªŽ«åaÓ•_/mù¶8Ôy“³>F�Ì…™ç]Œ|“Q]#w̦,çFÁo«Ïw`1‹½U …C’éâ�Œ §pæýÁå•Û»àƒýžÅƒ:¿][^£ýÖiñëøôç³×—ÄúršÚÛ|Y$Ü8O÷‡²�ü^q,‚¥ ¡¯ ¯=ζTa&�óŠÅmQ€ÁšÍ~%™Špz¬÷ÉJ’ùÙtìÿtÃØ ›¹É«ì‹é)í�.ïööqùTg‹©�gíAÑõ|´ùé“é0R*2Y•d´úô‚£?™0³+58VÙùú¥˲ò“?û¬ „ ç Ô,nÍl‡·9L@Zéãݽ>Ü}þ×Oί~Üq~Ìòç:Ò[Þ}ˆÓ.ûrÿâíÝÿã_ÅtkC&‘Mó-íí¦ž™«;ï†ÉTŽËø[…³…I?]ÎÐòÚ7¼ö«XãŒòÂÃÏó̾gõÑÂmp­§Ek̼!Žý¹�èŽr�÷Rz Zu�¾’8 *ÌÕÂ\Ð�‰ÎÜ0RÄæžuûëg9}D¸ûu@N’3C:|¬ipˆNUÞý@:„ × vù­x¥Çú â,׳à:âÀ±v¨§'Ÿ}íÎ÷œå¿Õ°ï?ïîÅIkƬõ¹˜‹Nî{U×TÎÊ;ëýp¥ô·fN—×§R 2šþÄî'7T(u/«ÓèŽD«k3N�ˆ‰V½reÀ3Þ4{ÝŒQ„ôí‰ábíŸB/ɦk/¿uþÁ³=Q•Ö 7óy _9«u=žÒo]Œœ;ݺú|9ú­ýü~ïGÿeOdò“3 ÇŸÒ†×YL/±:¡ß~yàöéòñ>úñÃp}¿WcæúÛ]Ï"cµÔVn³ßÏ´ÏYF_‡.²©ˆϪt|‹êm·zGé8kyÃRRr óÖH~ ^ï<,M ¾ù-ô÷»?±£l#;¬pÜ¡`ª"³ø&*䇀ݗGõL3 |"û›…Íð³<èÀÅ¡±Z‡"^®\òzþ˜e»¿sì¹pÀSgM‡‰næp#]ünôŽ š\ÀžHÝ*$›FáÊm3yt¤¦6â–Œ¥”ÑÇGñ:€»·î‹óÈëè‚À�µ?Þ™ áÊâVÈÈo‰»µ×ÅK¢°5<áæÓÿ‡±ä”7#»\ÖÍ—¢_>óá¼m7îz•Ajß&…Ij0üC´'õ±W5$k7M�V%£�†%õº¾þúëÝÛ„†6åU"‰Hýñrè%—ûЊ¢( ¨¨ÖšWO׸Î~Z;[@{H) @�žŒ{4EWÌu¥€ØœŽ~ýŒÚ,;rí €ˆdôë?Èl€Ã¬ø’PDÍÒ¦ô¨ðÊG^ YEÓÚ0Ç>k‚b¦ˆ@]ë%ÔQ•ƒR§ŽjêÏÐГçVÏá*匱,¦¯1'à ÉÜ¡ ˆ"Rp6µ”¹Ì˜%{“Ð ETÑ¿«®aˆxh بVk£øhóÉë¾ýå<é³,×ë¨*H Ü;Òâã¨+Å,/ªUP R×"¾?®ãó�©ª4¨VÒA €‚(²àS£~Ð sŒÿ_||E´t‚ƒñ­˜üÃÅÈÞcòXùg¿ç&ÀèMÏhy¥ÏYÜÊ/Q¾nõ¿§ÍUÿdtñœ:uÿÕ –Í«IPGt–¶’޶�Êg„53Läß8Òôº¹ j£q¶ž]ìÌ¤Âøù?Ò�ÚY|¬Fv§µs$òüðl/—LŸ�yéÕ~G})¬‡é„Q¾áá¦È7S PçÝR§kxI—åRýfêÞø-Ée†ìÏ3L¼à’]ûœ\øÏͧha³·‰¨ö§>}œ»ãÙŸ -çTQNIr8ŽuìViåž¾ÝPø,ÖÅ„*®z@êþ¥ð|_’©Zn¹¸(ìÈRxa¥Ä«‡m¯§äïAÛŽJ¦D]]P-ù¯#ã*M<—„᫞`ãúˆêÛ»Ìd“­Ñ¿ÕÙ~,ðGä± i]NUŠŠXUtV$Ì‘DIcå–[¢<Þgd|ÎÞ"³'l4öÉ÷{ß rI¦>Idƒ: z­ý÷In8uPü™ókè/ß}(+ºÒé áŸCXZ¾óï×>'Õ5µ¯ƒ¾$ŸB5»ÍJ½¼úºT¸Î›a j;ôÃÅ$8D¡õÛø„èÿû�yl³îv8Í»²>_F¾CwÛ?—&™*w]wí]‡ïë’š]<ÕïéTNñ;Ý[ß&Ù¥_òÄ”«, Ñ�ä×ôúÿ>ÿóúº¡ÙWá$ëß°3Ïè=FQV&ôÛgu¿Æùj³w+³;.D¨ýWTæh ¼F¥ìýǤ¿ð>éëä=Q…ª—Èá¤>ò7„mZ{N:Zì=áõ^?óí7v;‹Î ¹~x´˜N¹R/ü=åÝÍE tè?Ì"¯àöÇÅVXÞž#rü: `6‡vA ¶E…ñPæFi�è@üÝßlAUÐï�„½‹âϤDá‡öHþ ©-…’t=€ ǬW?Åun0›LQ ¼½t ‡ÎäçY‡/_ž"[¹ÿýmÊȪŠÔ¹\öêïZŸÔàþ;˜ªþ|Ñ�ûgŸ[é4 Ó F-"jå U�ƒ�  b¾\LJÊÖ]Î Š¢,@(� Ð-¯{ÏqD‘kæ–³W2*"î2K¸f¥'–I£_Û>ønœU öq¿šy)H©Ixp$b2éÑ� t%À!ÜÇ¡¶ÈSëÝQt˜£JÎ jf#]âp2®í{Oì�/üVbT ˜*'1�GÉÏ~¹TQŽ  ïù÷§ÚsßÛ=¦v´,†ykún„+óÙ§öÜTE€U~\dä!�„]àFN[dM£ (Ã建/”Q« áçsÙÛשÈñ§¬Ò|‚OØçŒ¾?œx�L!•ó‹\ÞuÆBFìgXÛç«hëwå ;îyÒ)Ÿ—6.Õ¦aIξV‡§X5ÎÎXðÎ×6T6ËŒ�™}EîW#qE_ÿMÊîcP=óké#±:ƒ”5¿5™/Ì›-O¬nŽþúJ÷.j½b�ÖîêºNhôxÍ̤8�ê? ˆ(?˜�q!¯¹ßt¯Ë­î<&ë4îJDé+Ã6¢‰÷˜ÏOŠ3Õ\˜�ž#¡Ý=¹»Ë†øýÈÑSÍÕÖqDXžU“GÚýÉä§ÿ¸â-y5ùm„ú€Õž.¸×íS£Äß=uzj—4Ž™%]ÔÊÈþžtûþû«eÍžÛ$5QÕ”:ÓÁsîµC‚~í¢þÿZ/&BË{9M·˜Ÿ¯Ç$�Kü7€GÞ3k ‚‚Q£­ŒµK(Ÿg:”ˆ…÷Û+:b|€T0SiÂqŽáda,£P“Ùq·ö¨±{Û& Y«ñÄWtÖÊh³ÚduoçŒñuþ7j�b•z>*꺨ÔîO� þçho÷ ÝŽ-§ApJP%é¿u]ƒ�¥µ�@B†ì„J°—¼ËŸ½â=ÌàU8¨¢ÉeßøÐÐ×_8Š  ·qN‚"ƒ¨¥w ÅªŠ¡2÷1€è?òì^®TPDì0‰"N}­UÙy€šš§“hÅ;€¤s S¥ÐÎ!PæZŽg–ZѦ~=)eˆPpÀ…3Ý%ÏÕ´ˆò�]UTÐ�Ü÷©EõÑ]EPAËÌnÙ‰K«¢'ûòTeÄD�zy7õãx||ÿû;€�±üäBjV€î„Š}~.QAPÉw­2t°Šj"Šv'zv�dÐn“(ʾܶ­¶v¾Â2þû¿·"QÞzỎÖçcþæ=“–%óóÈÖE9MÏ2dÙ·�R7£$‰‹{}Ábf–}QºLß­¶›B´2U°r:‹ÇÖØï‚½±×ߡ€ü‰µÍ…ùoÈËݰýï´×µ ófR_r��¨èÖîß±ÉÙñO-ýË9R³-Ëþ3;˜5lf@éV�¼¨ÚsdðÕ—ÜýŒù~è�Ôoß\\´°ÌÖ\þLhÜ Åÿ ÆãÕ¹!úÛeQ >*üO—ÂŒ»,œ1ò�1t´TDõÖÉGC5ký¿«€`ƒk®~ØÖáí`¸¥³ê§ÍöõOä §ƒNÑV'ŽmrVüf˜}×LlÉ„BpTãóœÕu¨ó\¶¯qb&*ùoëP“_[EšhÅÐgÍÉqòLp‡ñ£ œ8É5Ú]„ðþ ò«ª¸�Ir5ª0J2hA’$IfÝI%Je?­a¡�.¶è4:òû#UÙŽš"ü³ÿ#à¢65tâ;ßá4«Ö`e1¡«??Ѹ¯Áòõ‰ÒÅ@ŠíëלÃÅòÇCر掅G4Ù�rË¿ˆÕ…AU5Nj �L³9hpÝý©å‹&€.ôÓ×êL!Åö# z�>êÆu}´‚s†7"õ¾{y¾wtnáð]éÊä�V•Ъ ÍjÔRç¤rÑ‚UFnŠ£ÇÔYqížOçÓ(¨ 2/ïl'VÃ:ÎþÛT}KŸˆ¯ [#SxŠÐ Ë0Ä â ’üKmÁf¶®RN¾Õ?pÔß©i(ŸgIIqZ3÷xÿÚ¯“Q‹ÑØ®ê8<Örky]œ‡·)¸/øúôìg\¬�ì¥çjÌŒVÓé�9üž]eµÿµã‡½´³ÌŒœøö¨P l(µø¸OggS£ô MöOÔÉÿÿÿÿÿÿÿÿ²ª¥¨­«±¥˜—ÐÍ^ lÊ=½>`SA® 6ô ~ÁL˜¹Lzǧ׻Qg’5çߢýçó늙ãÆ]àÍÇX?tK[ ëøÝlûT@ ¦WĽ{o€�e›Ÿ›ž˜Ýç¡èË×¢AÀ÷K'ôO{ÑÛ5Ä¡È�¹7×%‹$³ÜýÍuó ÞÀ›$«7eeýÿ:⧇^WÅJøy@íªpÿòõjúDK€@…|ê»Rµ%‹ää8“ôÓÃ6ª‚jÿ{Ž"*‡ßK71y§Ö÷€‰ƒù‹ @¦HÌKᨪ¨JýÆ^€i.QU’ì]* €�.˜$Dê—À�X„>Ê•ìþûñû*cšÏ§Öñ<èAù¸=sGyË¢WËÆõœ×ÌÕ¨÷†±Ö‹ì["´€¢ˆÈ•Œ™27i1LSAÅPÓyõ19ž `ŽU Í= ^Ú¾¾&T�І¬³Û8e 0 Ù²Pœ>è[¤þ”Fš; ¹Ü÷à÷ñXËÓŒ6-»+;[U¥æïCÌ|'»Aæ¾Û0ž;Û%6tPKI� Ø~öí¯ëïiª»×¯³ô »ËöÓþCIº]œ<êÇ3¦™í ‡w ò9l‚*�l˄ݑ§Ñ ¢�©Ãk\#$Ͳ—¦9†={e³nw¾A‘¼ŽÞ(~Ï®–D\u¸ËÈ_øØî[}º¤³¿ÿB¨æU™Qé¿Þ| ØæÙØ<æl�ñÚ僟õ�…ö Š É|z¢uëÒNp�z¤<:kÇRÇÜ™Bˆ;Ž2þ¨^‚é‡h<òÔ©ûªß#VÉè-&o¬Î©b€é˜K R%]OêE#ÄxÈØÈÂSÅËoµ1ÖÄZóóŠ+G¹¡–q¡ž}L ÞfuùkjßìGly½ïr3ðP�‚Ôà©ÓeAHj^®Ægy¢Q£ï\=Ã9G[ Öb%£~cßCžS.V§üö§oÕEëÇsNxûþÄ©¾ë¾¿Ö™E>´õ[ŒV™À(û]×cHÛÜ™rRS#”޲¤�x1œ‘nt_JX¯(MŽš‘o“F!MŒ_Ìø2¨Õü†ïx¡&òR}=be%˳ˆ¡Ðô„çZvýZR½ªìvÅhÒéƒýý—ÍáÞú®X]K“áB缓"Ñk)¯ïÿ˜ o®ŸòkÓá8ËéáïfË€\}×n{�}ÎËšw�×GyÇ­-ªñ:L×ô½*TY–ï!¡¢±ŽþÛ��‡Qžötcün`P(vï‹Týbøt@7Pÿ¯ßÜy×zQø6ìÊÄll…�x%ÄA3 'rÌM̬›=ÌâÙïÏUÞÔó{•¾¥ÖüÕþü·ÃÿòV¼whã�2óú°¿pàf›|Õg+bv6rgêýz¯Åê¿:??»<:l]svàϾýéóÖ·i”Ñý5ê2­¹–),×ùmÄnÛˆòC£þÅÙÛh_Nå6ï6[® }\?û|x¼� P¥;t–‘oŸµk­ÔÍúù¿>VÝ”kzþ¢Uåù‘U*dFH÷´Ù‡ãë¶ž_/Ѱ¿ºiØ ùLQh�.Ê×YKjT÷t#¤;¿ì4DÐ}ÄA½©QI/AÜ%nø˜m*Õô¥Œ.ŒvM]Ž|ö…FLç¯ÿž�f³.9}HòXÍ}j€÷Ö"®Q1E¦I5M'«'«Ïç¶æ$Ì#5ÒÓêyxûŽÖU)à.¹¯�Ü¿%óqRRºÖîNoc•Çíš>©ÖDEùre‡˜gq¢C+8Ä2O9Èó¡-Ç1k阱 £šIÃ4„ "`NWóùù·MJ�¦®�°Ëõ¦ÜqS5cÁ”‚ެjªŠŽS¾ jÙÿÉ£) wZõ——>béWÌÔÆKиË߉_´¶Š|õ<_ª¥|ƒha^7l9hÒ¡$0¸BŽÅíóÔ©˜(OmˆÅÓ^œÈÝî‹OóQýfuU ‚Š>yõÎö�r_±µ§…yÙü0Í`gºÓSôÇciwx�2 ü8“”¤82rÇ/&%5áU<ˆOM¶Æ›Ù.% �•%@©eM´Ÿ"[ßçŠÑBEü‰“¨)I,æTæ�Þˆ>Ÿµ<=xÂ>¼ú]{ž]‘WÌJ¨�4p°~_ØvÜÂ7Ô«î¸åCäv9~¿{Ù­:S-˜êwµggûö�½sîìyIú g“Mó8œí0�’’\�ñ¨;S6¥õà�w6ËY´ü(«ÐëkUîqÃB—˶—˜QeiØ�ißöÍÙ·nßþ»Õyîë—ûOQå›Çñ~�–gƒõuçÿ]êŽ}œqá>ÿÿî{?Ýu~ïR[¤S6Žõ4ow³ÎçK}Eü—×í´í»^²´OŠpî³då–Ëj·‹÷ãÄ·eýèÕ¯Z—ñدsöWñœg÷òï½z¦5eMm’îj=³Üæ¨ê¾éÎJdÝ3²2õ&5ñ´ÉPá8= O޾­¼ûò]ªg¸‡ìék\ï�ÇZÍ‹š¿\é¯WH¼r^n_šuá²\õÿÍd®W=6²Ð¸^½SG7óðfo3íÑÏøôô¶Oñ*^íÙ·[‹çRØú‘®“†d= Ò T8Raž”äÿÀ¡…vÂj!öxß#]NZ«ù�ú�·T_sqðdô»…œíÄ:i\îìNÆvèP`»Ë$î]@öÚžôܵ8¢½!ú;¿ŸFT7ecc^úðªâV¾É:Ì£œ»F» }œ½W|ÊEÖ-÷Ÿé’†ÐÛÜ}¿Áôß·¸S|oFK Tí^™‚™7¡ þ(1>xÞÔØzh¿úúj¹´\í�yòUk^Tìß’åõm¾½£ýÌû¡CëýÕ,KýA,û§ˆ®ïZYîõê2½ÛsöL=t/Zøìð…ž�o1Óà²×Çô³Ê÷­†åÒÑN³ç½¸¶Ä ÿx~í«”yBØaœ¿WÊ =ÌžûÐÆã}ßüUl/2  ë­O�Š>£Ò:=W¾òñˆšt§…qK×…¿ã6S—€Àáš}ðÉ¢7¿Í‡Q~ùëöó‡ûÄ[¿|�Íü5ÏŸ´c¥þøë1Gô“û‡[oQóu‰—ûŸ=–E4M3ólβ,E,7v)²S±üˆ0v¶ts^ƒ”ÕiîœÞ‰+ï¯%ûYR�ê­ÿ:¤´êÖHøç.×µ¡ Ëœºö]3Xi,>ÍJ}ÐÀ&�âõœèZízÝbE­$À?r—I>tòz�°\'éX£»Æ@RE‡ÚêküYÑíù…ù/þ>[ÏÇÅ/ÇøÕôÞ¿|jRxÑ?ìÞÛéõ{÷›Ä¿ýòRÙâ!NÏyûÑ{´ìÞm5ÍcÜ%hêNÀ‹wo‹¯Êhe͕Ҟy„òÜñ\×ôsÕ¿T¡n¼Ón£ÿ}¬_gÂ~Z«É&“öBE{_å¿)ñ6ª]ŸÉtã]—‡T’{”ò¨(ðÕ¼Ýß Ñÿ÷T gåÙè%Þ�'3˜‘b™%eôiöÎדß.¤ÏÛÿƒ±7ÝÕ:ô“úÉù©í~nþú/}ÅÜÿókÓð»H(ÝãbÒOýH èJ -�³ùÛ�:{õ ‰�ô~İ÷WÀý¾v?Ðøtw¢›_¶v²ÏŒú Du圵Ö˱N÷<·@£5Éì³2Ù~<¯°v¼wåûì¿«oš¸BÿgÓ¼©Þ«ë¹üßNëÀu+DölöP#Rì¬v\Eö"¶³…Ç¢öê´Ì_Ÿë÷ëóÆÖîäèäýO;]Šþ4åò6ŸëùªugþÓ÷®À[$tóxÄ kkqòäó�t@Üöü®O)Nd:c~l\޽IEëö~6_~½âT绥ï×Vý{'?7zkJkA˜[,hç@ll©÷ÈU}ò1ÏCì6igê‹ùÄÉ/ûÿ+6Ÿ 4y6` 2n>wIÉŠ›R7Úrq똢µ±þ«lä0ØÙ+uJËBýæ6NÑõgÀ¯7jÃî ºaòê{�{Ìžò+%RõÁw»psÅY—ÓQv ìŸ)=~².„ªxÐ%íŽ:Ž�< øõ¥„Kê½1RˆW®"„êܰ0ÿéJ¥Fž=µŒÀ`~ïüqY¯ÿ§ªðëµn<á"™Ë –X­ÙÎ]� �ñÊ…~ì^ü¥\ƒ¿úïíóFµ—òŠ~ܾ7¢4éÔM²ƒÑ=þR8Ö_5ŽûøˆÆá×G ¥½!m�� Š@ö#Ù×xnµ:…^G'7¥Íì°²óµ|Hµ—zöIøôXî’"pF2ìL½Ê˜¦VX¶ÕcƒŽÔV»y??=B^÷½Qü×NVÓ™ LS¶�`¸Eð<¡¹$¸n¹X›Öˆ²_½Ù“uè+â}y¦·ÿw]W½þöŸžV�ÿ¬ÐÒÕ#Ný©%÷,HËÝçyžçyvSk­–ÿžÏçÌ•²¿áÑ[±ª¶’µ¢/®qÄdB[x™ë�…æz^ª~Éõ«´ dEÿ€Õ¿þ;ìÌ4Ü2sÿZ¯Ö¨l¹¹æ¼?GÜZOhúÜ¥1%5æ‡ùaæç2­[º=ùi×·}zöïßãûÛí–nlÙÔyëãóøZ‡Íþzºö_ýÕÙÏü7Tsðvþô^ç®s-›M7ºØÖ´½Ç¾éMãOñ~M­ôÙÃJÝMÄÛgm½Ûú¡£¡»þåiMSÊÇ~¯§ ‡w÷˜æ·„¨QåHYšêñüy½žŸ×Y›GÑw�Os�Éÿ»u;ã–ºp#Û�°Rã “¬=4KŒ'´ WzŒØ¬xøð?£Rýô¾Áæ³ÙÍj NDKÈum~ÿNâZ5ãÜèaw{—J:á]ñà¯UÜì&˜)ìÝ›ÚÞ–<;<66¹lÿ]°>®ן÷Õà>OggS@µô M©Ò5Jÿÿÿ×ÿÿÿ0ÿÿÿ’ÿÿÿnÿÿÿ¶:Xô0eölÖ�™Až³Xšþc²_ä”»÷ßìÍõŽ<�¾'—v\øôº1�5ŽŸÿßÐ!NÜd<9úòʰê˜Í^7Ñ×ÊzjýÀWó³;ÈÞ,µ_}ÐB•ðŸÝv|mH �@4�àh`AÎÊÉ9bçwðz'‘þF7``à |ÀeöšÁ±ÿ¬`Jõ÷ºÙÝýÿÿßn Óh­5€’FCØhó’@k6Šò¸Ëú¹ü’œàg…°^_}Œ�H¯_ܸ®—¥š|×áõª#@ÉÝ®w_ݯ  š Ñ««¢Íé¶\_þ8Ü>ë:ùî>TI´Æ~™7ÿâ9½u¼•µ×[§}V+Èó&¸x“´Ón*eþwåAþåjؤñôËöÝ|.Ïhs~þâ,·;·M7Cs ?A¦ñÈý7;¢ÑØF :~JF¾ßJ.@Ln 7Êçœ- Æ}P(ÉM{�»‹5c`p——rL«½yßË¢‰'ñ_uŠk¦àà"~ ñ±\b.'^YœÔ%ˆ´™) ÂÃ$°sfbþw ìÕœ$[>AwT«¿¾Ô{7x?Ùί/܈ ÈËó.L ú£¢¯è˜ÝQ\?®„œ]y…þFß`A_@¾yܱ˜ 'ÎÔVéŒ#/¦Ñ_Î%®‚Š¤è¿“?79NLŽw^OÌ“Q�ÌÊâ´•žÉƒ'Øö÷„Ô#[¨Ž°1ýí— t{¶´&?žþé@äü“©B¸€Ì]ï¡Ý€(Ù°¼ (>�h D„²”"säMo*fK?ã�:ü2§…àOþåœ/Ч´\/ b9Ígßd‘ ˜SUã7Rƒl�3©¾åžçËçµièSDW£ÃËn¹†*ÊKn?M>9¼®¼+X�à[†3Õˆçv�3šG€©sá¿>Æ+­H‡yVp;%mÄR^O¸ÙÌΣ‘ËlýûƒTÌ�v´@„6ùÏ`Jü°ðEqŸg'‰×¤ oÈ1�©÷‚<åòÌ$o×èâµù8�ßÂ^n’O%Ãê�¼1ºÜSÈÿýkƒ…Q’>¹Ó"нx{ÏZÏ*wpI¬èš·6ŠÕX�.{‘hi÷Ç<Ãj4Ú"fR ÍØoh…ž\}¼{´{€ÖƒìÁzäv3œ[m¸ N<¢mˆ8;øœ2¦+Ó�c{!ûÓsš™Ä/ªÃ1òRã@í½+ÙeK¦"!’ÀÚõwÿqŸFÅŠ!Æô2|LþžAÇraˆþ'q@.š{os>xD›Ö[;çÝ”¡m ­ƒd^­ùÿÛþŽ{R¶t×½Ú[±ðâ¸}ß”ã¹J+nƒ®GŠë¹çŠ(q§£©›TÇ „/Æ€1ÿ+Ï’£gìùñåâYs)ÂÞ­Ä-Èxf¯�áæ_úSq$j>ßi†¢šEdlqˆ¨eƒÓwýbý§~fLVÇ=Á[ÿ³@¬Gäè/"«wtÐ@ˇsƒè*R ïJ`)86ÏÍÌÍH“™P ½ú¨|»å²i¥³Bz Ü¿¹iÇÛû¥eUm OÞ4fb³¿ãx®AhùásÈ  +YèkïñìöZ!³ß¬)­Ì`@#Ð[ä"OƒS«¹  @’$徕ٴ£ÇÏóUY¢�€Ö1‘·£Z¼Zσ÷îéáO¼Ù• Luþåo�¬”Z¥Ü|$„†R4’ßâgRme®>�º5¾oûÒbgªhÃg³®e»˜Þû.ÎÄ\=Bð¥Îïêønt0p�™ˆH”Ìr‚Þ˜öQYfW$&feƒ±À>YŸön¥Ç„L↠Ý\›®­ç_ Òo°kÀ¤YÞ–—*î\œ˜üë¿y„dßì�ãþxÚ !!Jº.ÂÅUÛÞ6I¸Üs-^�Õ«N½¯W[g«v]¦Ubý|ù_cÓž�±Ý�k߸§ü³*9u5ÕÀçýùŽýg«üúÁjc†ÂÒLÓ¤óuÐ=FhšÍ*¾ø4ó<Ö|#41€b“*F… þ(ìÊâʦÙE¥°Kæþ´–m=Å+©‘Û:R –�²»á‰9.]ïTéU$5ŸOl­ €¼j* q³;hý§ÒußûNëö@.2’Ü->¸¥žÞØÍ3ŠMíýøH� Õ÷áH=ha!^Ÿªâ"T"Ù…JGB­W­-Vwá9¿ÏIl‰&€<Þ¢pÖ§ks¼€îqÙÿ¹Té0Ýo_ü @{lÛò3€øž¿§_²� %P ù0û”´­_°ä 4nM оï»éên°$Æ×À×weB·Àû�[ÇPd5ß”Z$^‰èÄ¿Yìº }½˜ž)O-Ÿ"Öá�FƒWÞÞ/­Ý>ù£i¤…{;=äøá ¶!v’v“›ñúÝS0¡},äºÅwãâÏ?ø¨Ï×iKU˜¯ÆzLѶn*Føt(gÆcݽ՚Iû�?<@=¡¦nt¼3_åŽÇ^�[ÿ‡nö¦'–vå؉QøÉÃþÍ«3öãW½�ud©¿ÆŽ=Qªƒ­ØÒn&ùJê¯�©„dkÉuØ»Íb"•·�ØêŸY1|%}ä¹Ý(B;¶±…¥€ýö ±¥R­ÛåÒmèªÇr G`áºX4BSŒÀ©“W��öë.áò°Æ™øþŸáØð×™ ôÈ'DbìŠ3·Ñ‚²L¸�O²5 ) Ö27)íÕkU¦“ËÐ�Æ€1À¶wÍ8ä(pÜZ7Â^ù±ÑÈGd€�÷ów·Yõœ˜ý"í¼d³ wƒŠ!oŽ£Æ Ü@ó†]øhd I"Ķޯ�mÛËCªûÈ.<²JŽ*rvæ¦ë~ö­8í¨¬ þš�åpZÅYQ'é#¼ÖÖO¿¼ØI”WkC3¥I—XS§ç¯ÏÊä�öð=«Ê¹¾ašCtû'u86Qcúpy^¿ßÏI�ÿ  ¾ßUv¯€ò4?WÛ˜¿éXàî×@o:øÊñ¯�üùY@¡ºë_. »ºÐho3ÑfiòOzB%%çœÑÞ¡œ¦¥vOòœ°'r¹¨�Ú[�[ÑÂ^½°ò³)/RÏå2Oª¿M˜p^)\”)èÐYYÐ\éü´²qf‹*ª*;c¾Æ6¡~F'9]êÓy¿h@S³º�6 Eù #€'úOj=Á¡ßÞ ZgÎV4Ž/Ù[÷éš íåxTm“(·¸âW¼:³ÿ%À’˜Œ`Þ@ËBDŽêá]µç½Û^ƒ+ŸT†n™8ürA~Òü­äæoב'Y¥Pˆ¿¹7À ºï D4~{á€EÖY,‚(�áôš@4?jæ�(€@WE`æ.Dj@�2Ö—˜ÏÏy†t#ˆSmà‡8]/ÁéLÿKVên¦xÖ^dÒèÕË-rU{^�‚JFÞ¾mÙ¢“ØÃš�ÁïWQ‹¹(½„Ù—BUEAÆìÁIà^�÷r›(=ïcLŠ:¶ò¿¤ÊAjIlb²Xõ?]Læ.·�Ÿê­T­º(ó¥ÒšKØ]<é’¿[uËý°»¹‡Q¢áÂúÖŽ÷Ž$k±V&õ¦Ã4†ßNP³Ã„ÊþØ£¾s>lÙß݂Ԏ½û²ÿsNÏfö"â·•ìÓ/Èm?Þ˜HˆO»1þŒQøÇ˜kç:E]LO*’+ˆÓã.÷Ï ¯ŸI—=ÑØuÛ[8�êÑnõ(ðv#@«Ž%ç„ÚÄ&®ê×üôa"; ß»ïß¦ÚøöLú"ñmXY€>)…ã¿^Kª�þ—5Æ¿9dˆQ–1@€°>®mª¬€$�Aß_ O׆‹…Ü«¿ÅªpЂŢ Oïƒ °³#^µìA×NÂYH#”—Nd�Ã[Enøð„­>‚ãa @³Æ÷ϳ£AðádÊâ8¹8O“¯š‰´w“ΓÿD’�†¢õ”šØÿWBùù¬½±ä„.òý×òÑæ�ýï¡à€¯Û3úÈR;îàK'({¹¡PÒ†cÓß:;™eðžC-ëo“—·.í‘õ1ïsÃb�•ȬH¥ìDU1 ™ÍæöØÓG«bõî6ë´íŽË�·÷×*«e8ʱl2"g]ZŸ¿ŸCa‡8lîÏÛ*난W…¤Æhí’r˜óoNõ½ýH&í‚âCæ}Ütóc¼çy¦ùì$Ûýüôü}ç¼ä ¼¤òeöp³IP”à$ÓTp‘6Ör鹘¥@Ä4o(O«K1[ÛqÀà08Ve;Œ´æË¯ß�NÞ”=ŽQ@ˆmU€OggS@Éô MTˆ¡ÿÿÿ³ÿÿÿ»ÿÿÿçÿÿÿàÿÿÿõ)œ”)Ô‡ ¦RXÑ’˜JšÖY‰« µÐêúòuG7ü�Fü?R9—;‘ ñ‡fBâÙÍ›|ó«é¹í)4¨Ñ9­?[ùeÄäÁ{ø% c®; +m[³öõ¥?�\'`ݬǿ�ÙÄf» Ê\?TÞœNlEe$;j£}�މìçw-êõãoöž«‹ÀágÔ/±þ«V¤ $«\»O좯Á¥œ!t¾¹ëŽä\À>Ÿ_7e®H�zFS®¯`�„a€z÷O fÛ¨�Á�6ï+¨¤[ï¿L-��“5Ì:€Ôívºöà³FÿzÕò) ò²–GÿŠhÇω‚ƒ¨kCœ=æå¿Ó§A-×{l?ýzf%‚ê<îî`ЮY¿áºu¿[|€ã;uM­vw9Þ!üüHâ±¥î‚WŠ~ Uc¤FQúàká8 â¢@¿!‰Ý"¤Õ¢y¢ƒÕ÷êa�8JG—ʰÛá‚4l–ß³÷âBÈNP~qÝ¿gOÙ?o‡ò’áØÎÜ4hÈ$©½ðÐÐ%áæ™$"3{¼kñǰvð�a+`Áëvé 5‹k^ˆQ7øÍ›:b3«0¹ƒlÚ.xksOôÖLœ¥3%5¸ã�¦þn˜¯KÅòó,móËÑhÇyõWqí }ÃXù÷‘O³Ù.ÞY±¢¦áŠÙœŽøuå’ºìlÒXØÊ38'‰è G¢™sOÑ6�i¿Œ´ò �QCîMn‰|šÌ >p5ƒ-§Ûc3¡ï„?. /^Ùžx3êŽ_=ÏÒŽ¶ùFä)!btª’ÕÅÄz@sS—¥‚Òð3‘*":ÏúÝ>×0*`yþ—1K�p˜@ø®qfb¬1ÖÎ7<–Ùow Âá�ÜU´x£�ÆUœÎS’ ö²!]½ò=È}W=|Ã;ùßè¤pªÏbˆ)¿Æä6çZ{nÀ?9êOF„9€ÖÆ;ëÈî�9€[ìBóÊ[rq*%}ïâ̵_8ãï7vY”¶þÝ©X³§jNUÎÆk ¦d­º”KK°p‡Õ5QàaÉ1óá;cj˜Vš6ëR» R±éž¿W<íVéë™úØWÝ·‹x¿¬Ê&~>?·@cý.«�.z €¦¦.@CàZ}}-‹_sÿ[�Ícæ4£’DÜ[~�Ñ]è Þ‘–ñúgE Yˆ§Ða“lþø›‚#Ô€ãf°“GZû!e:뙇’p”<ì?y¨Ï `žÑ“Þ´ÞõY|Æö�A�öƼ‚Ö~ï, îîÿõ§�…+.}¾(4Àñ>l ŽsÜ£^7 ´ñ+ŽÈ?Õ,�ÀìþY¶•ú�£ó’²YµþCQ€p¢¾lxWÊPýÍodE*@Áþ• Ñ¸*εaß`9|ìÇQTPa€ZÅÒÛ „ðZëçÇ ´^×°™ž­óvçE˪NLNv¢…‘‚•oqí#‰€NLD|-ùwøÊÉDa|ÇH0Jƒ”H(@e9WÎQÇ|L€§ò¡Ç”K‹Éó\âKÿÍøÖžN:?boâ~.KæH{·Hfà¹ÔÔ—Ç% €S€�ÞëVG|D¾¯Ù´¹ |¹w^µEq§ =1[ôì8ðC½.§Û…ÉMýöÄ‹WüÖ¥º�Þ€y…¢ôëIõÇ‹ÿ5|弯´AŒ~ßçãÂß]#†¼.ô™1ZÖp�+»ç÷¥Œ‰¾‡”ÁîÙ«û֌ϩn³ö‹�;ÝW„_¤œ~c­s…;ãè>ž`ÇÙlÞjhÞB�•o¨ÒÇÃKbò…�3yhë¹´@R�™[ ø½‘OŠiסÔ{™ÔgÅÙ0bn±)ÌÕ?ÕH"^ˆ³ÜwåôY—þ šMê*Áó®4ü{v´Ç`»^ÉlÎçú-Û°;ŽÄàÌ)¢P»ú�°Qè ÿf†ÛÝm™DúPúrÛ8�¢Bâj4GDvȤ¿}‚ƒ—RDÒ±Ÿ¿ö[Ž¢jJD«LM^¦¯�Øårñ¾‡÷£D‰@£¬ÃÊ0›Š[Çv…�0÷º`«;ƒñ$¼á›,kü½´lŒñ ¼í+ýaNsDvä›Éù` ¤Ÿ¥¨y³ßõëð&»Ôv8a9K·²=V ��Uóno‰¸Ž€Úg™ù ¦†ÌF\*~]RÅG¥©ö¥®Þðrp))_ù§ˆ³ùÓÖ†9kUȨè�“ž¡¾ƒÂHõK¹éA ÀC©Nɵùdå)*¬Ï´¯{â¤j2óûö÷$Ƚk`„J­üo}µÉ�P28yeº‹§›‚�§„j› TùÊ�ª¨à)p»Å ùö©lÂTÀÜõ ™&óT#!ÝQeöŪú N4\”^^¥$™¾"7Pé𼥦�W;.ÞÑm7,'Þ•ÝÔ1ujzjñ_öCEzwÖpñøL[O¾gš¾~~ɇýI$Î17áWe­£ï]{ÚÆ²ø$JWô.qŸ´”†¼EUžªx%p!¯�ïÒ¶÷rÑ�š�òJÍ–z_‘¯UMkòž½ÉÒÏs3R`uÔ¾êQ×ß“ϟ¾9Ë¥D?‹ ìT~õ]lÎ jŒaŽ õ[ðfôßusÆÕþSÿÃßÒKwB(a0/>f¾~Ÿ±ô‘«×%x9‘¢ú‚q×+w M`|¸©I&¦z9W‰%@ö<ç~.måF0€d„4À€KçåÙCû‰µï÷HD ÆVçà`bÛcÿqÏ:1H M%&è7£Ï… +ŸØ½%% kp&¾$Œ Öw¬ú”°ú.¬ùÍ  ûÞ™{ÛŸWcMX»Äî•Yc”ï «µŠe‚«—Ë��/¾16¹‘œkTýØ|wÈ÷ ª²‘´þÓr®1–šQ¬bÁ4þÌ€ƒ»Î"ÖÔiÎT� }d}h´Ñ ç S¨„¶löZ!4G£úSó"շز¶/3dq§Ì5DLÆ!£¾W•|áhë¹Z1ÏÅÖ»Ççö¹>ž¿Ï1xç¢Mlc7í‹zW�õéW¶‡§�BœÃÐdiô~”ËÄÝï¯Ïû7gå 3N 0 j¾o8s2Vµq‚M>QÞ¼H»¥ÊG‡û“íÆò/6uífío(o÷5_Œ‚¡xó·62U$3'>­K¨ÄÖÌ—™?‚ÿ€=Yy„š¨êaûq§¶®Òܤ¥•~ _¶£Ñ"*âkd·GAwû‹ö”é w ý'³jÍ¥«DæöŸ7šïï¢æUÂ$ãý¿Ëß0å«Qxî×ø˜Ò�²½r‚–nv7Èf›’ÚÿBË^¾6©“tgªô€[v€ÂÒŽfË ¿™âh°ùà-UðÜ.Dô`&Ôª©YQDME_yïoíUÏ?«CÜD�Ø�Y±A�¬çÿÅáÀà?J/ ‚÷W0ÕågTÁº×|�í®‰÷¯ `0ûi�EîÀÀ°AÆÚI!(ÔáÈ öôgŠ(˜¦iê™´TÀqWæzûâ*2ó²Þ©®X 1M‹QÆÀ(Áp–R6C$OæëI!¦–*Ñ[¯�((kš �©Ôæ-#™åœ°’�õU§6ÒÌÁa´ UÍ^ÉÎìc�˜~mj)§€töâú`ºtÉÒgæþN_~Úáî<Ù[ë¯b Š1pà•XÈVÑ#hDr `�á1È6ï«ZAµôÏ]”ÈúDÎñ²7¢Þ¢êfFrßã¥w svó?±bõcdFÿ»îWÅqùƒ£$æ8ò!;q“Ðwjóß/Ù8źÒo=.à¾E¾£ìoÐã—áÌÂõ(u8@ÏõIwtÀ¤ðW(NÆm‹{?L7Û“™ÛÞxèƒäs©�I„ç#â7`{q®šgsÛ¢Ýj¡šØKañ9_ó9›‘o~»U~¡LÃð�Õº›oç\†#Îry�9B*<é¯ÿ¨vF2},Ó¬z:àüÊ�ÀÐ1“I8Õ!Q¥….è¬Å4^²ýêu“¹ùž¸'Àˆ…öò<&ÿeT›ÿ ‘ýú*ž¯wÌÐ,J�#ª±†-ÕE¯Ù¾GýÊL'rKŸT.ßÉ.`¯•$›êVScèû©´Y$f~¡שxLJÅvõ7¯³ôµ€•§Ý-ï»ôñðLHšc<štgþrœ[ãº-HEËçù=·Àú•«�3ÞQ^b´üåîîmK Rš©rBš +4ngg^(Ò iT}¥°‡k §ýn…g«ŒòÆÎét›s�þ�>®_û*O£+ÓÉ…,a‚sÌ»é¥ôr7¸ÒÔ²ÚnŸë©4t£— ›ÓÞ¸dYW¦ýšçêÕO”Â@¨öh÷®Ž6ЫE/y$œ¾úþ\�ï�÷û»Ý6q€uœÞ° 5¥W=µxÖ^+kºVø¹nÕ)lÁ#ÎC17§2‡w�·�À’©D5釽Ÿn¨°üwž‘.ÝPÚâŠZï�šóï7Ňn$[+'v¥¤Ž¼Þtï¦4 è”Ë~ �ÊîLâòhÄ\ó‰õõÄÍ ¸ŸœÍˆ0KÍþƒ!¢íÀæ�°HåD“7ž.ïì ýp55š4ºäαoZTÇ.´E‰�†¼VîYyœK p¶´Zëá»Y‹cg~ ð¡Ê¥a½Ÿ‹ç[6†s>“¹C·}ûñAUê=ÇbÚ6P�$“¢ ¦®?�uÙ¦(K­�d+š+ÉZÕ¢ ‘à0çëþ„Ábå£öËnúýFD$¤ž ßȵ_Óï×.—¨ö€ \h*¥7hiI]eÂŽ°Ç/HñX®¡ÒÐQ‡z¨·ÝÀŠA%AU~†mÍñÇÿ€„Õ¶û?~ÿYêê` ‹Câlˆ{»tU Ýœ¢›œÈʵpB—®à<ä¼ïÉš©£Ñ´Yߪܲ¾ù§œ_ª�ü%êņÖé€À)Xååg„íQêïÐvJ À`»Jd}„ø ù i!§ç3÷¨ÏÞmdeÍýí¢yöi¿úgÚ­Weiª×êš·6mªÞ;Šz—õ{{> ã÷4Í…në§€b¿+p]x4ù«v.w@®é� ›§çUV vå$ï½€OggS@Ùô M¸5�Ðÿÿÿÿÿÿÿÿÿÿÿÿ4ÿÿÿÿÞ¬Ö+‚ƒ@æpB�#�QVæÊÖÈÝ £ �6ÇF±Õ:p‚SÿÑ×pwöù›ûy€áÙ_ÿå·Ü¯äû“¨1æ$“ N1©Êy`üŸ_�†áYnèV TòBÅÿÏ„ºnIäÚŸèö÷'ùj(Š»oj8‚BÖÛy*O"s­8y«íõÊßc`À,ßYש¡:V÷y€@=…âÐOü)÷$è 6µÙ¬(¦Õâ)™Z¨@Õ�ëÈâ+{è�e��@Ï”¨TÎNÑâø¾g`?¾ãkh€Ww»MÃ�“î œ —híàà8¼ª#JW9$Ò>`û›Ù÷Ç‹H]÷Ú¡Z¦»£Ã0<{ÔT É>áØ Tµ†t'œ§£×Y +GT«î ª�½ ¤©•PóŸs40DM­-j‚Üo8ü»¾)A”•,Ô*}"�…Òãl®øñ³ï¼úޚ鸙+pšå—®üMÑö¬¶&â5 :zâöúH”ÈN<§ØM":^!<ãÙ½¾ï|s‘: (Òìá¶eŸ�G{[<¦-aØ9Õ©Hå{Ïט›&¦tùáD6>ÞŸ23ÿ³¡Öãôòž¹‘¦wè�x:ôwæÑ\°²ÕMo¿¡®2YWW… Z©ú¶÷î}ô<ÿÃzÎz.ñ‡ä«œíÜÓâÎØ?ûN�1Jç<ã×Ä•ã“pvá)‘I Ǹ/Ó:T•ÿ’ šfµCü€HßE–K°Ã`øúì-ú¢ªÚ ,l\Pýk2Þß.Aç!‡‚ð˜TðÿÀBuSÝBÿŒÒN•ì…ýå[§Û©�ç ê ÓföV»¬îͰðˆ0ÃHë¥Æ\ƒ0Ví®ëÓ°þÛÆyì‡×Zè»^eª}e¨]É4lßOž�+rVöiH¸§ð‘ïö1ËÕ0$kê�×.Oßïû¡?Cl²õ.›™ò\’$¤ÐH`‰¯Â÷ãŒ}ºøî9�¢‘žeÏ ïÙ¿GvýÞÖ4q<.|r)å&‚;t>Õ› 4§á"ï(¤ejÑÑwK¬Ê’ÀO|$°Jwå¡i®ï¹µùÒðÚׯU³¨ýý$›RHkå`‰ªSOŽÔ*¬¯´>,XãoºF›çŸ`!ùâ%›Óne¹g‡äsSËËÊÒšå(eáûV_�›á.¹+©ÌŒö;†&\C\š"B„ l$§•Ñí\…µ_îã¥ìsߘ]£¦[b»¿¹þð�wqhŠØxUi›qy>¢QÓ¯)üÁµµ˜ÀΑ*�®ý]x´™_Õ ˜G?°….Ï$—˜öSÈ€ ^\íGœl wâx¸rPTåLß–±8²œüðñXN,N2Vâ @3ÍéZåö�¢Pÿø\ ci ^1öׯ,›Ø¬Vš*uÓ¤ Ø3¤¡—Q„õ@ý×IÕ]]¹5¢ÎMX÷wm¡Õ�Õ�w=º)?½ñªÃ²f ŠZ5„pÁ¡½ä|ëÖ(ÐFª|­…™[úA w˜kpt¹ @­í›p|ñ»IߢA°Óž–_TÌRL V*µ;*ˆRåO{¹ Ð?> [ :^_úD‘R>à  �ëµT4/@Á„�º;±¢ˆzt«B—ßGV­€t¼gòùê‚ªŠšž:€¢ Š›{Π¨›Àè|¥®ä¶ïÂá!ÑÆ‹!À\Í !rÞæzÿ¿ž”VÄœa'UŸÏç=3ᱪi5D�ê©yŠ·_m²€¡9ÑÐ^«ñ’´öÚ’Ç¥u‹�*I@3áÛœ¦è?+&·_§©ÿ÷íSðI%BÇØä§I·çš÷P#jÂÄ–K¿üÎ÷Áº�4øçÁs?Þ‚O<ÏBÖÑ•¢`(²÷ù«þØêcS¦Œuãq.¬-W)›4RõüÆì45*þ`qð¨­#\ @êñð•�K/?Í«ÞËmÇæšvà¸C¾[Ná�Ÿõ,�´^j0'x�nnåÎ7ã…Ë©Œ“ï`é?ëØc5£˜WëÊ–c“�=—«t)°á¿(6“�Ë[!(—JþÞËv•ᇒA¬#à¦-^šÄ ô{=¸’$[÷ßûñeÍ�µëY.I‚u¼Íïx¥u@T ËÆ~ÕZ)uÂÑYÂëU H„mÏsàŠP³�hœÙŽöÕWíŸê@µao$ÊŽGÆ€û¯B &9“ÓTNæñ™ýM·Ì°…Š="^JHÔ! ÷©LS é$Ò£{D½BeøuÞ”¬ÔÁƒæËR^åc¶)Œ{ gé¹ ¤åÝkGiù.Ü!ew±Þ‘°qÖðOÄøò-.H‘6¦ëÅj S/„Z@”‡�±‹ƒá ¡„.¯Hþ�>F %½ª£!$ ÆÚ~·Ò)¡íá—kaµ;_%Id–ü¬¸é‚±|Û'˜bZ&yçŠå+>g‰¾ ¤þr´g¨ÏVë{·—Nlø²Ç 1èX„züJŸ6Ûµ*Ò5ËîØ &ÎrbµÙ‘CÖìeh.×û½Úî"—Y|tpÒío‘]_í4fyDé­ ÖÛÃq<^ï³ÜŸÑwðëUY$yO}­VÚRJ¹¡¥8ÍfÃõétÊÖk9_—!,ú–[àõ¢—Íå�¿U°€º •[XìjñÅþƒGœ‹Àd°£W\PX…+t‘'ž+u笎[€5…ZïˆDïòøõ¥íÍ6öÙøº#ôþptq¥}¸g ¸àX§::• Å壞q`}_…ÜG~ý—ÆÙjQ7w×ëyƒ$ÓZ�òoñ‰ä*U©E­W´€.Ò‹ó1Û‹š �Qy²îˆBf@=Ÿ÷2‚zÆ ÕÛC*€S#U`:žÄç‚È*¢Ø¡}·�Š HÊãëð0 t�›¤œ@t©ÀEªô—ÇñÈu0{ª?»xÄ´o—.ËFÅPYYÐúøúq‹F»ß® EŽh„׋÷rÌ¢*¢¢ÎôÙžHpïÞ¢™ÄPvX'ºÊ(�CG®ÎYÖêq’�ƒ6d/÷bìù€¡û †|©¢}Þ¬Ô",ø>ÊÄÒqÈ@ÄÛó(œ×ŠC“»5þççž5a|;ê7>D9퓌5·± ¹=iœàôÜ‹;39©Òƒ¸qÕçš÷©m¥ÌTq’xþ¨6©=-=þôÏêN�ÚY›¸iŒº.8×xc5~…?ìeBßL¯m <•á!kŇÕþËz{x«7þƒÕùýÍýOøç*G'R•­tøsÆþŒ©�£š)Nòq¯ÉÕÍéÊœ3¡ÕŒ=5£�?×Lò�ÜÍýt¹?ã“üÒÏ›">_WÃî—¿ý^RgQïʶÖÓ¥éï³IÑö»a©b`ÀÆ&˜»¹‰Æ%jõîkûMV¯µ>1_ÑÞ2®º‘ ~E�ñÞê[Ýdþ,ö#話šLdGt :‚4™7¥C˜ò¨cc#D´=.4ÁØV­\ö��¾ðõºȪÀ2Íç`ú€<ŠÄgÌ%”Ñ?l¯-W­?ûîG¢¥õJdðá@ßLùÛ ðåßΙÂóÛ™U’¡Î**û…aÄ‹ ‹ÐJ­RÐ7i ’ZÉüèr6gÃNMס%¤Ð׿k†Bîwº£§¾|© ûŽÈqÝ?ê³¢FH)ì ´DDDÈxZ–H88«'€<«Sõß`ª‰ª,ðûuã©&zªåšáÐOÁ˜ Ö( OÍÃcDäÇ Õ˜´náNYI*  Ps�¸ ºk½HQQ‘>{V¾Æö{÷È_Ñç1�y/b¬ºü!-‡•ç«Tz¨ªªÆ#1TÐóÒE”T7�¨NÑÓøýp§Ì²„µEOd5!ñÀªª¼ˆp@• €H¡W‡‚Zd˜aÙ€é8†’‘.oÈÃ$—eý�Z¢w°÷— Ê60c½�¸ƒ„Þènåp™6®®†—`�ÅÍD±¶…WQ‰¼!ÿ†J·ú¨“g­\�ð÷½V¸2ÏhuHC��•€Íh‰—é,»ï,Õ-z:;ë×kÒ½âúeì>“ó¹[clŸØy�ßo™DÈG;Dþ)è…"Ĉ}þ’KÂGðn(O:áû£ p+<„U©øå¯Q=ÞyWî½w 9ù™#²G½uMÙîΧË·rþohÄÚ á «¥F &ª½pŒè6†)*îóÃ&ã/@ñÞmÓåCs�±"Ú�i4ù½œ=ßRÇÒz×DÕꦟúŸXžÆž)<ø°»uôÍÀ€* q–mÀ~ŽZ}@˜¢RY\†pôßä/š%¶E©®sw%m y­s®{†¨ý`lekTÊe¥p& ñ¡¬…»ÌsQžÖÁ­ö:;–{îœJÔó;˜o»Ä¸�RióÊb¸uÿÑ`Ù¬Èëž.Øu6+ùb¹1HH" Ü\(vÄ9ÝÊ÷•ïafíp Ó…þs±Gµg�× >Æõyƒ•^~B•ÿïZØóv{YúŲ¦ÿK'+ÂßUIØ Q „.‚øÓ’¦#A·(üâ¹.$ÇUv��뎿ÆDÿïžñÕ�8,vü6)%#¬ñß„\K3RÍg¬ÔS)ª�Ä„·kw�åâô:ÕpzRX.ªXÎ}yX†!ÔÛ[æªuÚi6¨‚•oOp,ºÆš¡b´ùÔ¤2Ó܉ÜÎìž'Öˆ1JiSiu°I¸Vý¯zh•›Í”67`½»Gå{¹M;òÓ']@‡Â,²Ê"ý”}{¿/½Ï£Á=²žü­&NlOggSêô M½¤¹ºÿÿÿÿ ÿÿÿúÿÿÿÿzª¦¬¦£¶>lÜ3èq° —¿H|$ü�6[\ YÎy »Šd�ð–°\ežÇ)˜ãuÕ‚ªêv‹Rs™ú øWd÷¾ÏªK¨þʇFTχ<—Ò="¹P¡Ê±GU‘úªZkU×vð6ûjõH¤|ÿò–{_>½÷ÑÒ·¨ŽÐ[Ï|V;Ž!»bFíZ¥-+_aÿülÃ*3<xu¨L!sº÷¢ÐeoÿS{�üš&à¼|Wü5e³#¯�|•�` DÄ¢VE¬èˆhg�Þuù…r¨‡™ µl”É�ý`.¢]×™K˜œD1±©Ä8ÑÅD:8E¯gª*ˆÈþM¡ª€,fà�gÙ©õˆ” @@LEw,¬’ôãñ²Rn¹ªbóq¯_{h…up˜È=rÔ(#ªb1Ä,*Ù㬊J¬.Öƒ£ˆ¥ SYéÇŠUÔ¨‡z¹ÜÃqòÐ4�’[KäÝ‘ª¨4–aIÉ¿³´–ÌÚÕBOû¡QÕDæö2I›à(  4BiÆñúÊÈ\¹¯¿÷Þ|‚Ôö×PÜî+ð¹\üò&®éÈÚÒ©Ç~/°�¿@>ÎÄ¿3Øÿí¯§nèâû×ɩ֯²QPÓõxVg£Ïi)àæ:¢k9$f |�¼åA͸šâ9ŠÍ6{«`]¦…½?W&ºÝõtß&‡#<¤T>7æZÌïaúëO» þôå¸ê¼—} ^ö+‚:°kÙÌ®8î‘ú}3ƒ~ym¥låf¨×F™ú‘[S~PO]1.™|å)ë¿[à^nõ]}Å£ü­ºK#C©ãKNŒÓ þä‡Ä›×ô 1ƒqœ°¥²Ãy²¿«všÆý¶�,©V®‰rƒ�«vsçÒž^RBÁ(&Dä.WIBVN4•]Ƨ9³ÿ-Ÿ˜Ü©›o.½�ŬvsxATÖjª5IWP¹¶iÿÉ·kdìðÿ«Ï¦roø}%ú·ãì«îÚËè´¯bºgø>.ÊSs ˜K—¬/Üëù¼¸÷¢ÜŽdd�ËÈãhV�†o±´pžOîÔéu\º©ç26ìêpí÷ŽàÉ 5�+ ~:A°lz8'¹©Úù«þx�Wy_ε/ï,"ΩæB· ³¯÷ïÞƒóYÌ+ãG˜‚É �YÜá+”ñÅŸÇœ¬j][Ìô�Í=¼\I'X�Ê€°1N%FJg9=p®â‰íu;ðtÉÄ㇠ÐêD4г%HªLi‰:ÙV`¢_~^Ùº9-´vU%ì£U*JÏX»»bE+%9(D²NìBwí¼“tÅd€YJ ètÓòF-;V}›[s¢7ŒϹ¸›—åF9 p•öI‘]ì `Þ8ìÙK<]иévøŽrQØÒ Œè<>®ª˜Ÿö‹âÐ] {¼fx­ëÈÒçW‡YâѬÁkíšÙγ2n�ûÙ/×ê‚S¨ðœ5êuE1¾¾½7Ù7¤E�m³š¢åM�èõyƒ°ãüí�ó]œê»NˆÀ ^ýú+FûJÑ”† ™¯æt\qh_º jßeÔZi�~ÏO¿[¶(i¨Åuž%÷ø§ ÐÈ›ÿtDG—�nwÓ BP&—@áþwPSLCUntÉŠ:ý­Z§>|´¶ »J¤„§ö$Ɔ¸Å�©—*@Û!ûÈ�Ó�Õg/ª˜qDZ�+E…tœ[ǯ®§ò%3¥L£ÒYA¡Åìqzx“kof'3TÔ!F2$Ìú¬""%Æa@Tò;æÙRK QE,¨¡\¢g/‘p…ù<¬F@LݽS½,PÛŠ]Èð-ô̦@½*"R»L&³œ¤4R);½ì£òôÃóôÆ œ4öæ�jCE¬úöžóÓ¯­¿Ç… {tÍÐýTOôÛH�:Jú/úb¹;g֜քgÃÌÖ“(k�¹#� ÖÓO‘ûÍi"D_É…š�üÅnåíÂyD8iµN¹yßþ1~GŽö~s,wüUGQÞ27^[|s�«ªwÿ=Âg›I&´Ý‰Oeöº]gÁpž‘ɾLiQ9¯0ykcµg\Æö i3«:®oÈ1U±vê+wÏ)RLxÄùLóÙf²xªè‰�µüUа�/¥L�J¡µn÷c5^p4� ©iX¾Zµ/…Ý^~Ú—‚ö�ýü#ÞîC ðüïù&]ìy’ÊãÿC‹UpuŠÁÀx¨Wi¨¬ ß_÷{°9Í�AlZ˜=Çê Üúÿˆì—zð¯iäñåç¿,ñKõ‡øª{; wd´s'‚ ÑÊ�«n…ÅãÎÜi®ïe™»“éÃú,ã¦ÿâ“©€™�0Õúé§D(²½‘DÎQÛɪ?LÔáP•6¥$®:ÕÉPÒéDU‡¯ÖÒKQPU Íšå™â)bôPПßþ{XV Œz­‰EÓež·®U±`ªÌÿÆèCâøî«‰¢cŠÅP˜e‘¾rEZt$xCD¤›>}4QlK¶uŽ¡Ü ÿÔÆOÞÎé夸N‡~»šY6Ù²/Ï>ÍQy*i©<þFÓHj³ÓËìsÞ€¢ò¬‚w½kÓÒgÖÕ~­9ádA|Ãf½ÖÛØ$‰œJ6Þ ýéîçhÃá\Vø”™™ŠJ7½|'Ìozž(VêIx§9Åå©©ñës„NƸèÐýû͉¾ÊØìө’Lõó‡Ê;IUâ±X¾0U÷Êu‡µ®†iÈ�‡Nÿè]ýþã{M�ÐÔÁ©B/¤±¥¹¯ûuO3ã‰&F6®c2=—4jdjYô;·Ûðí=•×*»ê? W�Ø=÷ü ¢Žþƒ®i5¯^í¹=%½,œG÷’UHÞ�¡û¥©ÉÛü M#%ÇáÏ烤{ÜJ=9µùç#æ{_Œï‚®Û4²çOíwÿóî÷ß­ÎÔÄ¿Heûê´­h—Z—{w<Û ©lP¿tôÙíH° ‹ñ -¸HÚÌ’”%Ç"ìÏÌœqûæK©ZN'M–• ×À—ø¯67I½¸™èĘ(Ó‹¿¼è«3ýn àgZóÕm�,3|¬)å|»IÉ÷ÿé l4úÅiïB62âåô*Rw]ÞÀÁôú"�ÍîÂÿÜï“(î&HM¾oÿ÷ÔùkL;~Y±ÇoÊjF6.Zp-«$¤Y…4Ž›~w¢xx  zï OãeEC¬‹gªg×$h6…'™ª*"wUŒ_Ç1¹tµê>xå?C9K%Îá/'’qš�àv¨XÈT÷�[Ÿù]ëï6·—�î¾ü«b•‘ÕVWAµ«ì –ÿ·Øs�vò€ Û/wÏfîiI1Ej’†mD+Q©0SÕb—Çò›³jî«—ÿ”ŸÛí47çÑ'¯¢]ÝÿûDýìfG!“ž�SB¹ïhÀ÷„�®”ï€Ôä—{=À¨l í 0à‚Ë~ñ3Y+ÿ —ߣpàç«g¿7¯ú•Ùùžš{xrŸ~šÞí›–Ñúè%Ø‘çÃý ×íæßôçë3J•—׉XÍçq1?]!ÖWCÜŸ­ɉï,ìƒãÄ8Ž«•õÈ©½ïýkxŒ§Ñ9·ÄúÞcO…èñ4Éé&¿ûïÃã4 þ#Z‹œuÈÍÐo¯Õï×ÛŸ#ĽwÙPeA3$Àu¡tþÌÛž-õÙCGžCœªUŸÏ½÷«öÝ ²ìò®®’“{ ÿß�wZX¸Y©1wKܹhù²]eÓ¥B¶øÂÙÙœ:q]›–p­¥´íeÓT¯véÍô 1î[¤Hï‰ð²¼épÍ"{ðÜËWŠÚ£ÉGÅ«ÀÈ ÚÛsõ~¤Ê.” Yíå-¯+yOÈtT–»Œrrˆ÷˜ÿwÏV†d`WìýtO$õŽc*”½ô¨¦¯ÖÖ<{³32û»9¯GûÏÙÜüá!éºõþz;.­-¡UE�¥©?2 õáÖSK‰®3u¥ü˜êô‡[ kL�ŸÓ›’¤üÿ“ݪ0_F‚˳„žìŒ ¾ö>yYx4ÌyD)Jr2g.¤v*ÏSÕÓ´ ÚnŽrwÕþLÖ\F-ßÚ y|&˜ZýöïîQäw¯ß÷pY|ùCžJô¿4_[›BrJÈûݪ`úÁ¨I~‰xë¾Ýk•±#ÉpÖê}+rMÒˆ£EeÚ&¦£Y¯Ä‚µ ‹Å´ÊŠá«iu0$ú@Æ~òÊ0¸¢ö“~*ÀóI«µ4Ÿö†„ÿ[“‚O`�_ÒcqÆ›"nF·ýaâÃPÜ zõø <6.«µ{ÕUé͸5,Ž ß=Ü,Hw1AnÍ¿7ê®§úX¥³tÍÉôÊÞŸìTS•D¶²Â>+¡�¦À”½}5þå­Ê/M�ñÐZ®^–Ûå€è‰£Ø…rñ ÓÔòiš6l‚iˆ:ÃĦ‘–.ò¤ekÁ­ùN�fœ?IþéÙÏà:šj¹»XÌîi2d¼ÖDµÍ¦!»R‘¨-«’�yŠß,9‹Ï ˆ>>*S, ãKÒVGߦ¡HÙß6FSÓ4óàݯ,Òp§Å]5ÓWÐæÐ,®_7§e;À&¶rSsüµå®7ÆÿÀ÷¿hæÏÖÛ]¿ËXÕ¼F¬Û¦tñ=n¨šk¬k¬V% ›Åb ¦Ú­&†“-‹ÅÀT«Õjk �î\¸Ç D·÷SÏþ µZ‘†s÷–F·ì¹¼bÑj$ÏY躋·@�’ÿÕSý°÷C÷þés펞@.f &¨I5€æq¥p$ E˜jDƒßáýk¢n{ϳ±ÎÝOggSöô M Åtžä©­ÿÿÿÿt«­¯«¶±ÆÉÓ¿ËÒÎËŒúFŽ«Êø¬O¡Ý€«}BµîÓ*ºÿÔó]Ï~§±9óùÆÿÇOvK§Í_"£�Á¾ùƒ�eþµ¥;͇¡hʘbZ°Š„ZDP›ÝbµXmvu6Ó‚!Ž– ¸H|¡ûÅ®æ½íôÁ»žÒÍõô�ËiCÇŠ“:â¨rþ}?N°�½åÏo¢ª"Z9‘À`�FÊ `ê¨Iä@Á=r„©€Ô5|§ÙØåönÝæÏ^H„Éx°é½•Wþëèïeüš�þ\6߸³�éÖ,�ߎžš~cæúËZªÓñ¡mFU|-,\†b8Á‰R”FL‡ LÞsˆ–³1XR(Lê# gðăÄDLaþ@N“‚Ò neæˆ6Îoï r8 u+_’ò€+aŸf�.½r9,a A·åųZ$Ÿ°²Ñé´.ÀWåÄ<ÿ\ï�ÙÙëÛ"Þþ)Mró¦Ó6ø)–ÏÀ1Ç›¥Š5Ó̈êë©w5Æ¿µJH@Ïgš¡¬ÕþDØ]Ž�éÏdÓ•'ay¨ß¼³;¤Ò<’èïR­¼°«ÔàtÊuŒ;U�®:x c÷rÁÞA‘¹+�0=zï9ÇÖíÆ•úQɇú^îÞ6‘.¨{—Ñ|¸ø1¿ÕªŒó¬ž½ñÂâŽë ‰Õ²Fﺀ3uònN2Ÿry¤±¦övÁÿ`>Ÿhþ’/)KŽówe§.^ê$—MjF¬�¿û]D·ÐÇ}·Y­Üòý µBiµ¶�¼J÷ð(ùÎï­óÖFÔ§í–Bé|çŸffÎR>ëâæÈ|ï,Órç#JByûPÁ­Óv®d•ÓZSÞY�¯tTvÈî´IõÑî $.¡„VϽ]^±¶Ð‹qÅ)yÅ›yƒê&_g²5ñ\Ù8ÂÕr®X&K1O…Æž;E‰ñwßÊ-i¯µVb™â!Žû)µÏUÜ+YÖ'“—4íÉɯ¿ÇIBE.$:«ñP²wžáøX ŽuQn‚ïUÐÓ‡òà²Ä�±eçÜÉ.îˢƒ Hq~‚.¹€�ÅŠ�{éû÷À‰¤å–ptUÒÜl™(I²ÕTïÍs(MRý?ŸÓÿÌé»O5¤Ï´?ÌõÅÚ4^‡ÝtžÃu¿OË÷}'ÝM·Öœ·å{ýVÝ£ØOõ|-Êü™äÍIÛÛ”�ÍY›â±ýßÎËgªL¹;†ÓaÉ.¯cþž.ŸSó}ŸO±þÅcûYlÌÿz²TÍ.Ý©¥…VJŸm×”MFÏ€°caO°+쵓*»DÁËY½œjú³¨^€^ïä|¹Yø�VY³ª›ò>å˜LøTc·¹GŸçÝY~+pêÈvUÊééÔŠŠ#ƒVíÉw}ìŸÇâĹ3ÿ.~>uÌìç5Z¨.Ûúk–ûEéáñ3¸?JÓ뻚I¦wì)žë¯éôŠãÜWõD¥ál}69èÅÔ8dh�ç.÷Õßy®ß ·Y#áäp­‘›ëMê†X3TÙ'C@þ¡îëº �»/t±Û¬íl˜µ°UÇNôKûáÿ‡®×�ê-×:-Ñ›¶*Ü|6èÒ³¸º¿cõë¹�Çõ1/§ÏÍÔu‹ç†–>91>Ó’Fs>Q±ôk[]¹D{mTp”Ú1Ä;W¶¦™gXÌ»—U”ºö~5ÃŒ9y:¾ÆŽ®´I½RŒ*YëaÿOéÚdý �'Ô~%¾«Uÿ3;u‡èií tÓ Hnþзy”OÀÏr¡öÚÆ,E¼—>Û­kßêr¼:ò�›SûA&~Ý8kìÕ),ëÏÛdŠfÀzÆçÒÎÔ­(S1Õ®¨ó/5@ âŒw–ÉŸŸzVyO÷+¹ c–ùî~hÕJb PÓøgõw×z/F�ÁW8ßSôÚžç¿ÁVÛÞµý¿Yj�¨êT³ÑJÒTÓ¹Æ3®tå“»ÿöÞôÁ‡µÖ¥ON§¬ùK¡,îÈ P)Ô¼ÏcÜ3p÷}pý^ÿö¿Þwã_ÒF/ÕÛÙ–'5Þ3þh7�ýŽþA,mÙ£9�z—zÒ×ñB+y„ûv+‘UgÆ“JWòÌ öi~ô_;!v= +�ääz|Ÿ§”'[몑„–�¬Q—[ùÙo"x—^Þ$ºÞAýÍy9â™:«£kjŽ<ϩߔµëùøC]Ép=%o"}î"c\¯‡$TÓÞH,.r:^&0L@|¥B)¸^Þ�?çjÁÑgÃïCžûÖ¿,óǽ×'ÝNÃGÎV‹¿üßoË1šÔå wþ¾×AßõE®ë×õWøîø�À À“ƒBÌ3(áSÞž­ªq·ô÷äÆu«¯5ªÁd°äMý“¼qöV«ðN⿼ӸtOmCÇÔQ @*çÔ™3r®3"?�¿Ð³þË΢“¸ð´“ðò¡.¸]ô…,‰�-ŽÕvgû$ß 4ͰŸœÞ¡mjÙ›ZmúñÙãÏ~ùøäεÕaù9~Ëßì¦} Ý¿Ì�åyß÷›ë³ÆòÉ­ýþÉ@÷ÆýIÛ�ã§âô1.N=ýKïr²œ·�¥f̦HWQ�çòíÞ]ÊWØÕ| RO&�9õÚ–Á]÷8»Þ(¬Sõïÿ¯’Ã,ÍîÜf¶�¦­í™«k¯ åÞxw(Y�$Q«Ý)ŽLÆ¿±·CbÌ ÉÀŒ–t}•B“mQפóKá4¶—êÿTøß–ÆL;�ŸzÝöi̇ÁÖLJ¬¿�·ú§nôÇûá”Q~vNï÷¯™:¯Ã•̈÷<ÌCåí€ËÔßÔüãžCŸÓ9�$=ÿ¯&Mß’'h9á•¢YÊ](ªqß‘äûcu{÷9bp�õ˜àŠ=Ó½Šß*›ëRÍË 4»îz‡O,bIù«!•/´ føÔ®ßÅoÕ5/±÷ke_ÔE3÷?¿ÿi|:�þ�ÇË—§aŒTÕ¦á«Èp}¼D!Ò m�zÒJbZ°³Ùò}ã‹ààñuäu{=·žécZvwè².ÿõªè¢ï[ñ#EEdMŸ…âŠÞ×JUÉ%—uYcÂ�‡Œ�Û<¾Í8² º>ÚÜLçý嘸K¼ >ïèæHV¤ã@�ÿ-wºrŒ “雿§»˜{{zÞ ó•>Á–ÏÔóºàæ?÷ûÅòÖÊcSØKC7­%œvûS¢.ˆ¹ tíK»tØì®·áÿ?[­V«Õ <ñf‡Ÿ+ Ç+<¢“�ñ56 �¯À_þ.÷ѯûÔ/ݵՎ¿~ê#Û´OoV ÝþÐ'V|´¯«¾ŸáïÆô÷uÐçÙŽþ~_Úç¹%Ô«V�¿mt³b}ù‘!Zº—´ZÂÝ=>4=ÖžËBù²•$Yí{‰Äy!¨¸s†^q²ÃmÛ7{Ô‰ý�Wס}B!ixÿM\x¥#P?yp÷D¼.ç!*¬Å3z?eùÜV1QÑ  è)Uý‘Ðäßï¾ÊÝ{�çßOÖÔ�Øv×}5þ 4"ñaÀ¯b¯]FÙ°ƒ«ß5JéoØ-éyßœÿ÷4oúëGñ1ﱿö·ïµ®¯ÿç¦^äöÉõ•>ËyR?ií²çŸÇ5yßNº©×¡ïÏ^qm_ÞùãÅ}¨È¾m�VËó£¹f½jDÃOoؤ×ö‰o¡[µço±�Õëu1!Ô0±›÷Òq¢‰ÞÓD8/÷øÏÓƒ?Ô9™Šñ.ûDg£­db,±]¿¹é TpB’žÍ3ÚãÂÄnÊ–_º­³dßÇsLMóÐβ2è87lL’É#ÄÕJ(¥¯qx=ûòå?½ž–·Ùç·ó�}­õäã¯/¯íó÷i¿áÆ£[~Ý_mn_WîÿñóÍyòÞÈ5–sΜ?›«²·~½Õmj¤³¬�{>çz\ŒÐô´:×ì·SEæ¢|gÙg’ZÂJcµÚé3—ÎÓg0²þþtdþ¹ž:²x\ñÏÄ´ñä‘QQõä€ríjý5OtvCå…¬¢³&9‚#Õ¦+Ú/åMM�8AÍñùÓEa¼ë»žUÁÀÏYpšF$ž=ð§~È¥ð[ Ï#ë›ýIÏûé“46y±¼_m=éµýÛo½ø|¾óeE¦8ä�ÿ~/óç«åþqí1¯“ûý¼žb>ÞÆÓdèìÍÓrOÝÕÁªŸõ³Ĺp>Xùû«ehîÇqf eÚ½¶Øç(ip˜²ëwLÿ°bŒ�¬y!9íÊ1€ý÷Ü/>³Æ{ãÓZvÇŽæÄ9ùìe§ãD×*Óô-újŒßâeÀß ­lf´Le÷J§MØ·Éíòú,ÌüwÝõô%©Í¶åµþEbÏÛi4 ÈÓ‹¥îZ�ÛBkñ¯}–Žß`Û«Å'ÇëûgF/þ‡(?E$;_ZWwrI–!�ÿë)~|•º.÷Ûã×�›o×ûí…õV é(€¶IóÿÎÚŸõÆKwÕ§{îÝÛ™ PƒÄg­¯- öðß󖊵i±E\Ð-J«™rOü/¸ô�CNb“M!õJÜçPWÝ—‰êÔ²J?G2<C}éó«n‘IçîC#×ÛA÷«¿9Èç¿lßßvØngOggS@ô M!Ýö”¿½Ä¸¶É¸¨©©ªªÄ¿ÿÿÿáÿÿÿ€D"Íj�|ÅŸÎ[™ä§†¯ù/ÐõÓàé ±¼¾=yãi|Êçâ­×gêÕ/ÓÃÏÿÔŽISÌ×'€é¶kK¨Û·—X#ÈOŸu½gFÌ“£D"+MŽoÚÆÎ*²)÷øµÌJ¿¨'EŠ1_·ë\F@µå;Ñ�²ðð :Ü(­–ì´iþL×în®OCr÷¡:aŸzŽzU-Αc<zÅ ÇлNh|cÚ_¹Û<ýZþ}L~Ku¿äþÛ^ŽkÝ)'\&ë¤!�üÏeækNÙ¦àwù úü³ ··”äßï³:û˜Ÿvž×æÿÝØç?Ý3&ùë^ª (EÁsŽ{9ÀRçÊÛþo&‡Z͸=üZ3ÏUj„. ` zîæï¦ÓÐ9Øì)g ów#8ñÚgUßìæb¸f×Q z�ªÆÛ£yK÷ž>ö£Ú‡[â«*ÓÔÝqüV"dCÊV6¨&Ê ø†µív®ìÖGH»›+Â9cç¸þ£Ÿ*m¾Çænû¯€�l"ÝfÄÏç/¤ãTÝêáåêó¾nÛ‡¿ü¶ããÓëÆúÓ¶¯Œ½•åõõëÓŸ¯�õ³8éßn³—ü‡Qqè¿»kÞâÓÊ’ùr­e¤FdNå*ËkºÅ#bã¸{¹�aG"5¶ÌàI«åkë™`¦^Bi‹7½§�Œ”Чg24ÿu �!;i;Èÿô£ ̯±»[¡wqÑ=zC«Ûò*x>%5ð Ö¤/-×T³ûÝ@8ÈÝ• ÷Ðù{á$*Ñú›_³/ÅTëd+íZÿÜ8v¥‘oæYþs©idžýÕ�oÌžØmö¿í:æ¦ú¿²µÝ?©Vÿv«Øù³BKýdÃk- }åImû¯s&dš—q®Ú÷i/^  h‡–~&…áL.�±s6=ŠŽ™,ñÌWøÎ/wS%Ùo‹çîÿÒ#U¦+ ðXr¼Ÿ’Bîü#lÁ&,ŸrmŒOGª‡/§U8w¥ëÜ7³£æEu‘ê)NN·×}믖T"ÃjDùoX®ùh”‹ApÈ¿”µ²F[`]Ö¢ßí/‡öö+£]»Ÿ ?Øý¤�èôo/6³óムÅüÛÀ; H+ù¶î¼WEKZ·ESZ¾�;À O?ôÙæ÷9|äb¶ 8ƒ‚”dò@œÑ].þ©ª°rœsÑ«gHqÂþ§iÞ8=É  –#J%²½&nÑrÏ÷çzñ=¿*ù�rÛYE ê|+f¹Ôå+¹~Ûãû‹Dåi„sýŽSYT›=u«„’�}8?û‹»úȬóz,ñÔȽÒòåƒ�ˆ~ hNéý¹±Þ^âñ«Qsç^¿^±Èš÷z{ÿ7ù=Çåw½åowpÌØ:c¿)-;&[d˜~U‹û¿*»2LÝa�¹Çö²èqÖ¿A©±ÖäÈWÙï.4ÞvÃ×#ûŠöæî{GdK~¾nL\ÿ¯+MÞ7x+VÕ‘b­‘ýùå`>'EA ÏeÝ8BÂ8ûññxr{~ú8£½’,[Ë5ŸjzÛ{a©meîÞ­KhG×b=+i}k Z)®ý±0~·*gÙìù2�Hžn"�RxW;²`ÑTBv|8� ‰øÌätßÕ³<�y0»ù+êØ"é';ä¹þÐεid/ /ÅúµÛRÇ–êÄß{õé15{؈¬Û>}¾\sÂù罡˜o½Ðõe©52¸Šb!UXBïØ ¸ÝËŸ°÷ÒˆÒÜÇ@˽Çeü­‡“¨ÖÆ ÷´Çñœn>ök3j;ûë>ûï• ’Fã3+¯[çRºT5•ʪ«kÓ©ÊßúÃ}ƒbc†QSÿ‰íƘô<Þ£>4©w çú(wÛxD/vèéúÅô¹nè°Hô>þ;ªl¶8Wš_Ç+§×�.¼ïðË­ŠxßX9_¡3_ çü-ê à v‰ªyÑ €@ÞŒ›þ·ž(�‡u–@®Ñ$OCþñbÇÆF�Gr<íÃKÛ~›Ï´ÝVÆuPë †+ž¿››øs•ÒøOK$[]™i�¡®IÜçðqnäb¾vé%?·É6lëÝ3Kù4‘w ?ûbýØÉ#ßÛ�Ó?XûùÚJû-Oœü¯/³â÷QF]·nqôúo½¦ÿ�¦¨ÿ 8btM1óÔó}ÒôAõ^è½Ã7¾‚Áibj|–·htëfð¨=ŒÔÕôñ¶„û0Ñë‰ÏÌõÉjDZ�qŠÆ¿§hïk€ÿ?*«óÉ,ŽªUÝÌ8ŠzÝÍJÑY;"•¨lü5@Z†}ûvs2�ÈG4sº}гýù‚%Â6SBR'ø¿¨ëÁçÅògÐ¥Úÿ‡µ-Æ7[h}Ü¡°)×¥š¡~ÖSjaÎ{g1|¯XæB|h£¹XŠãá¹¾�Ov Á‹g¤5¶¬ÝÏãÙÛåXçïúÝôAŸÿöïúåµkÛV3âÿ½¢ãþzFyÏ¥»{žè_êxz`øò˜²jµëŽhR¸øø;+³Où׸ÑA yÏwS¯úýpqÈ-C,7êó"»9ô:©¤ºôXÚ*ñ� Bÿ>@"vÏ®™Ëz@-£ßØKÛŒ1c­Z]Í}w¥¦ý«”s颌ú-ÿ¿×ÖÝ–!­Lå‹�¹úÀç·Il“RæcϪUãÕ³Çë‡×îÅGMëï4Þuƒgd_íÍëÖÎô¯á¸ÿÖû åQq7Í\gm$„ä*NK>�È´Üo-n\uý|û«uMdZÜ%? Q{V•<Òßú�V¤ ¦©W¡Ô1þM&½Û‹�,þœŽÌ�lÿÚEi0oTMææ{,¸�Ý¡‹ýùë´¬Ò¸È5­½9½4ü�޵Nžã嵩´¨2‘wm{®;ˆ.ÚZ˲d¯TÝÍH]ž›x“F»Ù˺¤Jm�úý<úgwÐxv->µÝï†_Ö>þÐÏLá7"Ãûˆ†Sÿ()Éé)ä<ž…{ºÌá8±.›ŸÖ%‰uù<¾†âÈàVÕgÚþé”9‰<ÁúóäœQþ«!ô½ôÅ£'9óŽ£®³¾ÿ*¹Oâ ®‘7쪞j¯Ôú¹–¹€Ã»¿TÓÔÒ2^½ÆºGôAú�øý±ÄacóŠFi!>0Â?£Ï’ÞR([».Ï÷·Šß‹Fæ-À=@€vN[{eÜ»8‹ 6)…«Ñc�sØú½|p‹ÞÍøø¡·Õv°-ãO¬QÅùä~©tRú¹¦®[oó£cfy¦¬wX+rö!½Z‰ º«“2üÊGz ¯›®~Š4³ä³^dü(Ã2TI�ö¿ôaEl&ÀP+7ý{ iÚÛAcØЩ@ŸB wì€ëÀmù¤¡ÌFP8ÇÖ˜&(Jëàà´ïdžWR+ªA�ãJšä\ugEý壊¿s÷úéæ 5ÕØm«á Ü£=ÜNõøOï»uOi6€îº4Ï�N›Aû!?Óä‰ ;M²-M60v-½d°ôº®xtTˆ³Y;ÿÌÖw6Y›zúúšã=aõxÝÿ ®7à ýñ0ªKG cÞc0šìOjzxxðU·nÔ¦�}Æd/æõ*8d©úrøë…×Ë‚µµmŽfhaë»ú¦x4xÊëÔÕ9X­åó÷ê}ú /ÎëSUÓÓßoãzlót¤<;¾Ë˽îõÓ±L¤IþeÀÿ44×êœâôíW?XúhçE·Ì´küíòlðææ SG€ª³sÁÇõ°,Z2"½vu¿Íc5M�QDA€‚À€ ÁEiÁÏÚw¯÷Я�5´¹j†6-ƪý®›¸¼©Ž¨,’—Õí, 7IU¤l^/|Ž„5©‹¸S�k.GïV•YŠc› �ÛÈÚʆ‘¨õXÇêãnR® 8ß~Ì Ò þ�¿22ª¼—Ö5ì“a(uø&»NcÝÖ0ÊŒ©lœŽ\-’ ÐÓl~²ñ8ËÜðrùÖz¼)€uúhïMçe„G™’å÷›~^?íâ,y£ R ¯nûé“ -$ò¨!pÙ÷ÙÇœno¼â;¿ìGêäµïžI˜­ñ·Ïqoìás¿µÿ:ó»[}¾¯^�ĈM§ïµn¶ë˸)××ïïúÿÞÏÇÃe÷ù†ú\­Æ¡Þ´y7­¯Å¥?ŽÍ~º|OÉóþ¼nÓókUÝÖǺ;ŸoßËÛmÓsHÖ_ fuÞ¼ÛÛ06§aL€ë&½\.9u¦çæW´f²À¼wàöm°vc)’ÜÓL:ŠùÚö¤ü'¥¡/}´>´¨õ#?ùUÞHLÖ]n©|mwÈ=gu 5õMgI_Õ–t ŸÕÜbu4£Ìžì2Ùø7ß@­Nè?ºí '(è'#iž~U€ °~Ü]ó¿|©Ý–xŽ+SY˜�åU¥ÊL(æ>v{Ì•{€ }akÿŒz[qé‚îzI³ã]K˜Øí®`‡ Ðãóo+*ý0.:zûÌàq­M €÷‹t6ÔÛ\4aƒw ¢Pè�^¡bf’í‰>hi°8Üݪ (t¥6 õµ±æ°]ÀÊ÷÷Ø›Öc>â�¦Hô[`R‚/¼ª NÍØ—Ø E!«CϽÔ~M@‘ écSÁˆT¹µuú°P0-) @"½™_@È fçþæõ“õ•F»‰f§?¦jÛ~öá‰Iu™ú‡ô Y6¬ŠÕŒ'Òz½[㞤1Ï.VÝyÄ ‰ Pèv3Çhh3–?æH?Ë·«®CÌñùàþØJœŽ åQ²ÝÞ–øÜÁ©'``+Ý %Žt=¡ÿ›>õ=lf»ß-ÿd7˜$®wWª5/¶ uæ!6Fô¿P½äÙ L!!y÷=4!âg4Ca†9� ;3ÖÌ{‹ŸöÙ4ÂȲ+¡¼à 8@Hà3ýBW�aÃiÏ18u·½§ ʼnÎj@„eEÀõ=¿^†:ˆ¥ë$'Ý)’ Õ[ÕäéïÞ†-ƈµ�è�ºäJC~&ÿ\2×õì•ýê”q7·ÌŒþ²\`'W&1M²IrPä~c¾÷T3Y¡í÷Ø-§³„¦ ã6}ÉÛáÁßþ.v‰Í,úÜÖ£üW&¦[‰§/a&ëµ/‡m�»£É{·6Qö²A¤ì�ockU}cg›òR:ðø§¾x÷Xô9ØË|~0†-4šk˜×|Ü~†ÍçÞ§÷|ÃüÇO›Wí5ÚµÅ"ÆÇ—ÕÕu?£I0A™›Ãù} Ïí»É]<-YÔ…M’Ôq±>Ž£áñº™îT×ÇdÚßÆÆ±·iXwÏÝòÞ½.ç]â\ec’»àíH1‹1’œøÏùW ¿nÀDEýÁüûYï>ãÕmã¾}8÷þ"q/.®ïŒù³9r‹ ufª‘OggS@ô M"÷Íùÿÿÿ¬ÿÿÿÿÿÿÿüÿÿÿÿ4ÿÿÿÿ"9œì=Ôx‚;‘èƒ=¾Fl;Þ|–ðñƨ$ª¯ét}JGÉÞ5T|¼w=ÆxÓ¨ÕÉ‚ôõð=lH²nd„Ö“éíWx0Éç .@|ÖÔÿ>œÊÔÀ£gI8ÓÇqsšhH’ˆŠÔO›`ƒ±b÷|›ÁÄÞ�&ZÎÞ­ØF$±Tœi?3Ë� û©5C£©Ð±5 "¹??7gá£/—9âRÝК-( š¿üP!*ˆëöÍ辡á»}(õ÷Þ+…"€‡ƒŸ(Æ/ÀÌ’“s#uOÿÕj>ê:$¤µâ=ÈÒýØ7Zuõ÷�O‹ós”X„x€<ü>þëz†ŽW-éþÁ®{<®;óqO/•.Iú£Fd¢Nޤ$$e€zfߨ¡÷]o•¢Ã}¨Ù~ô6Õ§ÞJŠ—®,T6½DôR_”BVì¯Ó(Ã�`ùá†ùl¦ÕÖ¼”vàd¡ŸÏ._£¤îüvê²÷ád·}êÔO;üÿ¥Ú[•æY/”ê@èÖ¸5 ôî²cí™{ë„g Š­$¹TÛí– ú´ºµ{{ãó˜ŒÅOÝÖ!‹â}¥ww¥|jŽÖ»\áViÖ+çlnö`íÞC”bX @fx�` ÕiÔªr¿·üùdÖ““:‹R†ßÊGÆPé\Tiä…ŒW]�_Aïš”w•K¤(˜Yï´­í«Û¶•T(ðÌ1³TÞY¥""ØŠ÷M'"Ò`ž¢ŽS'® ÅßÍO¹{üñu~7þàv¸�G4%yNgæ¨K­fzï`ÿ½sªèZž2$).f»6ÆY®Ý¯<•‹�lƒÿªb;5öųϸ…ÊØcºOêÚ [ö ~á_­“C­Ü-ç ¢…ršÜFL@p;»h_’NHËtN« Ù¹4uì�4.Òå“Wmd}³uΟßY{�F?|v.TÛà6‡õϘ`S(,õþÒY;í¦ª–8`¡\+Fƒèò*SÞó?´ÙÌÞ&P®õ[»Ø�¾‘+j¦s´hW@†}îÖýÏOô¦ÎO¿B^Ìâ¦/CùOQmoiÛF“E‰¾q¦–�_³¦êOÿSå>\í#¡ˆy¸Ý“ÃÎÑþpL_ð=bAÐ7VÏȧA{¨+bnâiŒ¯#÷h„À>Ø÷… G|&W�þg+À-Ú©ó¹Nl9Ï:©æ�qã¿•,ã€&rÿÊÓÛÑÚXŸ×=êiY4s ÕA³>~ïN)�ç¢J�bwú¬Gôëuߺ§“aÀ˜=„[…ߪ<\ä×¾ùÔ_|ù ÀóÞèëo€ÊÓl4ßÀáPùtÇ©u TˆnÌ3à‹ú…C¨Uoy5*}}ÆÜ!ˆ9f¸Èó:@Æá�¸%ªm_ùyH�½Âé)Ä­¸�ƒ£ñ�±�îî¶ömÏÌ8��þÚÌÏ^Ï뀜Nÿ’ÄË©ûaDƒGüÿŸ÷q�ïª-&|ËäôÁ"/`JÜyæ–·]¢Óôãuv$[‘“xßtäþ“̦X"2·Â:ä¢{9¯}¿mú{ROá*«9­ôÁc$Âx©'C7â*G,Ÿcðÿxö¸#»qFÛC>Ϊqã�m >FëÐ[6ô,Ö™¥Ñµ•jfk¿_� ÚüÿL(/ÖJTŠ'~ß`L\/¬d0ÚúBV#„ …æ&Ø&hH3E]¾Ðmï˜îbýí¢ À”C0 ¢-6ÎK„¤˜{Œ\åçË×ÈD@ÓjH „ñÁ‡_yüåP Ûýpñ€ê± †”wû¿ïî;Œm×Y×W.¦"®´ZÓˆ½¿�RÈ~n ~åe.M5èpÿëçû½E¼pñ÷œüì>GEœmÎ9ÖÎð£×Ÿ^O+g»Éa)ï}äO+¦ÿ|o™Šðš kŸ×)G&3\B+ ùå$ûН˜#刿l³Ô²â{™¹E‰8õ‰¿¾.ÖóGGþÇs¼ÔÙ»®ÈŒ~ƒ‰¼½„“ÿ~ïQY®bЪ|®æŠØëmÿiÈ "ªvçZºÁ]Iù¸˜±W{Îۃ峵ü²œúð˜Z§¥VÙŸKöîìÖíÎ#|ô³ÃÝcä¯ÛKQ @ú]H *©© ‡<ó» ˆ ª¿�ÜÇ€]—ÕïËgAD` �ya&÷Bö÷€8YÞI…HZ/çÀ™È¢{O5á¤V…ÁÌ­ \ã'ÅIÄËò¬ÿêPg㣚ܙ“•ÇA�2Z¼Ã‘9Ã<ëÞý>Ã<µžÃ6þƒhÓ°ò²½¦Åt.YR&�@$�€¤¢ˆ"±òÅH•m%Ä 2µ¨ü!Õ³èNHÒÉHd ýSo?† ÒÐÏ PÔ��”袺wêSÓ“ ý÷3Ï+-¹?÷ek‚ž±·<‡ñxû6ŸÁ19¾V»o×ÒO<‰ÿ–ó Vï�dÝõ)”qz}£BìO‰ö,Êo=?¾Qo“+“=ËÛ»|ܦãÍO¿)ê3æ–‰Lš}Y V 5wxŸ lv•^_Hç]/Ñ¯Š©n¯·� c6æ I`û"Ǧ�²·>²X®É~)ËAž”¢Ò‹§W—µ�mˆÉúýº&©�“†tŸTò3=²áøùú@äy[.ü¾fߢÝF'Á[××±Vie”]^÷w�L5°k±PmxÅö v•eì´·ŸGžÂ#‘Ô±¯t"²ú[{òyåAuz€®4o O#•°ž¸MÓøM`VÍAa X•*•Í—škƒndosÀ6’yuÔ£Zªe fà LYæÌùOÜú;uNØ/»í”[|U&½}_’…qßqÐy”t×E)+Xw³™±ýÙîrÊÀyÍ·ã1›§Œf@Œ,�凇'cc6¸o­fž'ÓW\¿ÁìçNùŸ0Ɉ‹ cU›«–+xžŸá–ëïÝùûOÎþ–v«ýi»D—âÂK³R3øÝê¥u�ëÈ’úm¥«Úsçÿ_/ÓÓÕëÔ·–EÂ?)}nmߨËME 8ÎÀ&u²±â\_y|4ñð×£xËÞ~]3¶–Û–¤Óõ{ù÷Ûåž›ã-o‡y¸9ÍšuàÃÎ'ŽÐ�tEI LpdzHt«�v÷”S&Øþëö®ü“®7¿ƒËg»Pù‹å/Šßp�aêZÕgœ»÷ƶä²ÈׯÊÅ÷þîG^ùÛ­3ª?T Iˆ3‡;ù‰kJÎE†Ð–réÍR̬Q¥‘�Ôw­cË;´› Z>¯u뒼䋈‘ûÅÈÖÁv©™.<4^Ó)@cm€ÏkX/eMý?"D’ö>ž±Qæ«åñgÓ®·v5Cϳÿ«\ºÍ¤ÀÜÔú¸�“­3uáIÚäŽÊR@£T˦·ˆ� y°­ €ó‡¯K Ð�Ñ‚pÝp¿äÞG?¾!  ùM� ™É€Ü–å.°Ò‘‘éâ€.θE¡S,ú¥®‹v[Ú mq�¸vÓQMGZf/i‰‡£è@<�“"CÃËgV=Âê/ 9É®¼çÏ/GF´ äX=ÐóŒ‚$Ó,8àtNÊ}A„k-ºµàÌqª(n ô^eG%[@C'ÌïåîäKͨô¾W PL°÷}²¨f™³/–íFkÿeÞl�­~õðàdz¨-xƒvÆ�Ï>�9™˜?Âoܘ÷ 7žt¡P"Và�Ç ‹Í˜ãåz6ÖE Û½¼^� Þùôé÷ºŸ©Ÿø­ùÆŽèÒcÂYÑ6ÔLà;ºêT¸ßÕ•Œ ´xÑ[þަëq‡òž £]ýuV€k/ÄîÓVïLpµõ•ñê5J:ZaÍÑKÞ¬aKžî§å‰‚«¡ÿÍSV2Ú³Çú°øÜ¬9¶'|÷½j;�gÎÜÓ¤ý ¯^¶êS�š¤Î®Ÿ ¤¬*¾¸8`Àþø*R€$³\,ÖÆ€Áf³9ÂXªž–Råo¼·ß§ÜG?ôLdŸ0ÌÌ]†œ€ÎÁÜyK±8 ]ì­ìo¢Ê¯m›² ª‹xu¢Ÿ %ÅTYôd�NÏÉÔ’ö–Ç6FMr5ÉícÛÓFù7;g i‘ÕÙð¼ÄȸæW2}kÇŽ¸çUI’Cä¦MלíäN"âkŸɽª½ŠÁ»ÛD–ùhm5nsN[eè\òÎä²ô+¢I:t”8jNdzAíiÜÑdµ±6©ou˜�g/©õ�¼=ð˜ GÍã!¼GK"à­êÆ÷~�ЩN%Y—~U äôÙƒZþ<Ç“±½ûÝþyžæÍå'ÏÎ>àd?¬Õ‰€ø×2Çf!MY|žï�ÚjoŸ/¥Üaf&ï:ç˯œ•;ÍzžªÏÔ�t^9Ãè³Ç·Žú{òök2²ÑeaâEcçY¹Ó}÷¼nc=½Ö¿o“�§%öþVçYŠê}r>©2Ÿ$m©ép+öÛ%*ó̵•߯é©mÃõö¶¢¼bÇ, _¿ûO)9Sxß×Õ”]YHým»3¯�ä~” žÙ[¸Gð€•ÒàEÞƒx`ÛÀJ)5´Ë%·\Ù‚…úÙ»Ûkx­ª)�?¢ü ¤Ô¨Ú;‰úë«� »Ï2[Qþ˜¹ýµC�y£i[$¼ø›lÓvÁ%‡}ø£ Ù"A»ÎãOîó¼ V|9„~\(¸—SÔ&Vñ¿{Ôôhé7ÏÇÈã½ϨM$ÚòªhÒ";Ð.µq™. ÞöYGæ:ið—`w|ø<¶,2=#u/ôRZ–Õ¥žÕº~«U«æ=ji¤÷jßY»€$: ¼âe{YUj}ü>Ï/ 8@ï�ªHôçÁK}œÓÒ—ó¡T@š'«hC_­ˆ!*Ù:21€ \ÆÃ¾êl¦+¾È"žgj�—Ôd¨TèÕÉ ¤˜�t€gN˜’T/¡9¼‚øyMÈèµ<êŒã.¢]ŒE–Kn9hì¼×ŒêôC>ö  ¨1E`\CæAù½û¾çö~qfZb`®™ @$=ó¢ˆz¡–!2H<Ý«W bf1ö-hÉ;åË�tIÓ÷¿-=7 Á»žà†hÍQï�ÉFu™,µµñ4;ÃЙ…í¶`Ó�bB…sµ(ó¨òqye ºVæEE6-fÞï&°‰x�Öƒ\V�¯Ëïžæ #:{…÷ÿbƒÀóå¸C(U.âÏ—! W4áiOµ5›b8É&p­ÉæFâ úPÆP£x°÷þ;Õº¨ •mùwÜ·b€å«î­×^§Ö«Éæ4ÃÅ+öœ¯×½ª«�Ú�FÀ§þ©p1D«ÜK(MUµ×v=ag01LSñUU¿Á‹¯¦ãÉF¶&{�T¨—¼ûmãkù«Èuè°áygä·#y^µ¾D°þ2±|ÖPýNä;Êy’K <ï7Òçrí7ƒ WºIä°`%Öƒ‚Ø=˜¼\ÕùáØR{ËéYϤŸOtÒt“©ÒÄŽ}¾ ÌÏбC»Z'­~}î­­KSŪ°|:MR´÷îß² ÅD�<¾á?“+&—4S­L é¿{€&ŒZ:‡ÿ ×úGb¥Dtä̸qS Á¾¸UY8ª¬?÷×àô·”q(«<ÜÛr¯Ç2ù ç¶—\ð—èÖŽ¡ãÓ{ðð_õb™b^‡çÿùÈÞ\OggS@'ô M#´³)Bÿÿÿÿÿÿÿÿ-ÿÿÿÿÿÿÿÿ%ÞùÛò÷(#¨‰Í¥o!®AG g[«‡GÔ¬¡àÞã0¯¡× éë_�ˆú,w@$k§ï×éÿ™­Uûïu�wï䓯èI§Ø‹-¹¥XÊ•ëv³„aôžÈÂOš-å<¤†vK¨ˆ¬õôãí*týåûÔZtsFãÄ5R:-7Nõ%¯TU¡*àÌWn‹8¤†é¼TjOŠèì‡Ò3 /ór1²-[€Z¿µ(h¼¾\²MÉ“v2÷UTQíڀʛ±ÔBĄӊÎ8PzX õ*�û¯0_^¬NáÔå^D_½rP€Ô<º«üiÈ2­µ(*ÕÌ¡ë"[ëñí*aN­ªÓó9¨Rµï›eÞÒV5ÌU3ªUs­ÎïÑvȸªfÕNòùç;5æž�ýy!«´v_Ã%u·ÉãmK°å³¿yÓ`uQU„åõý™1EÌ|õ$ï-�‡;Çð¨×ý_â0ÁP �þ ‘è³_úh( µŠE;Ƕe;(,% ›¿?õ+}ËÛG¢‡‹û›lÑ $“9Ø2ù}Àƒ�á�ÇØd B×Ö×H0ä%½*ÕdÑÀK&è âŠ=9¹T™Q)KáÉ÷Ùóѳ§J¾ÌžOvb/"›—n0=Éf¯ˆ¸[Ššìêßv/ʨ×ÃO÷†oJÞ8—40ñx#/6~?ç_Ý{õÚ• às·œuM¡Ì÷‹FG]•þ6y{èV”¸íµíþÍÁ~v©^Ìu)„à�…æºßaù:2OÑù~Ó˜"Î4ã•fëÇÅ“\ÞzM\�R~¬K>›äyôTmì¥<º]·úßÞe±xw’ÍfŒÖš�å?6…y@öêm ím¥AÝ¡«ÛÑ‹‚È:½½/$“»pì0S�¢n•aÂÒ‚’žúž\Æ0Xž.Ù(žgØ©?•É÷Jÿ¹w¡OöÞ÷«e5~·]?ÖCïÕêaB'KeR¹éñl0ñú¿HY/G—ç…B}}eÙeæŠÂ \Õ{à8… ïp >‚ž �óÃfä ú`X·Ê턼Š*ùÌO–ªö}¼%ÄóZ)ÜÿIËöA5ç)�¿W*µÓí‘âI+¤½¥àŸ-õ‰nÈ5Ðã¦oÔ=þÑnü�áúGŸq58U š¼ùnÜå[)D6y3ª0_­UJe–ߎr)©¿m¡‚à×s Ù×ÈJ"ù{¥ i€öV€Dvñm¼2@"òîëÃé´àñÞJÀ(�)ÖBŠ‚ív5DZë\y+«QqLó;WQ ŠÎ–î×·u 0÷Õü÷\ì?ßô20“¯OÕ¬5æßœ`-o >,/ù�çrQB×*R+B]�ågþX_¹ºý×�”*U†²^ðÎÌND¹+˜ÝZRÎ_Ã+®V´ÖLª+õj•Љ òЍ @:³Lú”ÚNÖ® KÄ´˜ê‹]@Á0ETFyO÷G&Coûç£ÖXz§áKFƳ*ÎnE_Ð¥ë’Z‚‘ÕnWãD_Š$ åÄæXÛ‰iüÜ×¥ 6Ö ' 'Ñh,Úd*;fŠßG³HV‚káæëÙø�Ђ՛ÒÀÁ»ž`¡†‰ÕWáãáS>§ˆQJÈæ7¸ö¦•eù*ßáÿ3Ú°5l ,1{CxUïãuæÅ;LA®K€ G¯¨wýûùÙ2Áü™EkC¾´ÒA´‚ªÝ,ª y&õë¿yãD©JAþÇ�·<\ß/á5HÈô­óWcýÈ·ˆO°¼Íù±öìóW3%ãõãë·~�eÕÓYnˆ-2“:®õ.xl½ÕýÚØ}öÕ¬ñµQ;Õ$)7 k~ØýâÃî/ª%Nowç™ÓÃïãWj|R�@vF¢k‚ ´‚…25hÉ&×3òÆøÝãkƒödÕ|YýÿæRx°²YN�•“óØËû¾²\-œ7HkUƒƒ<÷î•nÁ¯îd“pÈÀ¡HÜ“ÐZšcecoWÒ½`ß›kïÙ²ÖQ4J/F¿Y–¾ãy'´C 2zË8$™k«jUáž�®�‘BH"õÞ�K˜2¾XýŽŸd@­0ˆ€ Å6áÔ`Ù²QȧâD—çüØÕ1^›/�|pÚœóÏ´"šCã™]/xT?^<‘_‘Àˆ'þú‚\�Ê0µ-áø‚v› 1qd\5Ù熂Úý$�«]g%Û‚JHücg–ä¤ æüÓŸÕ–î!ÖÃöjÛðµßÏåc¹ÄÆÂe¯6­—5@Òœ~(ûãñœ¹šñÝÙ›¬RN%Ôˆ3Ö%ëÔYuði{ÕÏDtOŒ|Léz{ê¦Ú;#œLcàùIÂêØ.»Ïëéf5]æ{b?eâÊø›(å7ß;®W “•ÓÃ"Qÿ Ïr3î*p˜‹�Ý{Ü—Ý>.¨Þ\ˆWºx`Ï „ v†ú�¶¿< Ñväù€MKÖ QýãØ_AüõTuô9GE^îT~ht]o‚¢T65 *â �È[ «� É ‹�jÿs�|®n4à�[oÜ híÊõ«ËØ‘?ºñÒ(ØY*dJEZ5{<¤$\ÏÉ¥«~êøÍNýѹœó^'EQ8´×›CŒŒD £ûÊGWŠŠÆÔ¡RßñF›’ée73­(­O•Ôx¨*ªð¿Û?H WY yøzØ ù÷ò÷<  [¡˜A¾üqÌ ήNŸÍ@qŠJÃÓµÒÔhóõIÊ“Z¥�8 ‡«p¤»*�°ž/zm›«‹|ÌT’Ü�‚eA�… ê|¶(NLë©i(’§J‘즪G‹6•?V,r´¯WÊ•°ƒ™ó5ôœg`y‰� gKvÅsù•¹PET”ÞuSåìwF!¢Û¹çå¸"¢K¨îÈ_ �i©›}ó"8‹;̵$„¸9$03†ÃÕ>äRí.€•1Ð'Vò%eMHÀ÷];y�n¹µw$gvK¿Štèx÷'4l¿ì/ö÷þboœÐ/u ¾Kal³å\R†ö}šªÂÓµtèÍDü–Ø’fW1ö­æ.«ºn³BüǴѳ¾ºW¯�êáé1ño3Õš+;0Tk éŠ7°;ÙžX¤ƒ£)5i&"Z.Á”¥Y£ù«–xËa›±¬?/ÃüŸ¤_o­�w<,ñ€ç:Y¸º˜Èêpš8ki‹i‡ËúëIN.¡›w�Øeïü\±XÖW™—D*NÊßD»í*Óü-TŠ&— QÔ‰Ý/â*õ0ö@ZN~ã+üue\µožõºç*ê—óºBÎë~«Åàªa3­ÖdÐà›(‡•­ÑÔ±Õ[a4†ßÑ¢M^»ámb·¹ÿ°ƒLî9ö’Ùj�Ò�!ÙTÕ[òxö‰rzl7ÊB°ôÇØþxOœë�oGmK‰ ßäqˆCòÝ¥°ÌßüæDb\ŸÄcšÏÍph'˱�#ø›T ÇÅË6îë9­£X^w~˜˜¿�{õÛ¹Ü9­B\�â ‰9_‰”VxÓêÃa™Z�ÖäOÛ�txÞ€®Ù¢‘ÙúŸÃòþZšB¡S§‚”O Ñ’R5}çUöWl}œu�X ¶œ“›ÇÞÓOh…©6?�­ÔÞ \‡û˜¿>õµJ7cŒ³é˜„Õ­ºì1à¶„óàP{z0m¯¬�¨T5ww™´h<§?ºØëáÎT‡ž+¨|ßô¤mÀI© €s4 ½÷ê%cë/óÃÓE Ëè[ꇖü--�‹Oú0­[6úùµMüâ4”€Þ‡q\ ›pÜ®]ŠGuDuý`UÒ§w²òpˆr½Æ´ñ×^,Z@Q®\¦ÄƒÙ‰†íd™Øÿü¾è:(F«ÕÆ~, t—ªb�.K} =ZÄ}ïƒTà> ¸u,¿ùô^#~Õs,ô“gä?ÍÆ&Ã÷µŠà*Ý¥á¢kÒelñp¿[ïŸÒ ]·ÖÖ“ú„'6Œ¯~–ó™Ý«¡èÀ%Ur5…´™;×ÕĪPqÚQéb¯Y{LuU|Z͇ݺ~”’¹þ…xL¯ð0‚4·AŠR­Ð­|î>¼YÈ)“ ‘¸ǾduÌ.úÂW&³•Zã܆U×céªc\nÝzÓs›1�|¬ÞeŠ”™Z¤ Ù–9f Gwo(N„‰¬üÞv}‹¹!ÐHY{ìLQ@Š�¡zPŒ‹yî{Q)å¾`Ë EЇ¥ƒÓ]©®±z+¶XÀ],ѹXà¸"äÝÙûd>&¯¸ayïôºÞÅѲ´E—~NŒ[ÍÝ¡îBù:|ßq1€þZ5è6ïo¯ï`=F�ã§SdØùògVå‚OggS@7ô M$÷·£ÿÿÿÿ'ÿÿÿÿ0ÿÿÿÿ2ÿÿÿÿ#>*¼‚W�˜ ÜŸÀ“>ƒ8@(–ÕõÕèbåø%ÖÉ5=àE«ód¿Í'Ü; žJj ¼ãqüV·©ô«6¨ü¯ŸNˆº„ ð ÿ«û� ‘gé_W×, ê‡DC^Ïa1U'²¿žì�ÙÚ†W7®U_tpRÆTÔÑuU%�–n�½¢ò€‚"Ô:Ù©««‚”I†Ž?ÿ§hÍp¨dá5\ÝÂ3æèªµ>/i Ž*  ò*©­ßš#@§QÏŒ:M¨i ¨(Vµ‚¹ñøè¢pßü׿ˆ©½Áj 'T±§±€#)j×.N�ί*€é0׆}õ²/ƒÅ=²uús�º"Œ±èèZÚç1LÓ1hï*‘@ÌS#*òÝÊ…Ù=´«¨QÑì]ãr�VŠœÈªh×€ùœð Ÿ¢ Š «ßŠëÒ@ì@¥˜¾hDH�öê S% mÁLY"ꇻ¸öÏÑqCª) mO{xY$R]„êÈAã5>µh]¤è£¡™†"€,À!øu—�×-{¸)¬¿}ÁFÜ—+¾_VZô•€íݯ?¹u‹v‡y—*Œ´_C(eçu27~ù‚±õ«h„kV�õZÉ¢Þ6f\Ünܳ v—y÷CúÛ)!-(mè HÞé/šãóU�&ií,¤M{³•f&vuZ\ÃÌ;sé×XãþÅ68Ì79 =€î¯“Û12_+˜o¦6ªPÁ�|«ap±¾L¬"öH$ozÿ‘•jI/.˧!ÒÜ(± &²n Æag“¤}Áç~Èb FUl�L@÷ìµÙÛŸÜǺ]}¢ÒØÉ#ê��>$$±Ù¼Ø�Ùh•h‡b— µûB/€¸2;¬gµ„™ŒêY$!)´ÏoߨíØí”v�n†�áæ¾§~“ét´ì`é�2ȯ<˜ÚXûŽ!Æ/?øÞ¨šÀýT+-žðàûŠáSYjðáÌ ‰ÎûáLmÒà(Õü>â7³,·£«�NøÞ¬¡«ß‰òã‰Ä%®à2n�XôÞmG$be7öyR^⎟匔È�»€‚Ó4§oõ�õ8Uà4fÉÜìã™Ë¥'ש<)ùKYŽÞ×þ—Vôj·Ìqº‹ ï=áÎ)Žž"…¼q{ºÀü%ôâ¯Ê¿{g©‹¡!ʵnRk98AÿþJߺ¸6£Üå7[½³Nƒ7íßx¢Nû»ÛK‘ÓVÍ™06RAÊri?n«ù,[<%¾`/Á+}ô²XI±uD”Q«²;£UÉÒáÛešÉH½ì ɾ랬†*œËCQzÙŒóS ‘5NŸ¦¶»+]ÈâÝ\õjºFáÕ]ïÉiÛoŽiyxO}1�Ä­€,!çÁ/¶#Ö ‰¾ks÷Œ?¼Í'ü2ìÈèHnò� Ù�>*<À3={˜!4x·`FdæT�A:Bß*Û>º! —ˆ¯!]Ïç¨�„4Õáül§ •¨òh‡ÝuÒ¥»��®ä‰õ·ë~n¬�³»B#G}òÿW%ž¾­+2œ_{Í 5:ǽ4B_j£¹áõà J:µµáâTv©�Š¿útÆ¿ô¢–çјܟƒpDÀ ”õ�©‚@WÕóäíÑ>U©¥‚Ö¬õ˜&¢«'Çg.¯dêã&IZ:ƒb¾€¢N:{}U§©•ˆ££‰:Ç”P™þûs .×tHT�Šçé\ìe4Ò+Ä ïG†bj¡ˆŠ$g­"‹ð‘ÛF–¼Ý®d\V'ì½cþ¬E‚’Lu¢ 43ò®ŠzG"s�Ñ…‘îßÙ „¿mß²3jàLY¸f5æŸÈÔD$j®S¡� gð€QM™VîWr5�ÇžÐöÀÄû‹¥åŽþ•íÀV ÑÞƒ�Þ­:㡇c?ïÍ÷æÑ à€¶œ“ˆgs/Å÷èT}~>?JCïÆ1ïoãFZm Ðâ²ÑøâkhÈBxÖ³º`W½ëü_Û£nKy§&=¨Ò6¼4íK)´õ›gëøG0wZüü¤)ñªõë»'?“`�u�6Þm#‡™Ý“]ì_£ïq”´Òíf'|«&.Ò·¯úRŠïJ‘Ic½ß2~Fˆˆd²Ü¸.ÙLk#o{x€�¾H¯dó°üštßžúBlRÖa×I,ûú—sU{“[)¼å-ÄŽ»DAí­ãé!Ì6ü7Oö+ç8T�ª #™®ü¨•43ǃ¾3vµ—mTüEÍR”~Î×îo^t>úfÛÙ¼ý$�Rl¼I%í¸xk»“ʽ€� à†ßÅ”Ù\a" /6!1’åh,©-Ux÷ªÝÿË:dç1âa',u6ÀÁfozêÛ^¼[¶:ÔªàG¤‡i>ÕJ®Tƒçº_�ÜB}á±Ýª³s$¸„‰â�wÍ“æ‰ß×ÀW-YÞûëîx©…›¦ øÅ<¯ö>O¯fŸ×k –_°Ù›b‘2®N7âm�»Àš|èJIa¢¤¿}˜‰;üè†f€·;�‰É…z3zÎÊÐ^ćÅ`>hùM�SÝ'Ó-¤®Kv¤ö¸.98žÚ˜µÍc ”®â¢j䢌Ôçvè¨WXžOf²G+Edd¸YþlÍG ÊæwWûôìJó, kžœÖnºaBÎ¥37Ø?…w«tˆâÔÿy„ ãS:,# N´¾+ ¿Ûk]èý['ýÖߣìzÎòó5m½Iw"é}Ѿpµ¦åe6±‰6S•0¬›ýÊ¥ùœí)sæM�¼ö—·Âîÿm³Ÿi¿(’xéz, µÉ�H—z<ƒ€ :Üϸ"Œu5N�À-wOÈ…‘€-"ªá„¾Wý¶©˜‰É&>Ÿ¶wÀP(jMxꟾÍvÅÈýdzTäæéÏž¦nÂ.l‘.oÙ[=óÒŽÈm-¤Á3×;é]Î’÷OÕ¨™’•hñ®9VḈáÍãe«$²Z§ÑÏëÿ/‡ø¯_‡©¢Õä{;Yÿ]в¦xF|EAd­Ìäªx!€â¾îê!ªJK¢; t¨Â˜gU¨Ò_EAQQÄ-^ XEAUŠ*ÊRûÏbØ:ëUËWbî—Q@˜ "õ�n›ˆ�¾—bTUõ  h ýlåõ¾µd —Á0kç£=eͨkj …±-<ý|ïóÕ°w³Ý¯32e"sÅI ÖŸœ¼Õ]Yr”8<+9Ϡ ynš¤ * (€ˆ»ÅÉš°@ ›<òªÍêEF€* ;€JY#³/פfýºVÄÄöHßHPŸæ˜��I–��£ $ ÑÓ§ ðþÏÁáŒx·n1öÿÅ' nýȽ÷ÇžQ  p¼9cXÚX^åµ÷äÓØ‡væ:�¶ýV–؆ýô—xÏ´:Ïu´ÅªDŒå°Õroïv3+ÆÝš[n[›ÿ�zöÍæ»�j¾ T×ì Ub…$ì—ò"nSœ;uYÁÆ©:´8k¹õOQö.n>?j-®GðºÃæê¥Võ) ²Ð›š4T“MGŠ×º…ÛWø0"žPçY×ä5?nYx]ŽB¬z@œ“¾bas)fšŽMº9Z‘˜©sÃFë¬Ûù fÿ'§I­ÆcŠ!“™šÒ};‚xp<,ü*ÉîÝú÷޽I763ÉP¹ƒë»\|FÆöáóVuÃ×ÈX´f Å“+Ð"Oó›²QTÑ<þvŠÈ}ReÉ.œFTQ¨¢:!穳wÔ3B Sj–:ÿ�µP—7Y5M‘òD�lYDRR =¸öY ÆÊJ×Ïçaeç©4N=h™jæÞ×U…L Á ÚÝís|yî+Ïä™§«j®H=¯EÞê}ǹ —¶˜FéßÏ÷‹gqWb­.Ú­±þ«IÕ˜ÕUÕÚ@(¦!ûÄX &zÎéµÁ˜æ‹±”Ež)0†©Ç=EëÉx>̯¶¥Þ?ýÈÞTB_<ÀS%‚ä¾¶ååãÑ¥e—ꀤ@ÌF7½Íž2hQ€:� €½x8õ™½B¨ý´8ºµŠ‹ló¦ÝyO—ö"¿jÜ€ùb�ñáö)£×{Ýɼ�ÄËÉÔ8õ—6…ó¡G¸°Ã`9¿ë|ik|H¨Ób–ž>’.˜µ3z³`•ù5\e†kc~äZÿ“bÓÚ.—ÎÞè|ØröJ•ðW!ó�H�/±¾.«‘¯Yó™.ß|J„�"øZ� ÍK=ªÅ?€j˜º”É–CŸ�çζæ<) Ó¼nÙ™d`œFs¨µžNßcuZ¼Js)+õM2§IzÍ:«|X)ÞÄK üÈŸ³Éï^òùÙÿÏ6LCe“ÀzÆžß´ºN±}U i¶†®Ì¦ìÛªâÃð-h¼p+@�ˆÓÜ[©B_»ûþ|Ù?§B±Ü±jˆP Œš¤ÔÍ�½~y„ï%¦·~fB?Œ¯ƒkF÷=ÔwÎ:œIàü{Ë#­ª•¶/ü/Æ…/îûUÂ<_XÞê;MÍWkþÐs÷ÂᆿÐ<½«{\Hôm:ʵóÍý¼‹ÞÎê–í¦ß‘<�8Õ1j¼òñ߇ÞìîÍ<·ÉýáƒW�tÄ­ï÷Ý2¿‹\Ÿ9y/¼ÅN#¹KÏÑz›8¿Ü®ªJ¸œçÄ—ö¸ ðìãÏÕ€a×,ƒýs�“ø\á[öõê|–lœR÷s¥51Çš“!ψÿË�Ò;f¹�t«åS þ4líXïÓ)zY(Õ<¬±(·ëüŸõG«™×3ô\ø<Ç>me_ò¹"&¦Õ‰DÝ$[®Q�¸á LÚäevÝ]“ßeˆ«û¾¿�–$Øûá°*šŸbÆC‹WXk ÆÛ^Æûfæp'X9~Ë2.âR±œL$&Þ<À=R/&³™½…»Çc±1ÁUÑÐYôC1ÿ¹9kMšw/m¢¾â¸ïÿïjÍš×SÊZ€Ü^gûîmh™‚.öã72&¤sL[Ô™Wïó¦""t² !ƒ—Lˈ4AÔÛ¬×S]ŠÈ^©SæPkŸ P›G'|b쬵µ”nUzÂ{”úso£ß“Óµ`9CDŠû¼Qs¦#€53bª!¯©ÇüDÔ[Kæç"Ïã<_þ#·Ÿ?µÐBÎ0�-õ0DEEëGˆ)""-ù®"Ò²4€ =²‚‘;"ÂA“Ç*9¤…’í噓�î8uèXzŸ)U¡ÛÀ9oßõæEMbOAs0 ºz‚áT€œRw© 3ç6)€¦}¯Ç€8ÞÛTðá+`¦÷…iN˜©¹EÖs7•Ξn[8å …‚ }Ü ×LËrVd#ÇU MÁ")†y鉞t S²Ð3"dfêü¥Z ‘÷ºg#M@ $C€™BW½°ho*Yܦµ»X¥´ªI¿:*^¡‡j­²Œáw«á·LMÇá}˜àüu£ñÕRª>äÆŽsTMè0¤\ %D¯‰Xá^Îë|TÚm‘x?ËU¨ÞXô]ᷠݾ?1ŸKOp2¸·§ž�åð<¬>ú#}O{~-'ñúÌ\[ƒÅÛ Jà¹ë�¯†�‹¹'²ËNÈn’3ù¥BQÚ¸•mÄDðã>þRÔØNÎR%Rt•ÌhUg¢§’Ž6¸Ùc/ó*4ÑXÏç PʶòÜ_ý_þÃeÈCµìR ¨zØzڬ髀D¹ � ›¶]ž¼hWöOA|à Ñ—V:«gZ ¥îîœWØ­¸Ne´y­/ÉûS·vYœ�~ÑnÁÉjÇÚ›,¾Á!êàBòùºÚxÏ\"Ü è½Ušu‰õÎó½åÞgö(ùÚ_wÓtÁZ ^ºàà÷Ahž\ÚFõdj°· Þ)ÜÁ=BGÎ*{‹rOéˆÀlÁYÕkÙœ¾þEl¾–Ó&}ŸuÑÝÐùŒÜJ.9EŸ…xOÉ…X°>ŸžêDµl‰ÚÍ›—�~\餷uòT2ƒëÝ^wåÃÁñúÉ>9êŠÔZÉšzL Ò!?h%€ZlZÑeêØ5Áïø»Ô¬]ÐT%‚ûM U®àâä:F"Üáò©�€¸§¿O_ÕAº¸¾ ²Y´¶¶Ò׳Rv'R3—›ŠD²”)o:RþzJT¢J†�GUQŒyé5 ÀÑûQ<5ÊZ‹,6Ô¯ST Ä4Ô¹ÔR‹+ÐÏ#?O'pBpˆÔ¸v7¦D k¢ÙŒÜ*/|´“*�š3À *¢º‚L™‚’Ù¬¡ ë^,�âYo6Þq'èpj5à[ùòßõv!“œµµû·Oz % "‚‚*övuÐ"C½9"§ÅEòôËœš‚‚늨‹HhÆÇg¦Š‹›§. �dHÃf@ï\"Í^Ÿ×·•ÿÁÿêÑ·Ô>]€È.�,¶qúç0=š∤ íYÍžœšol‚?„ŽX­bÁÙóœ[w}ô~“zsñ²‹É[6Cž[qoj"�jÔ Ø·•ýú*©®¿Z ôÀÛ–�;³=lù×Ò)Ü6Dº Ÿ—&'j|ÿøcaé!É=`²I¶n; —7�ø|ó¼ãâŸuDÏDFt{îD z®\Ù;@;G}¨•Í4 0ÞIe®B°ÝÿŠÐ+åñ[£¸©Y«•±¼1¢÷›ò¸½pëZ%ãQ "&Èó=Eθ,Æv¹sôó‡Ñ2É㪑Ü´Ìš3nŠ÷b)36È7Ý~Û��äéiúY¤úù^~ wÐ𢩬Ëd­ƒÎì‰ >UàY¾§¹Ø¸ jFå¯ß|™¾×ã‰ZêíµÂ›‡;Wà{-�kÍÀ‚Š”±ÁMWú=>†q’ŒSU¹qÙÔ‹I³ꯚSí:)â$¾} Åd�îúQÜ,$íeëÚ_uþ¨•Ù½?¬£eçÓóîFÛÍMÆžUyœ.Ýx ê+šãQüy KTÉ*~TWÆ'Tãû©¢ óy³Ì™o×£û”SÏÛE–±®át›n�XæAØR‘^¥ Y¿“Åé,ߊŸ˜ã}>ÕŠ5JË‘ªI‹€¦ G¦Ìò,$·¬á|®xz|2ÈšïMû¿í«±ê­kã¹,+)ÿÑC")z_Ûz'.·Ê÷Ž�—Ϫ*ï;`Q!­N¤Ü©Ý¯Yu³§¡ñÍôï:zò7¾{ÛB'_*�ØpÒa­�Ž//A!‚~Y5S4mJ}/÷Ã{»Lÿ÷%íyï\šï6©† õÝc¿.±Úv£§� ôêåÙ�øÊмãAD±€‹éÍXÌ4�Æi#g¾ ÜÉ{T<`*{³r�¨ô‰åòZ#ÌÜ*ë§•öÊÕÅ”Ï]šKïTÄ�‹FÀ¾WJÍŒ™”÷pÔïŸi€M—°r[yþ+[> É-�&dá­çÁ‹ÙRB‡µës @õ¨]ì­gØ €† !u¦‹¦æ@àH .)Þ§ú…RØK{S‹b˜"…ú¯ò]�?½ë,v-AâÄánÊåP7—½�ŽJUÆlâ\rÌÉß×›âápó;¿nÛ9X¥�Ï­sÁ•ûå×%{ìJ;* 6Åö1™_¤kÌ™�¯Ã>’w­Pæš²qçÛ¦æð´Cœa;ëq§¬® ¿‡ËV:š#y³è¥V‡éï+ePQ1|øÝÉ#¨6ÒtæÕÂAú+k¸Ä~gîÈsøgOå·<áñDž²®9+;ó“<ݱÉÅ\wEå !—Ùäˆß10gP�5¶š|Tý�rø­v"ž4ùätÔÂ.ÿw�;Ÿ!º$J‰DüZîîñïiºàaö𝯤nËÉñ¦ê÷B×ånºå,H{8-‚Í�Zö>ßËü¹§ß¬Ål ÑiÁRüÄz³½ÉìŒO)®HzOßVÁ$/«Ê03i(Œ¡Jkñ6jëËMòk \‰’Î ¯c­5Ñ©0H-½±'ºûíIÀwùpÖóyë,µy�¦lð£VªL–¡AÑ6¨ùsüêžÝj?~§ïWGãóÅ�0Â�5³£QbåeX‘á§~pƒ”€ï; *à˜æ¸¶2ùp�¤"o�;…Y,Õ°ÃÒkÎÔ ÕøÝ­ªf– ŽÑ¬=è‚Iã»7·œ¼†WWØÌ±×“M¼]‘ŨTŽ­ Ök� ãÜÝ!ذŒ’žIkg~´á±�žZÔÑÒWú¹Œ ƒl÷¿ßÒ\ôž k¾|6�ûh¸/>È÷ƒ€L|\·÷c<\êý0¾^�Ô§Ö›p?¶ÞëßßÜÙ »ìÌÛ4Ôµ�¨æl›Èd�OggS@Wô M&"C¸5ÿÿÿÿ!ÿÿÿÿÿÿÿÿ$ÿÿÿÿ$ÞܹGš?ö§NßA>âð`⨄n)··µ”Ð º·Æ�úÈ•i ë¾ÿç|/C<×>¤ˆü©RžNót�÷C oÊ»¾gÃûl…”ÕÒÆ¼Ø¾â¶³±­‰éÁ·ˆvœtÁ)2¥[3#£¦+Ÿ%™ÇŸï|«£È˜ÏOÐ1Z BWO ˆÇ=£» ä²Ù ˆf¥V´Öº¾^óÈîàê*t�Ð<«BçaÑÞúdˆ\ºVM@‘€‚ã-¡p€\3 C^–Ò¢`€Š‰èƒ Š ˜À1I*€Ö¨ÎWÇé*exξ¯­âÖOÑ"€ãyu>ëE…þÿßÓÒ‡�ë ¦�ЍªMüïIUdžUÈNÕx¼_¯Ûc,F½ûµR)¨šFΗõn* Ó.UÚ01;Ë×—b©�sþàíG:ê™"´•‘´ ™¹˜ຨšˆ×Sª@ÒËÄòú¤REjC-– hœÚÿüc7Ç¢õŠ‘yô$÷Õ;�¶‰m]Ü¥[a¶mYY|^?N-,¢Mº¦5�žAn¾§aFPE÷}‡ª]2 0”À°¼SwE`F=ÕbrXÿܲp WIZ•z?ÝíîA“ߪ £½³åK]ËÄ6½¿6•ßyî‹».ëwÖ¿üˆxø7�¿ŸÎâ�¶L\›žånVíÉÑ}’¹µV¡ßÿÖÓ1¼�ùè³çø¬ÅÚ•-}Û±ø¾þN¼±�y®˜‹�{N6Tã(í_ÍÏûµbã a/~n}ã®áç=ùE]\íjIÚâ˜÷-�Â*âÓƒ#‚ä?´�K¸ý5>Ñ¿öf{þ>Ý¥å�W7õa�Ô5ºÆ×uyýг¸%žëü¯B¶‡$Ç„u¾ìÜ!¹jo#õ[Ê�4ש½ó’7%§(5­ý3žŒ3†’<‘B!'s›ã¢ äC|o’O4lÔ u´é¿M¤zÓn=öÖ=õ;�÷*‡ÍÜ鈯 `ã¿Ý W ÿëj”……=$ˆ¨Æ¹dž�uyÕÔ5º{Žy‚¸`d£:a5¿¼¡æûØãåjÿù`uOòÅ8_Ë)²‘)q€'ÀITôVdÌÔ¨„<2Ù)–’”Êê²Wÿ~¸l&ñ‘ì-ª 0±õëc‹Ð/Yµ‚“k°ªüÖ wCùcò>>›qBõW#Ë´­ 7˜ÙÁs‚O6±Ðò¶w‘Øø-æjìßüסóWÃVŸ¸·ìÿV‰�u\ÀÙûž¿wÔ´¸‡ëù ݫۛ?ÉöXå]÷¨—;™qíOZ¿ú[Ùi³,äÏXŽ—³sæñµšcð[vÉÏG]Û×ñõìýо0aÓH’Û/|›v |¶­Žõ¾ÚlÈÁxY€lFÇPŒÉØdò¸H>Ü‚GˆìtþVâêð¨ˆ#¸znW×/V 1žãiGýSîÑ·ü>@»ƒ'}HYÍI^²âh/ô|~Mx€’#·UÙÒŠ®ÕFDu"w”o„}j–YVÔ©-õr]ù¬&d_þßá·>úò-¢¹¥HW'™Ù®3pP×giEj«1äè“ÎÇQ:§D6mÿÇé8gZ�"ÜCîÄ»V¤Ïõû°í~¯ï¨Èò:´Pu&JT8Hv�*G ¢*fžý Ä4Ô0²¨­G³[E�H¯ÊñHãàM×ys˜øuþ:‡‚3EõÏï³êu½‡œ_”Ý ß:½Ëb3ÃÊp¯b�IÜr`le"n ú²ÍØà«-)õC.Ù“=Èyê÷ÿ3—¶�þ?Œ`¾ò¼]vêNRh\µy“ùýã¹£ÃF"å=ãnÐïz1êÇRùÅgf²ÛïbµNÖMýn¶ð¤_ª©Çâ7)“•Rå©ßûÑ—†³ÑÃ=½çEAcãýŠITl}Y—lÅÌJ¾`Ù•;”y]fšwRx'¥¯S_œûõ¦ÞYÍbCïlïºíH9ÿô÷LÙp²ôŒ:*+âuó–âãF9ø§Ã1r&÷4'UÄ5B§wQø+r©½÷·§²^ï6H�<‚T­“„u:çÆË¼Mz‰X†”EÅß“³Tdá�fîø.Ïþï Dy\�ðŒªš·Â«jÁ{¯TãgǾ¹�ë�’4¿Ça½µùm´´3Ooiç®JÆ¡ §ˆ¶Sw5Ób2*˜x»;–P[Øé?Æ¿p>¯åÚÞÏ�;s¨m�:»ŸßÀƬ]žx•ùvÀÎ>&XØR¥U ‘ä·3—¡qìH!D’¬€ÄÇëšqjõç()o‰Ñ9žM¬DÖ{Ù?rÖÕ…¬jŒ¢û>}õ=yãÌ=²·¨½ ckÛ=|% ºGðe�ÞJÏ�5þ¯—ù¾ìSÇü*š� g¿ïY‚VÑé/¬­]á|cÕ…ºiBãhÌ-£ŠðJ‚á·¬ºLù£ôˆus·9Á*,†:i¤Fþ¹KL7a”é¾5þ2@€Ÿi|ŒâÒH!á?í&�¿æ±?VêIìs˜äž×ÕyßÅøÏʶﳫͼëf‹XÜØª9JÇ3¿Ù^9œ¹WÐaLÄ®›Âƒ{†¸Àà|%H3Ók´·Æ6E¥1!¹]ä²?qE»ÞkúüíN¥mÔ¡ÐÛ[´v¢g€üTPü{KÈèw�¯5¹×�Á  U^÷—8Hec4G¼s^áU¥NSº8;r«�·Ô ô×o&Ò ÒZfPôQ¼^ú뤀ʴaì~Ÿí°¦º"Ž zå2é./+”GL¦�znØšc>¿ë 5PQè(“¤˜L©<*�=_—á'……_�>§'�ôÖyUN³‚¨¾ï–¦GŠ5Æ;™Ãè0C&ûÎÃïÄå›dž£š&:süŽ´e–{÷®R–ÉQùšØÓßÊ-?´—Ã䀧’‘×SÁNÚäÚ:VÎÙrå{Éy@3­?`à.asKòT¥£™C¨X•¶êJÑ•bedI¼Bs‰Y•újŽœSט´,C²�3•“A6MÙ«?ôýê’$Ò[2ëcM÷c”6¬å^KµW€óưP%R*ËôϨòÀÝ”õqÈÊùë‹”ZEÏÌ43¶¬:£(ËG’üw‘ñLaýÍø‹¿Æ²ÕoÎc2”Óöîu¼Ó¤½ô+GE* ç)¯;-tñà3óbLUœGaü`nëTÉ.ÉÁ¢u˜—2Mî� H�)ÅEƒÁ8Hx®ïXÙ:Õ�Iƽ¶)>w<„Tø?‹öŒÏìv‚¶¤��XÜ#élBAQ§ .x�§µãµèöd«å$Í‘Y-QÕ·ÖN’ç’󸂼jò~ãš·ÞaÍ©—©ÿšмìÕ3úª©È5Z_Çú<–«”ej‘‘^YœÕ׸7¸#‡cö5ou�1�GT£µ…§ªõã«?B§ÊE“².Î2OÉ;S©?Q” 5îcs|+µìBjFÅÑOAÎßH;ãQ¼ƒÜ/‹yö!kBË�ÒÐfºc�c†ç€’Ñ­ZU„ðôŠ˜˜â1�.n•æ%¨‚ŠMÞj;ü5ˆ@ªÄÐ>#IÐK®õrU¡ŽôKâY«£»Öpj%9Dé(Üð¤Ÿe™÷ÔDëí¢”¨ hkÄ{½>ïX½ÿƒWF™ëÌößÙCD¨Eë C5Ô¬s¹Üy %®#DEœ#è×pÞ¢u÷P1½LGMòííð uÒ‚RÇETk¬‰ªäs„€PD¤#A�tŽfI�ýkjJÝ3ÐÜ“ªí‘`öš1;/ªˆ(€Ö˜ DUTe©)Çób-½+ݪgƒsžóŠi10Ío^gÕDc´�Ò¦…·VfŠç2CD,EÄ�ôuÌ¢UaŠ9�)0du¯çÐ�óí,Z€÷ãuŽ+ý~É€Œ(ÜÙ0T8E‹bî‘zd‚”W£M’AdÐÎø&¾8G�A¦&È À)¬3†=ºÉCüjüŸ‡]Fu2…ÑTƒ˜™{FŠ<1[ú=Ã)ãœ_~}»Ê©l¾¼ð°öUï,oÏšs§/΢…7yh½"ZcPŠž“•³Þ·ÅýÔè‘ÓC:9Áæ*õ�¸^FWß»ÇS¼ë¤g»Qb¿@µó6Ýj„H˜u"µ|&Ö\÷.½æov&³9álµ{ÀñŠåŒ¬q�PÏ Ä‡vU3ú&Ú7<ûˆ¯�5bÚ;;”�ivþÖkjÆü~�– þKøë¿S­ÿXWÏÚº+ðÁ®;Ó2‘�ö`W½åEÁhvØ�VãòG¸xJt©+8Ò\Ó•¼¦ìË·9Eç?^¯f™¼ÁævDs¨õN³øæ8½ÓOÆ�¨2¸"^md UïŠCÿæìdY ç+:ý¢îŠæWFØ×tÓ¸8~©�¡ïò©x—Ôb¬sòt•9†;h„7òfQ9ò .ò&Y×OH&Á`r ÷"‹Q—¼—ìùôQS3Ü”[ì§äf[·Ï€Ò?'ôý˜v‘-8ÖN*d›ð¼?|Uí}ð_ibÁ¢¾¬ ä½ lh1Y#ɘˆ2¯ÓùU› ƒœk Õ®B{´qÂ^5±ôž£�Mû}ž„A©‹Þ¼m¸Úp-¹þˆ÷Œa£Úm¼WÏC?�FÃÜÚ¤ó¾÷\{^þ>Æë?«¼Y)éx)µPI–ËvS®³�¨´J$ã€â7}v]û}¹*+À¥I¨VŸæÒ3—c2tê®·°â<ƒjçΪ †eW[ÝªŽ¬}Ñ~¶Ž€'x<÷ϱ”b7‰ET“Rù®q\ OggS@gô M'‚ÂèËÿÿÿÿÿÿÿÿ.ÿÿÿÿÿÿÿÿ>Yœí×o` po wò#´¢f WRÒMgkô.‡‚æÈ¤O¡4Sù¨pî6}( ?ß§Z÷nx‰ëË–Þ« Z¡fÅÍ(`þ¸ŸóžÆS¾&•È>TªU´„ñE5bÛ§À¹ýãšM’ŠCªü÷‘xè‡RU6.·+]QA’Â%TôÑ“üd;UБʹ„šòh‡¨_÷7”AD¨J†€H4Šö¾k_Óg˜¢ r8[d¢"&‚ H÷,kTÌ<Èé*2ÌñáÕ< AEû{-«#ªJ´‚zFN™ ¨Ð=ý’†eíÔº…�ñ=²SP²¯æ@¹^uk Žq4ºÄ@Ê–t)1sEN F©Ü«ÇÊ…!٩ّ‡ÆÊ™k5ÚÀéÐÀ%êî gÍÃÑ]èœcšâ¬ª'£Ú"Ù"‰S‡�p‘#xˆŠ¦;9H„Æa@üiÑ‘¦q?íh0‹h((jú¯ÁDn „ÿãamðÑ�õÔóï_¼¾Gõßž†D¬¸¨¯º’;s�¦euËÑ3s+‡NçǸ¢‰Ùìû¿éšas&Ùû -6GðûÝˉl7âà%R¸Ä´tsjî³¶G¯�ë(Áß´q‚õ­¬›Sû›!oy�]óÈ×RŽ:€ú(ºÎ+ðÔ¼ZS³ù—­àèêô¾5ÿX47k:·ÿV‰åœî‘FÝ‘uñ0Q¯tþóY³4õºR,ò(¸ökßxrzs§­±3û;°Å¨èÚZô"-âR¥â:¶³�e6d^YœÔ�xkÀo§pçß™qA0-p%wšéG®#”úüŸ¥Ll]dxù|>–v}îT>ø)TíCNPÓ Ùv^KÙ}&¢}sƒÑl°ãøSx˜ê\øú:³÷‚NË kmú쾫è�‘R4ÀóöÊ"*ÌüýÉ'_Î=]}Ei•ÝSÍ–²zª †Ù]Y:|Þ�Ÿ µ¹µŒœ¢G¢R[qŽ`ΘRAE$ ¤*\3‡Mzk;ñfD—쀗/†—ýýHUATpë�à 3�E+ÅrˆÑc‚©H D�9Îu?¥©B÷÷«‰) &йfGíÊ.àˆT/²_W­ Jï1ñˆˆ¸µ<Ä3"ëà)†J}~�ë "ŒšV»µ�³{?¾Ô”^>Ý"çŸ{z#0ó@!g#µ(X}~¸¥ ÃþÌ݈#-‘Ò†jÂ|T)‰„uóJÞðåQ|9õЦ¥»*ÐîÑ}â“/�Ÿg ÃêíÏùØ'[¶rc�}.ÅcÖ b¡ø¨*“ž=g:¡ít1€Bï½ÓCm?¤šH×bäßS×B?ëüçÜ3/¡©&F�’àêd\r8ÎßuŒð�×Õ1FÀÄ«x Œh ø…n¨•œèu‡±?NÕ]ÞãµG Æ¥àŠÁo`x3è�õ÷æµ…üî½ãM9¯cý¦ƒ©Ä!Î�wDÄ® ô’ fäBð°£®aoWIçTk¶ùí_ªúžn�uÈšÝf©QûpÔî$#ß›&ÆúhʯO™!üá¹rJ¿ŽxàØ8Mft£>§Î¼þôg5Zo2˜vºØ«3 gþ¼r+çÏ' °â�ö .ñìô«|Œ¢r U?Dêùx¼–€’´K&ÿS¾S}M• øÊa�A“C>æ ¢Ú3ÎØßó»W×˰²�©&ý.=‹Rg¶‰/1Fýý,Tv­ê™'„½eh–(-§‹4öé�Ÿq!Ùj‘C“Ã+kÓûÉa�Éb}kiÕ%ÇY�£GÓÉgÎâ¸íª´*Ó�jzÒ6›¯Ö�f"áþê†`¢ã]Ïa,�ï,•—=ö0WwŸ\2AAÈúÔÄãfg°õ¾îžÏ³vlÝ?íìL�FÝ,Á´/W+Ê{ÓSÕèê9º(žr Ñvžœkk°·ä«AQç6ù·kJ˜` —i_1¿níûx¡ÀÇ8ÉÙšAˆ(Þi7ÊÆ»(Æß­K/W‘�¹ß˜k¯ôצsT_ì8=ŸSØ‘zÐ>?u­z°,f˜ˆêºl{Ž;œ8Qý5¨�EÎD˜x­†û’Ñj¦¿2"¯ÙÙD¶ÁþIÜ*ŸQÀ›)\øwZ»€b†Q ©êžÞ¿¼ÙxîÖ™²Nð’î¢{õåôÈ' ½˜ ×Ôã%Þešu�…ú¾ êúkf…Ü~¬·à ÍÚ—¿÷²Û‰êÜÌë©â$®ªý’, Dë~NeÒ`HWû±:5o&¨ÖƒÚ€„©k(VÏ%M½Œ•€z„dÓ¯ã~�ùª'Ÿ[ÉÊ ¡'•>¨Ðèj±÷aD™âÍÛ×t5UY 58�ꀢ@»¬`fŒWëa—ïïŤ¤(ÒìÌàŸÎ/y§i"ª¦ –Ñ÷58ù«õŒšeÖ ÇñäUÅÁA½>-Ó|²¨!5å’6…Ò{–úQVWž¯%Z¨¨…§D¦èDÊ\‡ý¨ªŽ(iÌÏÉÑ“âϸ·ÕÿŒ¥pûxϪfí\ǑҞë#Í8ŸÄË[îkvoü ð*ÚêmªýŽÜ�bRïy«½wjq Ñï}æd¢oAïø9Œòi Ú›>û<$ÙÃf†š°ñ�È£ÁSÚûþ>ˆôÅ&åÿ%ˆ¤&ù“F±šù͸?ršpã¾? #Ò�7m¦ËÀ½#DM_ƒnËn™í˵xö]6w'ÚóÜûn¹2VÌr7ã$¾r?–}“Í/ nQqÜ¿k†Šñ"GXÊ¢:€nR`�OЂѯW_7råúqÙ‰Ôc²þ�q™1ŸaËþbަùœ§çN.òUŸh¦øo±ó*l:Ù‘±²ïôk}'uÚÜrÁ ½§�~š} ]©ŽN·ôNqœÄVÂ[)û8I:Ž}ó'N’o<žw÷ŸˆÐѬ¾îŠF€˜4xŽ Ÿ²Ë/~¼/Cçüœ™¹ c=™l\ÿ^ðu?Œõ§3D³)þ<šò‰·…,`G%mD¾d¾nã~¡&·ðïøp]6ÎgµÊIb@Ä"Ý ò1ã�<§+²Bµf†kReç¤ä¡â/ªAA¦½¸å —–Üh9*ÅR\®Ÿ7hG5�éÙ¶Zµ‹†'Ò¢¬Ú™CZòùlº¤´}�™'Éß4/M¤Îÿ6m¦Ù/fú—.5�ÃxõƒÏcªÑ;EU *—ëJ8+…Ù8ˆ‹Ž‰ þ9<Ð#ø¡ £ëœœ¹�”NÐv²¼7$]äïJ#’«YuÍ©àUd|p]9»µl¡u¶×íøRÜoô¬Ä;¡~“DÊUç@¤Ï¼¼¨Œ‰¯�¹R Ñ‹a"kfy�¾z“ãº]y-¢È㪮J­ªPueÖ&‰²0@«ÿPtäѬj ¦�ÿ\«»ÒºfÌÑå÷—7¢5Ùãš²g®&Š’„Ê;SE4égD‹*hŠÐ:ÝÊ×ε§çÒÑ=àŠülDŠlO@IçkUMLCMÓ@ Uáûõú(zD'£ãa-Y!1µÓ’�âÈ'–Ðúž«êÄÑ´ ½êÌmߎ[�³ë¢Á”=µÍy=©3èç1òïoŸ\·�ÓÍßãɯ1S;§âDÉ”6µÅ½‰¬4ãæ0Ç”åïÒ"²X¾ûþÙ±{ÁŒÚ4™qž˜EESús›îÇÏGÝHðö§åC¬–Vù‹OYöeÅNdÑWÓg¥Ù£Óm¨K &âÖ,ªôŒ!Ó( ø,&2hº*…‰ˆ©�ÃJk‡¨©Ð¢{f°)J€SŽÕ¼ðn†ù/Õ‰â 6¯µŸ\óB“ê¦î\>ìÙƒýÖjõ°š‡öµcÝŸ!Vlû)S´ÅÄŸ!¼¥‹Æùcô~üÏå5þhûoîá$òõøõ d*uø�ýåìôë~Ðëé3™aª–û|{šº#ÁËJ¦Î­z?-Aq3SœA,§mŽòÖã‘§B¶Ës˜³�sñdoãÒãhY¹µÄY†Æ¦fÓã?ëÔ¿§ª>uW ÊÂX/‰Ï}>½e'×¼L)ºUL á~ÀÑù=æèÚoÓÃÓl 7¨PŒ×{8òÇŒåò•ÓÓxó’§Èê Çh“¹/žÂ-¿ý 4é.3Á«véf�" yðúÙïæò€<Å=lA¶DaÄÊ�s*CL 8鈹ù^ôÙD>f2 ¿Ëz:�š"µ8Ë¿ˆÿ#=pçRæÅ«õ0¨ûô5çÇœž¥·8ãŸmä{ɯ@»¼ñôuýºÒå&•gÒB¤Ö¿�“š.‡Òi#Í;’°¹T ®×W\ëyü-MÌ_p¡ùCâÏ�µ¹?Úi¥ÞÙkf=à»%„|~~3ï¯ïþ_ª·›0ɆGöþ.T®4w²^‡ônâš¿¢URט€.€‡Ú¯ÞXÈ�}áz»ÙA(ÎËXHuST‡®à9yz†ä¦­ýþ{;€ï×ÁÔ§Ô¸ä—Ä«ÐÝJÝN±¢×ꫵkA²ç¡Ö^Ø**OÔˆ]…·’v|ž;qÊ‚�–±Å/•ŸÏ›Yµ’%ŽŽ2½Üæ~RçØÂíÙ˜±S)ïöD­i Ɠ쫽ÒgHsúOß—móLOggS€vô M(T\àôÿÿÿüÿÿÿÿœª¬¬¨²©§Ãü¶þ9¼Y�(—&�)Ü­�Lð€hP²U‡?]Ú*<{\5™'ˆ¾ý(ÓRÏé‰-`Ût²$s6 šúâ¼Tʇ¥ éÆL~hÑ­Ô-½‹O 5}ÃZA€fÿ‰¢ ÷ò'ÔgóQ¦ÎÒ»Âî8Ð×|‰—NñíÔF”‚Šîµ\7£¢WU€ê×ÐA«lVµy^õÛ.Ƶ2ÿ^Î� „‚Š´¡é×ÜuÐfžœ¼SWT(ÈW¡NJu •Èj-æ�åþ8Ðz²ün?ümQ½ó¼ÛÒZ³“CQRw·QV@ ÑëÊVŒŒSâI3Œ˜^êê¹O?¬UØ2f‘2k^áõÚuÆÝt¾ñTŽkêp*@UuDPâà³v¨j7qÌ=ek—¨Ê« €óNQP/å`–¼UW§D@§�>]AJë2òu~«Æ£u1GÄpE×Ï�¥®Y&1ÛÜR�**K:€@M×Xg|÷pLn¹ T]´çq§1ø Ó¥Ú#ƒIu(qV,ˆr ðy|A,,AÝ×OâI྇.¥ÏÝ¢lqê±ñZgq¡ûÉoäPiGÏ•þœŽø2·>9¢yl Û¡üž^\(»k­\sÆ1]ËßpäðÄ2›è…Ä×Ju5Ñ�:Ååñ>÷8yÛBjWfå×Bi¹/«òµ,!C*“h­~¶ÀHßÚÍ;f“%uVVñ¢6ÅßÅY(:hBîwù.ßxÞ¼|3�)ëÌ6OÉÍJyqž7W+ðµqX§  "¾§Jž^»+ZÅçSb�fõ}zèOÿ�©;Ô}WÿxF+›¯ :m]«b%ßeDäÇS¤X­†æœVLÊ‘ŸšÕ”<�“‘&Ó)JŒÚ¹z¾Ù\PäL©gãN€�tÁ1kïïœçÇ/Gy:À¹&e'ÜM&–•¡e~Õä¡r=èêö3¢ÂÀâ#µµÂÅ.«VG·ºµéŒUÑSîÒ…¬+PÃa«û%—q/!Ý_N.î±Ï~�z9ûfÅîäÑ´Ë ÓÚ^J£³%¾ÆéL¿+ºytyë¯Ino˜'Á–ÀÀòÆÝ: ™Ônm_´ReŸØr�uûmùC>Š�P_üt ¸†ßáÆ-,σeÊîÍLî­ ËzSWåìpNZ}Ÿ©åvýÖù»ás¶šDd0ZVÅîbÌ•<“q’¾5.ïZr=™ž…;£ÜízØÏÀ@vžé`y‡)ùcQ«Ô2ܮ׊ºÒ±mª§Ñ\Þ8/ÑïÄêÞ{†D'"á\—j ú¬ÿ<ôµÝÌ”o¾å±í…E—VÉ=:ì‡WäõkóBÁ^ìG-ýX¶³£M!.ÔH,N×wAV9¼âkà÷÷°÷ù©‡È9¬Üâ¨èf³û?,Ÿ~­¸Ög¿8Ýù–Wo^ ‰ÿï­±îãÛZ»gŸÿÉûþe³ÿÛx:Yÿ²ô?n~h­ÛÛ†¯_Ÿp#ýñøhïÇk%{Gf4µ©ÅKßEûúl^®‘ª›½gÃPû�:ÈÇ7rõ„?]AÒ~¿=âÕ>dµ5cœ‹Ý�åªÕ-“Ö|8Íêª+×ø³Cd85ŠˆPKo½62UÚË�'F¹®º…ûx˜Æï¢åå6Ë/3[|n�/†Hçµ/âÍ7­os#îóZ>‘‹ßŸÂ!½ÞN�U拚Ç^µ†:É!kæ‘QIÚû';‹=Õª tç=?QÃ(©ëð·}Ìò…é°„ºî%)(L¯ ôŠè¬Uyù÷øS©*Uê"©Í¤‰±vÊ[êÕfЗt~Ò-b(‡8çÐÅ}TD†i1E¨ÈMt F "��ÔÃR±u;«j Šã ÝèÖ—´vÞ°Ê {´JÐ(FÉñ^¼r«ŸÔ¹0wèÝÞO|qÌ&Û¦Ú»2͆äWtZûËYkáʼnU6Ò*÷Þ^t@þ=w�3Eƒý*z Þ]ZŒ?g]?£ 7îß¶Sª˜‘¼á !l·÷¶;ñáóGò~dîÿÓúÿÚ1N½÷ #D|ü;Hg3 Uö§Zd[Ùïêýyí㊣~lÐ0â; Ÿðp½�½ì‡Ìó8vüÄJg•»}5*O¬kãýû·}šy o) k¾¾ã¤, ¯böÈ�NU«ý_jtfï/!Ëåõ©¼^ Ïm#Šní«…}lúgÁÓŸAÞx÷‘°W™|ëÕA·Ÿ=÷¿ô¡¦ypMÿÕÕ”æ�n÷4Ír˜kæãhw8õP­•$?Š >øþXú{³ §öwžž�*Ïü&LÍ… if8Ãt©ä£vt+IaXöÏ;Nro‚øã¯ÃèáÑÙ¹Á�BË�V :oS`D ú€8æöFs"­ˆLå«N�Rð”…ÆjÍB­^=”#3‰lP<'jïC®õN‹ÞÊmbmïÓû�/M5G˜áÅÐý\CŽ+Œ{‚×g9B¿=µº û<#‘\Gó¯ dnËáÐJé–Äjv4Æc‹§Û¶Hñˆ¿Ë8s;HÅ3æììßýŠWO܇yÝ_O‡kW<úõ­~|].Yñ40^V…y·MïÂ7êð*Sýúøèy€ªçÕ�§§W[¬ï&„ëÆ¿üÍÜxÓV®%@…ˆÿ§Ö'S{u®ŽÅ–“Š ›eÞ‚�/R�“5ƺŸÅªR¦ÕIU'÷,=„¥X«êÿ=íÊG)ÇÅ…×ÖM�ùð-Ïäáx¬h)gZOÞ^/ìǯ£à®¯”Éø«Ð‹›Ï¯ ‡C¯5ÄVsKlöêQí=ã²Ô¸¾óY™õ‡óö¼úŸ¾ì¼7¬šï‡;÷—xƒTõÒÜ®»½C•ï£7Î[÷SgyóyîÊêƒVÅôÖc‡pu«*ê¶{¨Ñ{ŒFáTm÷üŠ?CñUöZwR¿ô°·[%²þ ÉžÔEt¢+Jâh™×qõ¸ìÜN):÷¥c„Rá}ü ô¥/x˜ëÁÃXÃýâq׿3j‚íѪ¾W›8gwœ]ú º¤/7 hþÁj´8?[®WIèÍëy©è¥'m˜ÿ¦ã›Êež´Ãz‡ÇIçYxóÔÞ1Š¡9ÕÚ¥e_>ªÆÞ+S%¤sùxû¼vheß©EÌáL]ûåoé½…*`ðƒr×þs4<¸ÒÿèšÝBA—MîÞ² @[u?™½–~í&‘ž)µcᦆÝüZZPq_ÚMø”ÓîL¹/”ªi¯×M¢§__/Ü5[|¶‰œ—wùÁ¿cZ�·‡N_ø 0}�yRü~¶»ûþÒ²O߯’—«á]FáQxqtóQ=ŒPðßHã—“;òœñêh¨Ùqºÿs>}«}?æOŽZT9ŠYâ%›` Ù·YË.WÎÓÎgÛGå±É9]……œ®”Ž—›¶Š7xÿŠ××£·î03ðÈq‚Þ€Ÿ²ß{^ZŒUÑηå0Ûe¼ÞÓïñ�™ÔÞ†T„ §±}ê�YSègðº_úuoͧcoûËÆkžóâV=Þöe†WKØ3�qq$Ï]í¯1W�^ëVÖI+•uö¤jäÅäp 刺0Us½��úJÿ\‹X–¼T:EÞ"š¼oÎÏ£óT<«�#ßr�ÃXç“~c[]~°¼[««•²—Š”˜²Õ»•b½ð49ë“"½þ”¾Ë˜pR%ûIö*‹°ù9²Æ„�'`¦L¦/~Šì¦Þ�téô{{›Ÿ ƒ÷ç×ßÜ­å×¾½‘…6pŸëÆ·eÖ‡�x¼‡v‘<ÝÔ£\%ÛíTo®ñ¿â?µøÒΟ�Gqúçnms9þéiÏBª2nÂJ=3­ë�b>µpfØý­1w¸D®Å ²Ë~kàÜê¡>ÿ—Ò÷´zé±7õg Om|)&7„Ø{ʇõÍíŽÉ« éG9¾oßy³¨÷>À3<ó`\ûpÇ?I:¸àºýϼ(*ÿ›=Û_û¦«™ýn¶ÊT=™§²=:‹6çðw®³ÂZ‡Ú)¼©ì"V†?k‰\ÿéÞêì»p\'›=ÿLó±?¿¸{¥€«ÖÍ4jœkdñ�”Ìšf¢ºk‡åâÓÄ ?gh¼}:„±¯‹aÓ ÂÑv5¤4½2f«q㱄µÕqªxÛñ!“ ×1wSNñiu �ÖHlû3NýèÛË}û§]–?8oŸÿíK?õr¥´—×ݳxëKçÞ¨ª9곋GË~§Ô”¡<š�y)9|Ëëó1¦•/ñ&Í·ìöI© N�(iž�yOôv„i{ù0ZZÉu,áñÁP|§ãÜ÷Óézùô_.¿‹ZÊ$ÖS!³*¿s³H¾øž×¥mPš-[)§ÄY­"S¼Ç¸BF¼"!Öá Ç%®ï�Œ?íp½¾ô`x—‘ÛÕºyybùð¿”�Mt{Ö¿>¶õôWãÙãy=ŸÈúßç«çÇùD•¥³HY݈9‚{ͧ%VçmÍ[Ì¥¦ó¤"ɚݽ7-ÊÛ W÷Øï¢¾N¬»°—×,Àß¹§Âíï,ªÎ¼ûtÚí‡I/½{È=†TXJòûûÎ7wÅË~z8Öâv†û6Ëdžkl©yø]™åº"1õˆ‡9ìiû¾Ïçä3åù÷ªªª”ŸW ¾SJðçî$nP÷l8Ü~ýýt´´ŽjýÇGŸ�éþ~ü›ùÿ,¹Ï¿Y6çÿÓÿcçØÏÍŒKô‡ùûñ2û>_Ÿ÷ó}{yvœ×|Ü~÷öçõìXoµ¹­­Á¹’ÊÒµ�®­-`è�ú•Lç Ðb?ÙÓ�RÛu…u”ßK}´éy\êAuv\?îì彪Õ$];½ôó• ç¹5�rN~»û½»#wø«GWx¼¯zNóðÃTXµ™ð”mϦ“¯5Î�~¡l·7_–˜îï¸|€É^?ø°õ7ã/;îµçòi“ïâ}õÿûº¡ÙúX¿¸�u{|üÖ¦ç¥ö�m֦߯o3»¨G'¤Áa�åº?ˈ;îd¾q‘Z«[)ìC¥ç‰�¶øwR'>æÆàÓ'ûi»ÝµO£±�×Þ>©)]Çy*6ˆ8[×pJ›¬Ê™‡’ý83c·ðÙv¥U²Ýú ¹?Ѭãªû±n²ýxô%—½Rèd Þÿ‰Œ-k3¤//zê;,àð6ƒÛ3ÍAøözäØ/‡šÍémTGÿôº%ö¶ã[Uþß×mž½1²x_Ÿ^t0Ô»ä´ßS18:Ò¹R,2â®þ_;7SCÔ‚6³ Ì÷<\àídG¾¨qÌb‡•=3iEr*Ëë®Ü [ÓoýUK׊¸.û|:Ê_JüZ W·é¦.ǃ(3rÔŸFþŸÎs9Mäc5û[µDLu¯^½Û!Ý“Ä>£ï�ÆðóeŠIZHœÔG*›í &î3¾.Ž€5ܸʾ^WÆŠ«ƒ\ô#>llßÚl«X—'â¼¹^¹{Üÿ¾Üö×å£ÛM¶hËyi«µê/n™6on‡aåøGO3VŸÝ}ïúîXãw{mÏ3åî÷)«ŽogÞîÿ/oæ¹¾O‹»ð'–yDN�é‘Û×2j¯¾³Š™ý¡ÆÆ"ø·ß¢ÝÕ}qzGµiîÿl”YÍŠÒºLoe|8ª¸BÏkÊÇŸ«ž‘—>/UŽj¾63†òØ~ôîÕ¹¿ö`•D6õÏçU*›éåúGUZºæ?'Ç·Ýí5:¦î(¤æ%Z�SO\ü€³šåWu„ž@A�E˜Î}�„à>UWT^M ª¨×R[^Á¼Q]7–Œ¨h?/«M­F©‚”ŒÊÐÄ|æEDMÈzœu¿_Ðp^4û[S3o”¢ REµöT «|[ 7ºM3}ŠB÷þÞÖ*¢Ð�¢mŠh•H=eOºªƒÎ6.c¼¹/ˈúàÌÿþò˜oä­”?ÅÔø},¯:äóYôHÝèêŠQ-C5÷=  hî6JDz vCE«ÉØ"/@T‹,æxÜ%"3T4|0Hò¼úÜÙZ\Þg¼´s˜ìôÓbà°Þh=>¤¯³Ãɯ¨;;í]AÞIe©ÇŽuéH2?{º‹ÐYâaz�Æ•Íc¸é¤NË·¥1u¬ï™ÂŠ[ó¯PÍ/ÍÊg À‰ƒí¦’·E/ÉNZa·?Q{…\k²=~?ßý_Â-ˆSé.œ¿uWãË�á׃éy˜~Ó,4æÝ6gkƬ?<…rB«¿WŒÖX;R � ¯ÝN<Õ{—§©©‚îJW*§hý:ÛBªƒå?€;'».ÉÆKXóÞ’øöuñuãû‚A·»^Ó¦œá„:¡·³jÁWzç{Tÿ=UÐÓ:š¦~=�§ÞêœRÉF5îôËã·l�gïÒ î×ï÷<ç2ì;“ÜdÑàêÊÒŽ5¤’¶äû¯Ç.TŸª2NöKnKüt�ð…Ý¡f¤Õ[;¨%.}T&KëS¦pÐ]ëØ¼!�D¨}ÀíÍ<<ŸÞYð>uÛIªLow…P-oÅ9×D0êž«O — �šOjéÓ�K›èíJºE•QÜ.ž×èãÊ�p}÷G]§OчV6«çDÆ‹ ‡uÛç_ßÔxÙ~?}îëwàl×Ò´5xOþ³íŸÈ¶û¹£­˜B2‰:�i%ý~Ô±›™tNÓ“iÀÙ¶šä³Ýo'�À7þ-¯ð�Ø[ÿ4bÎ%Ó’%<µºÀ§®*J�’Èþ—uÐäeõÇc�² —´…kÕöš$ÄWó¯sIn ÉêÔR ÌÂgýñ|~`]Î¥~`3(Mîó¾ÜZÔà§7&¿·³Éë÷üèÚMžæØòó<æûâ\”›õçWª§�½ÿ7÷×~XÏívü—ëûáRÉô<„:F´/=½�ÆoíÌKÀ8[ƒ“!ƒ2–?M‰ÝgȬ¥Q&~i<¬Ï¸- )Œ;Ø2ŸÓ¬ "f¸!Iuþàz÷Î[ÚßêÕ¬À0œ¼S©c�rP4ìÝŠw[ÐØµŸ¨LÈç |ÿ §1Bvj;Î훞$^Ï~™I·“U¢Ú×<=ëóíÖõýI©\†\ªš3,-'®îú[5¨ò8.B%Ña�h¨>¢ì§èçM‹C:×Óê�‚ NÏT¨'Ü"4³®"n,r\ÓÇ”Kqz²ñeR�ìWibFºVIGÚ™xÀ›Šn3‘É+O pPeœ'Lbwd�vàØ«FUÕDNu8G7e­‡Jõ<#Ô,%¦Ÿyyܯ?~Icœ·ã×Õ}yI<¨aû¡>ü�¾�íȨ(»ˆ8žh£Úgg4FGëXYV£²þ}P”ü|måü¿UÛ¼Y Ûc{œ@áP�nNùëðjž~Y÷˜^­—©eüò$Ÿz-™ Ôaæª *Þ´×Äñ4Ó4 sSՃƉ� ‚>–îîá&{ñ}Š˜˜a" ¹d‚;_ž¸WÒLIiab>Á¡'µß?M‡Œ®Nõ×Q†2–«ãº½îŒ¹4OÞ(§5Ï•Ùkv„ǨµÇ’Y«Lù¦Ž!K+$ù>Üú,¹[S'÷Ñï­·žØñþ.Ý=û#×…³à—À‹§u£®Êß¼OúÃy]ÎËÙ%:×qTø3ŠÎ‰ï\ŸXÊS1äG¾ÈwŸ‘¾yôÚ‘?Åyʦ…÷«>ÅÕê/ÕËú�¥&ÝŒ³øÝŽo�äµMÆ 1¦{±�¹-¯beq«…UâûYµ›¡2Tßò⾞C–�> [\%ËÇê£FD„ܼM|zEÎi�Ç‹r•rÆØ~Y<ÕW<0Á·ø[3÷¨|$ À„Yÿ“ù¼EáX½|ýïQg¾ à‹‡b½•ÁÓ>¡”Û ß6J©Þ a9´no®ÍN±{¢õ¶ m¥Ý„¶ë�¯õØ)·ñÔ©Ãá—UK@?覿†µsM§ÉZëÚ1 f=rôÍ$¢SÞL· �f®Z5j‘ŸU$²9NWÈ«GFĬtÔõ×_‰Øÿjç§’ ŠÆ ‰&)ÔJ‘»tÄ*Ü�I-Qú¾¾qES ¨E šÕeþ嶈Ϫâ¬AÌ‰Š "ˆJ¼ä*’59Uu»®º "µ#ú]Û|Þ•‚¸4Ï[Ž@2Í "Mªa3Uј]ˆóùök Ä© ²Œ¥ÔG3j¤¼-!èK¢fup b�‰ @Ô{²kíî^C÷Xm(ÆcK9>cRZkr ˜Œb‘|ª†®ào ùy14ëjSþ~€Ÿž®:×1mX„Ùå G©€ìE!Ò Mí‰8’ •#kÕnÅ\þÌåiòÇ‹Û}ÍS JŽ�£Šh³Mhv/ …{d*SNRÀéÂt[²ŽîíO|î¹¼ºƒ‘޶Öfˆ'}áîe ù8µLõ¦Ÿ¹É^¬÷;¥w=«lù6—¹Û’þv�j8þc%m¸®ªgäáÕ˜;¤ÕQ~BŠçt˜è—©¿õ͹QÈ<žqYpYAè®ÉuO_ü”š+«ù&²_�þâ95&(#©Bœ*±½Ž`4Û3ê­Ð•÷pÇÎú yM�_‘o}áï÷ܪí*}¿Ü¦ºàokgÁpn�ŒÝtÙÃßÑÍÉí‚>|Iy ö'}óT”ЉÎFÍIÎÿ·:ñ««ŸW â4Èá›*²xéI¯u)K‘âïª÷·³Ñ%séyäTXÓì{÷º JáoáQÅÇ-¶_üg™ø27fÒ†ÝñbD `{ßÕdoOØø4í±¿rbÔá:!;ÿ ¥+°Ó»dËõðž/-îüc“¼Îâ7Š@¯Åb‡zî@³ã{ܨi»�?í4ý"þmü®®2꨼¾)Žòi³ÿªÀü&‡QÂkNçGrµ#Ö…*~0>꣤,xHg=‡ÜÄuwq澂Û`5 9Ir¶—á–Îë!õx‰‡ð½sy¶®ñI:| �ùkL¨çÁ‘D-(ÂMß5aM|Fg¹ ùuŒ?Õ±ÖCGHÖÇ\½Îsõ-äúnޏ|p5m{þ‡Ñ¢ÙÂ?s/ßaYõÈ“iX‘<ìüýü²HólÄkÌ£ãÜuÍyBîMãx‡©´póÃŒ¸,RÐ1»ßwzbaH³} ±îrÍCÌó÷U‹óxfuÏq §D‚ë3žF³ÿ``Fl¶ƒ f[½¿m»=Ws˜ÁQ—PøcÚs,�m ËL~YÜí�ô(lpOþfî�jdÍ®€˜¾ý±É<*šß®£ƒÇîàV}”�½÷»þ‹ú’‚ë4�5‚°²|έ*Œ;Ôú #Ž—º1à D˜Ûu¥èMGžÕùFjz¥8õM#É 8†åŠ Õá²ü#¥]_kÃ5ç穦ÔåÏHÎqjÕèýÃîuΪ„ª qöZÝEâÍU  ˆCU@³võf¯×¸…LJ;Ÿ#"* Et-ˆ`‘Ê·Ò+á|¥ì/_Ê©IȨ‰,K¤aª«èWc1 MÐ:¢EÁk­1Ì¢uŸÊèð4…YÅ�оq Ôœ&C:Õ-ŽšÑòâå ¨^èê8ì×%ÚNG6…$øW³)¥™ZÍq}A­ ÎB º6¶×'É{�¹àèd�9+®˜ª’–BçÊA¥OW¡?BŠz$]«H—;HAØë£ž³;ˆ³j2ß>Ž’¡P¯Éœ¤bõóŸåLÇ•I€fÔ VÊøã™èëè ö%æiûHJ@J‹­ç÷Ç�:YòéKûÓF&ýãªu4\*‚Þ8w>/1s[CîÌMŽ`¶�.»1. ÿ]‘/�Ø~U«É¦ä)¿Ù¨f?>MVŸqú7tp/ŸëïaâFLNìöúbú7!ÅßÿõÝÅåñ�ó"ð+&8òÓVJ¤È%€Ã?wÃöÄR5÷ñ_#ÌŠèÍágçw¥×æ¶r»Ž¡ZªÝ•îb’»œ›üµuAX8þÓª²ÕžùKe¤~à«1™Øo ñ[—¯¬µ/ïj ûµ$¤¾¢‡óÚfž¯6q÷]¿Ã1µI¯f´Èír´ßÁ] |çJZGÐ|óÒ¿¿´»äÜŸ‹çë/Ç*üßñãöôãyiÓ}¿d>K×ÃÇûôzQ“ u~å6R{$¥ö~/uë°�v\ž[ç‡�Ê[šË“uµè/f… œ1-ò*S’üüd¾|\Þµòû·±×ng ™¢õ{�¥VmŠ#cãÝó~Dê«J—žuü;þ«…b®+=פþËV÷⹯áÛ‘õwfáî�—eÈ_o¹N9”=”#�F“\ævë¬z2ŽRã‹®‘NËâ¶×Ù±¿ëîk“ûZxÇ™ÒD7öìpì뢳lPx¿É™¥Y\Ôwf4Ð&x+�«úΘ€{€ÈôY›¾0²_ñd/ûà ëlõ@è‚è–�¹¾Z«Y<Õ+[ð|DaÒò��¢Æ¨«ªÔBzžå¤¨"_FHM@[8½îvt¨´ü²CÁy9ºVdÝu(ÒQ©WÕÊé9Q÷ì¯Ç ȽIq ½5¶�¤Ôz|jãhÖ˜µJK}}µ:«)H~ý,‹û8-ïl€‚œ"н˜ Ñå)гF[¼+�a´ê3|@MC YvEK‰ÒÓ#É×LÕš^ïM=’¦J̤"*Yrî7/Ï5_~ÿùŒ¥”ÚŸ9¨Hí6�”ÙI§ ú`¨Jj·ŠJ×çìlá Å.è,T†Ÿ±˜'�cþÞ>¢‹ÑªWñãjº}xi Óõ‡Á¨–G¯äÝÞZMég÷vX] Úø•NÑ5²‹SUA[¿(@™©ÇçÌû#¢ùý]ó*ÂÎu· þ±w2ugÔ®*ÐÈ_ÿ\À7ô‡ÑæJ3\°ßù±,ª&ªkBÊ/)µÄGf‘õÄ>µ†Í±)6I½¯“¨Hà$|rdž›‘¢•Í ՛ّاé¶'•þÖËõê±o(µ§ÜÀ‰øÝ�‰Deâ@®Ûíš}8ê—:j*Û©œÝúéÎÏÄt{ßÍÝ^äŒ3ã?#mäé&SC]áBTªl«_ʛʳº~)S×LNÇÔÐYL ½0ÕS|¸–ŸTl^/Ó˜qÓ|B Ø÷}kò”ZèP5Ý­‘l }¦žñmtÚ7cL­8�˧ŒÛøEp»…{f�¾Ñä{OSºk¸¾n£[Âua8Íb]@ÄnìSÞ¤Ö¯Ââ™îì9ñM'"ÛbMO]2"#_EwÆ“»Òt0�¦×—D~|b§�?_ºzp6RƱú'ƒâhwW2§KøZ;‡q–XüyeNƒûøî´önpqú…Ç£Oû|™9š4þóhqO´Îðþ|6`ß5¤  úgçêŸ-Ã×çãÍN�ÅG `Ái?¶a]׋ãÒüãÁ(Q©[ü¹øR«‰J©”4ªEÜÄçžrG5°û߈I£ÿü§ßÏY«�øGWò3#ÙI°„íVS' S!gÛW>Y»WpçG%Ü­Y7º¿æ¿º=ïEãw¨Øíë’3Õc Ž×öŒòÎbä°ÿcFçGCWfïs–âÒ8j`Åk}Ég ‘à(²~/zJöùs’=þ‚Þâ¥ì}=ÈaNü,å­‘?l{65ánX&ëAÙr%êV·+‚XïÒ¸�ZOu}(PNxà$ÑÄdE¯ëát¹LÃéÚ4S¶i£×æ¸ÇÙÚlô½t¡•Co¯nŽp¯�lÛÞÌã‚ý:.ÕU‚È>§ °&™~Y<ìW1½�9Áœ¬wV=@ÌSóºöÇ›a]ÿä�ÿâ�uI[ ¾€3œûy ºþó¤x×”T¡­ï�ãã�OÍ¥lXf$�FßSîyª[P¾TH°tM2 ¯JÆv†jõUf05‰k®ë:x5ɲšrµ�:}´ØM¥zRC+à=þ¶€€t-Y©ž˜ Hìåðþ­èÐOû %JÁ]õ�ô¤Œ­ÐnÜnPQxÂÅSœ}1[·fzŽ„ã�„yšÎ¹¯”A@Á]®þ}qõ38»‹¯¨WÑ ¼¨ðPcǯC¤%›m*Jx?kÖîÜ¥êŒC­m"ÌR6àœj"Ðg G 2 ¦ë.뛈Ť8È,´“RvVQYéK1ŸÛŠ%sØ–õ´ŸOLYó´0@¡WÙÐ r$‹ èìz˜këi`Èçýü£Z+Â@Dá z&(µ`LÈâë¡:+öF¤GƒÐð?{?wyª¦z@ Ñ‚<Ô Ë1Àq> a|¼«|�–«æO@|�ÏÚ,†¥„M,ÐéÕ_~�qq²#½Lk_Æ[ø”JÜj_8uó½�£>œoÛêƒBÔ#…¹ £8ëÅùò³à‹Ä+DOÛ�ÀL{~q²"'ŸrvMª“lVЧ‹¤hª<§Ëø>ZßëyøÌY¸€õ~nZp²Ip ¶-Æo/ÊÛùÝ0ž´¥f`VÎççz=Á?‡Ãê†_r�¸$™í”ìíåöJÌÙ´âÄõê¡Öbª­˜DŒÃèŸgüƒÐÿªOç'ÔtÅ|éÁ’Ëñ«'÷ã=çÿ£2ùÊî—�F/f²ÂÓ7jQ@NsÔ¸wÌ |Þˆ`Ü2ï^�‰:ªÌD:PÝ(ÁêzSʱû[¥üô™b�k¼ÙmP>#»S�ᩪ±è~ãù:ŒWWH鉣oZœƒ¢EEÔðРb¥ËƒDéºOc³>¿6Ûbc4›�¯`¦ß Ü‡/çÁ÷6ߌQïþŸE,ñ´w9T׌`N^Y\3ïbjx+³úÎjTlá¨ç퟿ޖ™SO÷�ßoŸ•'8îØ º†'ñ ¥j}�E¯ÌUTòDÚuòXZAêý7­<ȬY�U5  E(fTÿd­nëOãM—¼‘ï}t¨õ=nàE¿–Úg±Wr.ÉYBˆä«Ñ€(}ê �=¿ßáhwÉ|–Å™Q…0V€}“Ó)š¸¿ã^Ï>Ž^¶Î­N€©ˆa ÄÓù«¿3Ü3îºÓ…�‡I–ÔmÝf¿½*3… õP¦ö^©•Ý|CnýPqE q‰hÿæ6ÃáöŠÐBìüÕÆu+s$—hèwœ€vöì_i ±û,‹Ã¤~œúe«ÿxά|yN@h¥Vã²[¤®ÁR˜m†6óN¬£"îÕ¯¿’[Uçã?è¿>®Ÿã¢8r½æâ¯¤ ›œ÷¯§GùQzx¡ÒþÒШ–cî*Ÿ‘e”;J**Å]�eí´ç —•ÅYÅXÕÒ~Ål¥Ó(ŽŽ¢½¥T°,ÃòÞûó[5Ö–mجU8ŸuSr·B��Xñ}CÛöÜÞ}ƒÏöbƒÍçšïnð��ø€±Ð Áx]å4G ~Yœƒwöj MVwåo ^åW#H…esôüãíŠÈŒª¼t…0!žðžŽ××¾¶®_Ü<G¥FÎJ�¹©“ÿ{_µ8bHD–G4sj´–1dÁ =éîFv™é@kKÐ=|RG_¯S4¡èµùdª„çHÕ—)Ñýy¥"…Óµ [ *ÍÆ ¦ÔBÉwHÅþC³—G¾Í!Èêj¬ïü÷ßýKãšæôR÷A³µ@õÕ¡ªWs_Äß²Áž€dCz�жG¨ÛÄ»�á�Œp²Û8…ã8Ù1/ “×·n“ËÛËÝ~ï2HßF´þ;ã|ÄiD™÷6VŽw]òz¾³Õ\D–˜%Á±�vóÃ"|¢âÏ4ÔU$NE@SfãRóQÿ¬GÕ8ÜOU)­�}«‡–_ëu7´‚@9…r÷ôˆ21ÿ93UãñRa®Ü’É f¥Š±NË›ÓêµR%r?(Š^�Î}£Ïb�ÚAgT’*þ°„Î i¨ÿ=ˆZE‰±<Ž’‚¢ƒ?‹’’„HD.©�‡M© €S‡Ï„óC¿wpÝ Ü&¹·ë`]m&Èšslå îÉÉ™´ð_:GÂéV›Oò¢ëËëfô§"ÇËÛÝêýI§iäVké`€¨:®Nv�PNé¦#8ãs“­þ‰Å§EáÃ=+i7¢8´ñàBk ñZaI8öÍÅyÈ+×È1RoÍU™GŽØ ãOÐ}¿&™wO’<«Ù&Â�æf³Î=ý႟¦qäI3ÿ꘧,¬ýt~cÞW{¦ÚïQΫý.l…^Ú{>hððuÎÊÞæ}‘˜?Etÿ®ŒõŸ¬ ¿F ÃǨ6ÕÚÜѨ|ƒþçä†0 e]ë—çÊ&I<.þv71bl¯ç7»âÞ¿½‹\«T˜ªÙT¢ŽÐ½qÜ «�%´Æïñ»õ²¼Ï^Mõ»åu|8’tç¶&+ŽZ¯ëW?“$\†!t¹kïIq¿-®òVæ‘�Ž+&ñ°'7¹#�~“}áq¥U G9Y œ<&À¥T§£ÞN5¬Ä±Rã;)u«‹ 5J¡`j•ÂFç?ÿsÇ„;æýûùÞ¡š¹®îʼ»‹*Ü=ê‹o¸YW¿åoc©sW3]§LuÖ=W¯êlÆ3%+£;ñ+Çã£ÒŸ6‹¬ËÕXM¬ëúµÜAóz[5†òËJÝ¿¼”q \ "â�­:WTÕ-5¡2TÁç‰ÄdOBüöªµSêd¾2”nRWÃæô&z!�óÎHç–ÝÈ(IZ9u~öU©ª×C8MÒ-·àèß�k¯ÇØ}þ÷y{ýÏ\¶yêç÷„zßløÊ’ÇçqÁùÞË&OggS@¥ô M+�žŸŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ~Y\¬Wf›@jÌÞËàܳâ�\˜á XùúoV”Ñ©ºS]Z®&M÷Á9¿v'`3â/T9¾h>Þþ];;¯„~œ™žV—IQ;;Zà!W9‡w¢A‡ˈLàCÊõ=²}e¡TÂéÞ Ru¡Jœ?v¤ë�tw²ÔÚeo$òÄœ]¢(^…N¨ºùå�Uãa[S ×»ÿ¨ù"óðº~qgu«}L<¥€Ž3Ox*jÚÞs ¹êëXátR§¾>­:Ë€¡Šjœ]VÍ÷›Ž3_ê�·Æ6„:ƒf-ö®•í¬DrˆÚ‚Jn$¸Î™Ç•S³5‰,´‰hEͪ¥°€mÿ|šŠuDE»JÖ‰]kÑÙWk«){]:� cí¡•¦‹�½g… †¡pП\®±ý4­2ó<.«wë hÕ= iSŽÀaYf–5k¶2S�­€Ài§èÉKk)HQY´¤¤~c.1€T !Z*3«j(¨e{¶š|÷W•(…¶¹çu]�‘:³zX4M�•$ €Eü³Ê¯ÿôj7Cwá×€h 6rG™Iäzν¯²Ò>WVhkÐ+ʇ|‹tkI¨Éÿ´”ÖѰݯÔÖ2Pñü(øé¼!‡ÓÌ¢8žMؽSÌâÃ|ž�Ç„GR}xiÓUžjÇg÷pÑHÊó2ÏB)ieLêÙ»’8¦â—ì:4tõJ‡Å%˜[íe1 I*ŒÚN¯´¸Ì¨Ân|ÀÿƵZc…Ÿøx_wÆ÷Š\t+³e]˘‹Y�ÊéÖ©qq©zÒ�‹Aà 7l±�J¨œE ®.l#2º¼(XÁÊùçVw»ÍO’]X5×À›^OeE¾ØÊ.ræÃX†O±¼3¹Í›Ìyû�yû³NÞYKqЪ8¤îïôòK–þzí™zÞê}W™ þó/O®bsüáZÃù¥¾ÜñVf¶¬§µ]ß‘Çæ&¥˜Œ!O�¸å³ Ôÿí쯂ü¯²É \Æ@;�_MB—+6œ`.%fG®Íè*z"=¾Šùˆ¢µ]—çôêUiUµiY„'‹pÐŒëu–ílRR%ƒÓ°‡:0Ô’ªNÿe¿5ʾþÍÄ¢ÌlE©Wc]ñ׬°ìÏ>À ¶äÏáV»§’ÄyѵǼ®C„,K(*7Þ]äwñDçÜå¿Ä2° ¢Æñí�=iŽþKj­®—Mœ¾x¯³`®YQè"ϺñHí<4gfÕg îÚÇ¡]]­æ³»Ô˜ûôò>�#ã>yEÿ�?.+:álü'+-÷�L–V:ïl~TêF�ÚµGé/>öÃ`Ú6;œóùõlZëø)Tfšò\Kæ–ÇÈ&^I\ìGÊ'p&8o/Ê5Ḣ¯ÿž#g];ÑY›­òæã…" YÀÞUbr/¨ÞÍnü=»%xÞhOá¨rküVŠö&¢J}„Úýd®G 2©†Ä4 7WT~…-Ü@\óS]ŽÊGCfî_kwÔ7DU[CÑõ®lj&G£ p²*ymß\yιËϰa±õ;ï¸Ýjrˆ"tÔZÃADãªò«q= ¢‘µ‡ZT溛bªs|”æýµõ ßó²,ÆïGÿXR—ŸüA<teLÓDQcù æ9ßúO«æÇóJšé�ˆÇ2-RûŽÓKÆÉsŠtÕ8½ÃR4PËá¬Õj*‚µl©±�Î*/ÌRC‹î*(!eçD`�‘¢¼§H•ÂɸRUAHŠ)œº*Ô£­?ÚÙ3 ]€U¼nX1ßü<þºzÝÓq ÁdmN¥�ÑÇÃSk]DDëã“ïîžÝ¯<(¦e[Ïm¼³sÔÂ%T1RA�aaHÄXk\÷¶(.ì1o=¢áI¯¥¶º½Ýc{‘œ{yÜå^ë<è—ˆHV&g²•LjºHY�9÷ݵ–�æÎ{‡ˆàw¸ž·ÖûšøylÚ—×â!ù‚Î0RÅÅ?Á6ÅïÊ iõc×–2‚š¦_™Êºõ&·´Yâ]ä°àôTŒ=œÝ“ð±QÛÃïÝðQŸ£Ë¿-ReëFêÏñRA—ü­–ÍÃhïy<]¢¸ù…2kù…?ë –vœ“ØO¯.^>ŸlC¬ÀΡjØç©ü(ç ÖäÙ—Ôüï¤&•„]Ю±¾®Þ¹‰$"éZì—¡À/+žüYÞrìÍæÿÿõ¹0?ÙM˜�D\\PY+uÝø*K¶ãË»‹ØÏ×öžJ9A.ÀpùY£âJ8þã8þ ].ŸÙê­²¡{È¿]÷#šÝ¾põ‰ªÿ’¤ ÈôKésèŠ%Ýú3VE,õð¿P­…¦“ム=ÍÑ$º1=±(""Gë�ŠÆç+G×Kÿ1ñ]–R͸r|Ò5º<ÿØÓŒ> ¿3`)�OîÜq£‰rúóC¨šñ�8ÈUaºÎœ*‚º ΉJîe5¼ͪùæM}úF]‘8wuXV_ckJDº 7•52DÂé#YŸ³Æ~X^ø¿ÎÛãÅÌßoÍwZú¡_Ü~\æ+Ú‚¤Âõ"Á¡û0’ *Å1L L(„©)ŠBŠ£5�.Å~B®;¡s*tº�ÃQ„¶<7Dx  U ×�ªlÕ5QIÏS–}qW>SJþÎÈe;·õtjàT-¦©ÈÏX Ã*ˆÝ`õ*¥×ŠžÔ|Y½ütb™ßkÂòÍñ7£A!欇BÎî†I[œW‹ �ë ÙÏóœÖkRû,KÇgtQ<¤Ö™Œ NäŽ:†8Ù¦e>iš‚¢"1kJ»ýg:¿4R‡¿Ò9˜aÊÕ��^eLCÕpÕb-òkùù“£¨™’Û�a¨Y䑦= ê]!’ò³¿¼�éÒñ|š¯Å*ï]5¤hF½ì‡’i`éõÏ¿•éQÃì~æË1Ø3ZêåQH@CÑß ÕÞ�/= ¹£À[ÅÖ«¥p9ç�ÊEi½´î~â¶ÿ¥Ñ®ÕçLU×Á`õ!ŽùhÑ.ºÞ-Ë]Ò5rE‹¼^¬þ¯—-iPØ¥ ;®�ŸkÊ_ ?wCÿôKtò´dÛÇ~�y˜¿ªðåÛ›ó¢é +“Gçt9›WÄ<‚�ýjW¯µ%§W…¿É ÐåGFãg_ÅM¤MÖ9¦¼6K�ŒB ãy_Ç?u÷u4SÌàrã#_øz:°4ª·ÒVʽ^¿‹ešß½¯þOoìj"Ðë*âý[‘y¬Ô"t8W£hÅçœk3<âô±‘@ƒ2�º»_ÛX^ÉI1÷ê×÷pó±³·ÿK'N3Ú›*Aæ~˜RòÓ^çØIùu:Þ|£*ü¾=¶±Îί<’(i=]˜Î±hìñGiŽé¤äNË™…»"4\LŸsL ÷ˆ?Ë@Ä£J×u’lwOU&9ÙñTç{UZÎÌô}fþ2*³•øÝp…/1ý„Ɔ¢§ù5×k]ÖÑH£DdpvÃ4àï Åo±›+[ËN¬|á~ã^ÆÐ$fßB°‘K„úÏa qxíâ+—~EA•Ût¼4úã|xW„3ð˜¬I?Æɹž—¥ËÅÏ79þP ™=A$áßbe™\Wv&ý‰œÍŸ.çt¯³µÂM·ßý¼‚ûÊŠýÁÚ,­q™õO› }¦ôì-\Ì‚HËHøÿ/!`Ï2·0GXwŘ盛ä”N(»x&É“gÛ¤Â.„ãØ~ ^œ­½Hð¸B£g¢Æ&b¼N_cçi)øI\‚{ðÚ×ÍâV}%jÜW@‹¿?¼yØy¨Õ¬&æ¬e úÇå)Xæ¬ý¤°”à¨!YcmpiþÍ\HíçàµÄdLB¿t®¯©—i±ó§²Y •]jÆÚ b*˜?™.îOUº¬cR‰0—rÙ2£y¯åÒLÉ\ã¹"ER?ÐÂq${}óó,šÅÕÉÛ�ï…à0gy“YéœXÉäžÅ-�â©gèå”�î)qÕùšý3uÅþöd„./É*NâäpdM §V‘£@ƾ}Eª΢Ša bwþÄuk­ª©×\D{ÙQAÕ¥éY]"‰4ŒuÍ2ÞÅ´<˜g¥¥!µš×0Ô ö%鯰;*µDæ=ÄHÝ“ðdò`û~ºû™:78ùgCR;W‰ê6Ѝ=„lUÐz½™pà8*Œ¤)®a6ÃÀTCV Ý>ck/§¨nU‘5™™s¨aÈñ~¼¬|ùúµP­Šq|5Ú2«ûÅ„€¿}T!5]Hž`âë!ÿðx1èÂÅ‚…‰fµb ÍÒª¾ª[õ×uq+2Fã~ú/�ÿÝ÷ŸÞô=þGÑqªUQ).hªÎ,™ïrݳš²OºV#diï¶?gfÌ?{Óý¼¼J¿ö¥cf†‡òë¾#e�åŒêÀ•ER«“…X6v*£Í”\«RcŽÊÌuVšg¾ÕƒwÙîÍØ^ßÑF÷Þ^枦qG_~ñêÁ�Ïz5/o$4mwéóÿ†ÛeW„z§œ:¼éwèôÜ;Ôôµ2hm[ˆu4! , »&šæËuH×»bæ÷yU½ÚAž�ÅsÞü~â\y.tg(Zƒ (N‚Ýb÷õ“Í-  ó .§/Xì5Ô{ ›ŽGõmÎa!оz§gßl¦RŽ!Çêdæ�smï°²Z¸ý¿O*l¾ÛVœ¨ÈI7¦¦ ϽÑUàËŸv›cm/Tëb—NǵßèG°„[Sê¤=Ú’:_­ÝpÃÊá�«…éóþ öNµÍlhz�Æûù§Ô\K’ Ò4Ú~ÁzFh”â6tîð5Ía$£�ç‘Z!ë"º_Äh¸ó M½±äO½Œ˜*-U›95ú\xi>ŸÓžG¼®þ"¨R,œ=¯åìxÊ…%ÞFªßMÍÞõÒØoöá.§® ­\ÓÎêµW€ÝƼt2ðÿ#^̓ÁQ×IlÅ틯¼½Ôɧîå{l­As:†Ç­×iLÞ,lË wÆÙL)ñwm‚K"³mΪšd¬+¶÷ ÿü­ªô7D®±ÂJ·„ÐFÀghïÜn‹A7 ÝŠ  )óëÄÞ_rOggS@¹ô M,¯y½ŽÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÿÿÿÿY\ƒ[Ü'ã09g·ê-ÄÚÍu½²ýÓ÷ýü#$cÑZ"}ƒò Ñi¨û!`«TÈíîæ¬ˆ¸{¬RkÜz£[G±?î¬Tw®Ô§Ÿüq ¸ Óö-˜%x=ª ë}ÀÉwûnjÍ Î³¯ãCA¨àÙºW®S÷3Õš­kH…z’5Hµx( îÑZvPq Õ“V/ Ç�ßu¡µ<æþÖQÐÂX’*z[r¥O>8F¯ÝGF+NG«iˆxï|þ�èGðxMÅöÖLj¹@¤§  žÐàü‰Ø’Òª†s1«ÅÙx·Éhýy,ŠÝ<}ÌázX¦ó££ ê*n ÚC墻OÜ3¨C¡Ò¤.S&@‡Ãw˜Æ@wk„5@èÁù=Ç9R€Z"Âkã ôâIí* nOìUAPáµóRE 1PGDÜ)4QsJ(e¢Š”n•¢. ÄDÓÕç¼ 'mÕ)äèfŽ, ÚŠþ_~XK0ÆPÃpŸ¿Z�]¨YÊ@v�—~8ó0PIù0TˆÀLFW@DϾyb¯@rTÉ;&èÞ“ùUÙ\©ùñ»Ù¬ÿ,=su�NÓ/ÐâïéD6/éUO¢2#zÑ‹`éè4WÜ['ù¿".b»z_ðŠÄ9ÿ``m¶aöóµ*vî¬exQÚ¹Ù‹Ú½ZîŸíl5æ%*:�a|zÃQÎ\ÛÄu"Ìv÷ñNj«ýÀà÷ð±ËI}s>QÎC��©ôËm9Ü7|0¨$Ž=öCç/ÅGMôÆ_¦K>‡=*�O…§uW¬òuþàÉ^°Â`G-ä+ékȇ¨Ü¬‘É´‘×nšÌÃw£ÿ·ŽŠd#%Al…ÌT�‡%T͇|�ÆøÑ5ôˆÔ™& vO§´yàzWãÃÄ“2•  ­áöpR6( Ôy’x§ítµäÛht"²X¡:’?é…äØg‘ »*9i}ÕvØÖy@Þ>]ÿ¼$Ã÷ó· ÝhÞ‡½•Î:¼…eþ¿ƒ_‰‘ù÷«�Ô;๊+�-#j?áÎ�’aŠT©@pkšEß´êß›\;? ÂæÏÚA€cÝ=E¥Ðw%G¼XÒ1!ðY\Ã{"˜¼“Äþ¤ÕqoÞ;¦ ê1¸ë,ÈX±Øþ¡`øÖ¹‰ ¾¿ˆñ§'™ëy6ùqZ¤Ì+'difâ|÷ÆÕ¶Üœ\²gõ-ÐÜuô�ž³³ éŠ\�^ˆ,¸Ü?ʃï ÕꨊÁ©’Q÷âáD£ù! *b¦{•áeVK®U«|.‚BªÜnÔ3# TÓɘú5×3 ™.zlŸ€:jµ "B 'Û §reÍzOÄQ9é“bë©–qVKˆ<ÈΠ ˆ(2œëQ“=P ¯ª°Ç6Y1‹C,Ô•~㩈€J·“5ô¬‚` Pµq@Ñ#•ÜRÏèx#­‡•:¹’¢¢ÈÓÌ#ñÛš Úg‹ˆˆŽ‰†ó¢Æ­ò|= ":™¨:Ô>Ö©¬´±Æ�ÃôcoÕ�Þ›”Ñœ‚5çÑ’fÿüÌáñ¨¯GíJ3¹ÇW)StªT v%:è®yL£(¹]] 1WŸˆÝꣻóˆ"˜ºù€™ìüS÷_AQ**6¢†ýÒ�"*yýéËó”úÙ¿E¡êUTEñ¶ßñQ®$ÒWâãÖx曣vdh7‰ºÒ"#Ÿ‰¬ýnOÒk �\¥©CV|ž"Ú?uÕD�t;:Í3§ZH&ëçCºp&¶ùQ“D]=B#×Ðe¹Q]î-Z:œ‚)§¶N~-já £Hº¦[‹&‚oæA VIA5%ÐÑ€'â ˆZÒ1"Òôˆ÷K±­BÕP#v#Gì©1Á:|MɽX,‡åë~:©×JgF•O„B:•½•šå"S+d¨{$˜*k¬NÙŽ¤Ðáø?!ሞµѼ‡ŠS#P€åösãñçZhÒíT£g$O8b(°döß‘‘D¥<@DÂQÑ&ê |YºDkÿs^,¨N2%)?Ÿ#2„ì‡ ˜úåùêûù¸³�“qtfwõ(.œ£¨æJ%ó [†DݱÚ1Ÿ¿#í�üGËZ÷wPõÇ<ÌQ]&Èñ 6ö™E•:yâôe™~¿C­÷çñ}�sŸ‚뺷�í·µÑžŸw¿jpg×wÔswX�?[üVúá”X“þ˜ÉBE„¨J©–Z…ÍcôÇ„™õ,/d„:�[£jÐòªÇùšwåÿ …Ã;µ*}§ÖrÅX" Û¯¢7kú~üw?$°SmoàÁöãTñ–-«á³?¹„©3ëZ”ކ“ÎD÷âÔ9©\ âT—Aðè"ÞÝ–§/s)Ç?ÉmÃ¥WËÿE ̼LÙ:ÇêÓ‹ù™†8_…¬–T|y¿8B+Ùeb¬��Y%.¯Sž‘K:ÆŒZG�ZõÛ¦^â ^¤?—“žN5¸Ñú-Ó_›¦vJ÷ufÁ ¤ž¿èWgk.ö£ïYQ=Mä;7%…‹×CÃ…]ÞsÝ«F̓¦þ÷»ê�oºé±p#ø~íðóYÀ¸ÐEp8ØDõµ®æó«BïS±ô€Sº¯]ûË|&ýÚ20-„±ƒ* PXP>ùÍê÷~u7_SÎåìÑN™�t>âq6-¼B´�…+}¶}Þƒ¡}f¶A´òþaTO}Êh”÷Yñ™ö>±°o¬€»Ô.mC=—¼¿¤¯ ŽÅ> ƒ«z{à�4*,>~7(Gt’ÑÎñ]ÓÍ.MH×d™Åé–zÞ~®»­ÆR!írP‘*ã_YÿÂuØe(prß¿_sÕÜ ÄtòþÃ’}Þø>ž§3>Gés6º,‰²á½º$¡ºXkg/g�~6ï Ï ×•š‹BÇvQÖ€ËeV`Ë>Y\ÔWè àûÞ¸Gˆ p_‘ß_=û‘˜©18Vò+, å‡à¼8M-:4¡¶Ö×¹ïåc^ÁpcS•Õ‡G©Ÿ7UÀÑ0‡¹V¡Ö¥:𯾶†=�*ɲº³VDÕ£ª«»ûÝ"Š·äT½^yj”;ì’Uãw§Fˆ¥— @ÙT¯H7AJmTU¡pê‘TYB[æÍ‘—Õí·Ü³–-o�ü1(äQ%Û©S  —«®Š¨öp—v|Ôàëî àËYW—gÔ\îÇl •T¦\RÖ¢¿žVEºJZë ¡T×ìLíƒw`Zéx*ÔÕP*$àÌ>/ÇÒÑ©îL<·ë(®ùþA‡dËÅÉanì‹@öâŽ]üµ²pHr¯Š¹�@¨E¹�ê¿)31_Ýmv?a–³D¥ÊHïLsw‡¥¹ýTWK;?U‡fºq×É?Ý9~=#­5LöÚÀÂu>—Œú’rs\ªX…tºŠ]ýj8?vg´eRn¦a¤Äœ-íÕ܈uÌn‚�Ó27Ï´Öd¿zGF;à4éI›ŠêN߬Ì&«² ~iܯLQÀØà›.ÖgV-`˜q½B„ÞE¿t?CÜŠjrVpÇzWœj¸ý©ŽvÆH%v¤Úß`élÿKñ³CEŸFòÖ­9¹–ñ²^$dýzÜ¢Ò¤š·›¹@ë/?ȽØÏ.¿¢m&¢’jv-_²,ÆÂ=:í˜åñªª!²ÆÄ^Å@7T1JTŸ¹"‘ÐâÿK2ˆ–,ÔíºŠd×ÏSP€ˆ¥ž ¬ZÁI]*çW™é.@Ê®sàÐ}™í¯ÑûÝZõ�â0+*ä`€�oZST¸ä_­€çcQ,ÅKÙBúŠ{ÃoÈ0Þ ¸žj¼¨Šj{ju”½¨Y´êuÆSDöeLnÙ"žtyöPqÕÀŽfï¹sN¦æW©£°(¢¦Õx�:‚àmxÆY3ÃP@�Htõgåy¨Ã¼Jq¬Ë'ˆDÏ ªŸ´§Qé¹*¢h¨\Ž‚�³Åû¯+ûª©H-™3†ÕhkmÚ ‹5ž}ysl5FêÆ^P¯¬IíÚ765Þk‰€ª89{YÛLà— `[0$ˆ‘˜~{ÝËÅü wiü '“nEŽÜ<»£ìµ2iÑWõLñ®]T iî5>OˆÓ�­uÀÅÙBÓȶ ±zoÚºú=ö z q_kßúk>9qPòuŵÞY®Qà™ù‡¦ íž[Õ¡SÍ� ŸXtŸD¦÷"ùIþ·¬ 6£�¾sÆL±S*Cíy’ê2³ÊÙcˆ8o´[û –ã‘4y‚Ã|úû³¾$:5ŸC•w zU¿N¥’SÛsG˜Þ†m^binî¦Æ|ŸŽÔrì’‡3$?Œò_Þ_M„ÓyóKq ÚÆÚƒ¬E¼bæfãlÐ]Ù^÷‡?ygnžù®ä&Ô;›Ì¥ÉâÖG{ò³D.¶Ãÿ…wÝ[™~yX°®^›bmZ}(Í=‘‘ù>1ŽQ þ(`Ÿ‰Œ†"ÄǪç�—^øx-\²¹YÖy�¿—‰‰ˆN 1×ú‰ß„ä;R0Ó¦oæŠ/¯‚¢—#q>sëþvk±¯‡ÞšÞXz‚—.xÄM«¸M×íÂú+¶ÎŠ�F|ZBY9+„<¥3MA¹™œ´ä(|¯#Á^Ò€¥°VbS3œpÂ"�<}ŒÊ ÄJ™öÏz‘Õ 4¼-´. ÍË;ÿä¾lž³¿Á´7UÉ�î³ÒH§½îYå]î ÎËöhÅ£[åQŽ·Œ·1ná»}’µò «$¡ ixV½4Ë´g·R„úì¹Ì±ªçlÓ>Zÿ2�ªaî·P š®6“tÒxÝIË×¾D2HU“!ÒtµMãÕÝWþoã’£‹¤hD€Hûj›ûi€D À¹êœøí…ìëiº�ÈÚÞ…¿.ºTe�@!ÍÑ”lOggS@Éô M-ñ«ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ~i<ùW ¼•ÃEýH¯4û¸^ƒxüÆ:ÜgÍ1jªÄÀ/dë;0-u\ü¤�ò_ÅÑFJw�¬qûëŸínêþtŠ3m€Áµ÷’ñÁÑYð¨æÿÚeA:ÊIº²™Äϲõ¼p“ñ²`m¡FCÖ+–‚ȃ‘Ršñn�”Êi§¨ñúQNȆa•]#Ç †Sýú"¥šÙƒT꺸¥ ùøjMí@3/¸Níd @´Ò´ÊwpMsŽDS8u‘0¦ YˆÊqÅú߯á!,GÌ 0wx GgzšÃéýÝRjÍŽÇé¢]b)±èA¾ž¼Û(2§Fk#"‘—*@à’óŠ2ÏeE¹�Re]êÔµÇlÓ ¡Iž7e}hùôÖÅÕÆPÓ�‡,Ñ@ç|g²ëÝñ�îaDN¶_QLC,gó±Ú¦iÄóž3>~øå S"·ŸZú­N®\ºz»Vlb˜¦0P@CÖ×zN¾¬ñEʽê?ïZU:D Lu+àªRkÄÕð*EGw'* *ô®ˆX5¿‹:òÀeú5=ŸT�I ) €ÝÔl›Z;™å³Zt£ú´ÿ�×z™«K‘]¤Ç÷ÆãN…Ëm¤G¹îün’D³é÷ayÆ\ç£Í1yæiº²˜œÿöx[/æg¤þᶘM⚺ZK¤ËÃkïsÉš×ÉCKS–ºÈ>Sc¼�óOa¦¢¡‹6žíË•—“ü_ãÃéý²o¨®¨Ù'yÎ}·çï±Ú²|"ë)�Õ…].“jÞ ´‘ùXc=s m¯½¢‚[”ñáiµ~òÕF5Uãþ˜âôÙbÅ|—׋m=í´iòÖTh~)üLÛ–îü¯^‡ëz}©ÔÞ8�8ùë‚W§gzýV?AÿšÄ"KSÞ¦GÝ,RƒµÊø†³9wç®ÕxG*Ç%(Jþój à–s©Åm«�ÅšDa{ÂjŸŸ•´³&é‡�âbõ‘öjé�Ü=HœW|f0m±[¥�G¥jù7½Ï^O™óè‹�= }´m,fË]_¿z'wnéÊ“:ìÊø3ÖÞ¹NÕ§DPž¡äÍ<¾nŒ†8j�¾Þ¼v²|SïÓã5ê°/üœ»zç ä˜)+ËêÕMi‡ó§¿f“W¼îq„fÛ�µ•!q:ßE±dŽ›Ïè‘ÕŸoèÄ’çórê2¿~º‹æàRžyXx‰Ï$‚YJ¨ù0qh;ÓÁ‘ ½4ûEÅ ‚-‚ú‡‚¶¾Ñ“‚ {Ï…�•QI_“¿åä+ÖâÖ‹µOWït(o”hx²/ñµÝÍ×O+L¬N™ƒü‹'µðšæDy/¿ùŒc)Û^¶h’€1¾YÜZ�t_`ÞÌîOâ–ÿJë�¡ÚÖ¸^ñ¡cK˪)l�*^Ž_±O�sÌÞ)x<_”ž pµn\×·˜úKäùÙ–¦žÛ¨‰9J$àJÛûö{’À­Óµ„+™oêí&IÙŽ–*ÀTŸýV“È·7U®h¦„L†Ë)‰€~©�áí£ŸŒ¬Qï¹­„«&À‰û^té%ÀÍ–—¶’�~þ·vŽ ø—µŽ T€ÍJiÙ_Z�˜„²¦tç¶¢ PpÊ‘@E…=§"æ“!Ø9€vfõæBçgìÚ§ T¹_‡e­Ïq î�¿^\gA4×Pÿñ€¥ðógÕÐfç–®�1µ±HJüûUc} ‚â¨ñ¨G‚`aE{q˜«KÀ} ·7òèÓ¹Ìâ5?NÆÅ<]]QW‰€HÑ»ÿ*'ÉšµÎÕ†¬ýL‚k¨BæqÄð²» P5X_¿ŽBúÝ5ëBr¦£˜Ÿñ_+5¦õt›/Jky÷˜ÑÒÝÕ1å, 1œãµ©Ø|C_òŠéé»Ã„[‹¢æHJ%lò"²;ägéÓWÑ�uW“6|úí �÷;$«„O²íëù—Û9¤wɨ{¯ªfùôr“°^³pöv1Çæ£ßêÕP§.÷Ê?fjzš˜ÛÅLæàhJÞÒÎ1°’ºw§dÁ‘”;:%¡Ã‚ùvbæQ¯ÔÅåäm~šÝ/'Îß�)g¼N•ˆ©{ñÇwÄ™€W]Ö¹Rƒ×SÝþãÅö’3QqHýEóC ”ÈȪ!Sžä4Õù¥Ṙ)©h�"ç�ßH²ÚrMaüÉdö‰}Hï3É(§.aY)�ƒŽ µ#ÎÛÙ­àšÕï½5àöþw½þí'–Û¡ç“É[òãÂÈ×PIX�å$wź½MG‰o]ËÛYuæ}ç_BÇοñáCå¨$( åömîkÕn?-ß`]%_¾-ãq5S/úÝBÈŸ>Áœ'~~�ÂoÓ.KxâÇ–ÝÚh~–¾ýõÅ]#Â`—‚.ºEëéWÛß}÷4_± Row $ü¢”Wƒ= éìÖXrš›ƒ¹hÕ?Ö÷b·j矫DÓžLRtÆнñB‘ýŸ¾å ˜ Ðƒ�x_¹Í ¬�VØûW[+¬g•…U2ÐëY�Skx[õfûÞË"ù�èüJº©ç#¾ Ï?‚!¦�šsšNWJ…L_sGˆ¦D²‡sô>ìxc9°ùXÊð�–ø¹';³ã¨çLbñ¨Ÿ“'Y»ÒV 4Ð\Þš_z޽ÙÈj;ÜQCû3]‹�+®mtHêñíÛÛ»®»a¯Ývþ˜vPݤ¬:_pZÕBÙ¿¤Zo<”æì_ +�BÜnìý˜¦íò^JÉØ™Ç~8l¶ú?רºù‡ˆm¬*^�øcV­E-—NσfÓˆU©Ïš£2Îó—QûѪX�·Q´)Ÿ¨,'ÿºðÄ–[µ¿è¤aS¼0þ3Ï  ˆB,RÉÞÉCa˜!êà ¯‹ör)^Wošèƒ­»dÕþ�uV‰ö¬PÞ«:«´Z¿WkYe³Êì(ü¸zý"U½§´÷¥VãEÝ×Cˆ�guÌ_Þ�‡MKñ½†K¶¶V}YÄP@TS¾)¼pŸ¡5`‚7x�ß½ÑÐ$yÓüì¹ÿÿ“JSKb+›z=ƒøÓëë½®2|X(ŒŸT&Í@œpÝõÏéyD/G"f4/#§�a5Báqd\†‰ U©=ðh(À«_ƒì�ö.q¡·%bèÒqÍmýQ'Öᛩ>–5¤6¹d§ˆ¢§L*:i~y¸â€R°·“@Ô8BçH¥E玓´¼RÈðz-ý\êâ>Š7Ë×:3 Z%3�úZia¢ðÔ-¢R¦UÕW˜¡KCúzœV' ¦IíÃé�n€àpŒ ɱ»"P ý^¦ïù8J�žæhX†ÎT…âcvŽý©»„!\�Ýyv»qRЧ_ ª7-µA�ö¨-(zˆ;@tRgègŠ,aš:ò±ôh�ÞQj"±¶ª(¯ ›´LˆëˆH‡!Ø÷ð€ ²:Z•Šˆ¨{Þ�wéI†N´çqø]ÌCUÑF4òD*@WSk>¾±#~ ¬Ö¼®›ªœp’¡ZÃàN õvžƒû¸ Õäôó鹉8îFÞµa[»aïíšhÌ«®„ØÛ-wûßy*ÙÓŸ¨zÝQhq|+1’Sl7°�*FÇpPÏ_¾ 2úw_ýçûLŸÒLØO $ƒAÁfÎî)rj±×ƒÙè ÷0ôèâ[/££×xënc|.�뇬|ïÄíJk6R7ùÁïw§E80ìú»—%�ˆøtŸ Pûm†ö�'ã3î1š2Kf<ó'÷yU*ÑP�n~8‹çç6‡ã]E;åu=òø¯iÖÿ\DƒÇi·ªvøÛøÖ–”a/¥‚Šhd×ÍÿqsÞtMñ„þ}dù \ø›žÏù²Q×ÕÕKC¹&j4�WÄ@ï=ªÝ"~­üŠ@_³bÇŸä®{ œ´¡•A㻸¾+ó ¨L7ÛlŸ/çŽiËÍ�ªÈX^¬O(C–yX-'Òä{‹w}‡ßcŒvuº*ŸÔzX½Z„-ú_ƒ²6ö¯�¿Áz§W Kþ-_Î=z˜(ºOmùŸ¯ÖC³~!YÓ5~~3 Ü®“+©‘5Ô–õ;»$)^ï6If6I[EóäJ·ôôÕö~7Éq:À?¾ð4ýÚ�Ÿ¶½í‹÷\î3øl¬Å§äI–��ðjüµé©åý¬¬|unAÞpOggS@Ùô M.…KURÿÿÿÿ$ÿÿÿÿ9ÿÿÿÿOÿÿÿÿQ¾¼�Á'ˆmXð]Oüæ6øn@XùÔöóE!úÆ<ö§Çùã—CÑ_(Nù@VAw1}‚ÿC]JЭª�8ã™ÂôŸwxžßÝà'™÷Úr@Ö‡hôò=Lܨ«ÜZd Ðj–uj�¿)¦T"—TG5w΀| CМG@§7Éõ¢'‚kºÊõ7º }@>¦âÆIÅ­¹FvP'2ø<¥Bϵ‹µ�pŠ‚:±¹Ü’±|¼ù6¯ë}þ÷Y*�ùûÙöW€êuŠVš ™ )è~$R+@FÕ��áN9M)â8äû:æc£¬ª<@vªÆ[¡ÈZEj×JŸÙð)1AÅ�Ô¬Sg• ÕG�©f€ªB�@¬W¬‹ô´Wg�.+æƒçüüfôQ~zä¾8�Àù¢Nµ§™ƒB€˜“À�ƒðüÈ@HŠë&9ÔÙn¤9æ~7¬âˆ®œº‹l®ôÿhöš@QIˆž¨ŸD=…R.À]�¯ «I`8‰½ã_Æ,ÌàÔÝîÑÀ>ßi�ê».Ÿ¤¸´ëÁ,cŽýv™¢«“l ÛU¯o£Ú뉀w¾]¾oü©{íN#¸å*Õ+¹Û¤õZæ[$u-k-sáˆûÛÐæû®›P{>4p’#�¶©øá¯£nLbüë3è?3¼x·9ŸŸ3V.^ÌÖÙåƒ:W>„{ñc T´’Ç¥>מnVŸÙµ1~ÚÈþâæPRÊ.Þk%úû“·­BüÆÂŸæÏ?U¨áüfQ· ÖC™RB.r„ÞÔ[ù ÀD7±À@óÂmóþ«%çñZI¶$š·QÈ"å÷1³fB‚'KkfîGz­g׎&ŒÕž§¯Æèí9gtI<|îά‹8¸=ç½Woûq$ç‹È®çÑ$¨ãÊI°ú- ÚŠlo§w„F³¼˜Äp>‘5¸^cñ“õÒ±aÓÎ×L¸-êæ0qÐõô)sŅ̃û‚šR_¦¥*¨jÙ±¨~;¥Ú¾›¯Ó&áÿõ¦(tÖuÛ�Kr*¶ïMùÛw5þÅ'‡zÕTïÞË\ò,¿ºŠ/ú¹´) :úgØ&OhžŠgG ãÿTž?ˆ¢Ü+ú¯U"U+Šî|ë=ž(fJ˜{R×ü¹­®Õ_ÿ ÿQ3³Üã¾;s3=Šƒ^“ GG/b‡Ír�x©6áŽÍ„î¥äP$xskjJm]V„~a{8Þà=?Øøýã ýºÚÚ /'÷3÷ºB6^ø[òÏ”/à€ß%ðD_ÑÞh¸¥àw%áÎ}üÕ¿íT]æí.ÈÖØ/‰ fù¾ðÔ¹k¢½·UŽ?{;¬Çw_ĉºÛå@zÀ_‡g†ô)¼�ƒÆ\ݯ‡àÞŸŠ|"õy˜'ÕbÎÇ<õ.?¶;·hx¬××ýa%Õ¿_�,иY/�6ÍKÂB¿�NQUú·Êlwêõ ÓŸ‚‘òÐ*9|âAŽI‰<’,rNÍ{u©â�ÙL‰GÖ“{×> ÿ.‡Ëyio‡A9ây—ÓÞÜéC7ùUŠó÷x12’ëôÁÀªzZ°`ÿ�Ïæ“ðoDèÝe~}Ã�Å’½óÕž8çŠ Â°©½g?Â5iðë%bŽÕz®>k‚›öÞX¿Oác…[7é‡)jÜí7J,òøFë»ç§:]f{#£ƒLÉ0ïZÀŸq�§f`y·pÿëa‡œš{­› n+�4�2F#]¯ôñé iOQw"æ­øB‹åí.Ï�!|³Ìûi¶DËÞþp]W¥üõ¾q|·“¡I®¦3f:L¨âÕû‰Q'«áFfÞœæð™Øs§Y¬æÚ‹žX%ÆOÛ¹#¬âQû®2ÏŽBVs\E¾æT|š4×]ÙŸ�úÎÏ;›ˆÒ«ç‘Cus@Í׺Ü$¦8Ù;•�„O ð.þfå+Õ°Íø_b–Gýò:zžè[È^GRÙDñ$Ôé;þÈ/ïc§˜'‡¬B_>ºIï�¯Éúþ{�š;ÀÕríúk3ºÞ>³T‡¥‚÷Q®Ô>ˆlå%ï˜a–á<ê‰úè{2k£�hÔ©v‡F¦þt�GECUnÝêᤓœç|Rj¶þ—¾MBP볤H&º8SkŸ V´ÆžÑªSmîŽð3Õ°¼ž�)îù& #�Ö2¥ƒÖ9„Qyê]*€ìùçQ)n”0� j^€€ˆ„ñmº~^§wW¨äƒÖÇ´h“d=殿íõ€:ì1=hé–í¾/Ñ/�èH'&=T»6ü}wX×à¡U ¨YYYŠVQ ùïë<9 Pu:®~8ñ)EÑ—ö«ÖzÖÚ³î¢Nˆž¯_n‹kÜÅkΞä8Ïh¼?üŠ…PûúF™TÀ�Ö_,ýJý>W½­´´ÿômph}‚üU’[ŸŒæ¸VúÂÆÕˆìM@à?"ø"pZÉþVÿæv…»-¸¯Q,?v9ëÎ|Ÿ+ÁKç£çê+æ¢jçôwsí:éþáõÿà¤;Ý»KzÎ?6^ºÚ{Ÿ‡°¢²ŸuõþN³ÁeÕ)èË3W¯(x¶wôûü퉬õSê¼X'S¿óˆ"*)|\Pþ•2aÌuó™I ­Eâ£lJ±;eñ>Õþ]îE‰bç<ªv×¾¨”cOéJ«ñ*h‡Ïg3N¯²Úì¥þ”ÞºÇCúuÌÖ`YÀE7×üïXÀUýÔÕ—�XÖŸ`¾}û¿iL>jH°ËÎË{þèØõ+Ÿ]UÊý˜h×V ;qšÇ©[”Ôq!x™ öî Ž»'|G6öñ×4´i¯«‰ÚZ�Ÿ—ÚÛßY;&æy|�ç«ç¨µ@òOQ£’r½pdúöY\�‰5ªæù’3jdJ}_Z)ˆ½âköPÕ“¬¤§»DêögGòD °vÖï?C¨RCJråì<ãð÷5TÒ!‹ÐK2:˜ÈI&ä%yꫤr~™(BfB•~øùÝËÉÏ�@kLM»ª80g·¶*’g\ù\zr@æ¼¥7€HnËôSŠwW RzTP¥Èy�Ÿº…`¸5‹õ&­Sv÷®•Ë$?«#ë2½ö¨YRQÕš9“(ï8­ÆA´KšˆÌ@Óƒ¢Z[ôì"E”އ˜í ýhbæ¾Lûç®+Up"ˆ#Ͼ¸kµÝ ûi®íQ;?Ž{ E©fQ™9.U€Üãõp§sÔÚtAU¡óCBýHèÏûç>³ðO&ÏŸðT}<¦O¶ëPåd° óȦÝÉGÝhÒóð×s8°·S]ûx�Ð(š3þÒN {¡ðáH†9©…õ=…”æ—ß.5�·�¼Šþq‚)¾1½5‡7È}Ã;®íÚ§n8Éì Æfͯ+»¾©2ŸÁ>º:ï¯,ç,wÞè¦ýa­<•åF¿ù+%=:îzÌÿaó|œ ªÙ\¬½ð¨=tXÿÌiÀCÆâÍÖºª¤‡3©Qâ›É»¡ۻߗ ËžãÚ_ìôæ³*år°à%_/Áù½�ž絉/ß›«È±¿²*‚ÅŠfŸÝ†#»»µÀqn2”Ö¥~ëŠ/Öê{6îëÍ%Öö-[úü}UvÃɢôŒ×õs¨x_m™�g'_aõøâù„¾:i¬� [¿,�|•Œ8nr;ÂãÆÂÙv›ïüÄд9è"³ “�ß ÊŽ=lŽÝKQ†<â»í¢âWð®´#=ò›[†Ï67š”8ýUyö„�¨`�©TÔá{–gðýEÓj ïêWÚ±ÇlöÝÇ~é•Ū¡qißdY§Ñ5^í”dïAéz»#»SN÷»$ 2µÕ¯êu¿t¦Á·ëš=ô1Ø\.?GröH5Á]7ýe’wS%ÊíLºk ÙÕß+6Õf² Jµo÷ÔܹÑõlW¶�sÔ‡ëνÝh�xƒÌ„·‹GpqÚÂÒ×_¦üË}O�o·þD¦Jê´5û(~vïl.ÁóË>øÎl×ð±)ðþ©¡qÛÏCœb!…Pð¯ËÉRý„¾gQr¢õËyV7üÊ[1­ñ{áFÆ ¯Ø¯b_/¥+} WøH»(Fƒ"M/WÿØŽyQŸì—/ê·¼¢þ—îðCþ;o²ïÀ­ß£=â8ÿ]^ަ–ê¸o´qðäߨþ¤±Y7°wæÎ>•Äî[ÈeÉv[ñ__öq.õz˜OggS@éô M/*«yÿÿÿÿpÿÿÿÿSÿÿÿÿgÿÿÿÿiÞØ[•Ïô: ià÷è;•Ïà�ÀïJ¢¶Å­'Ol){*S36]Ažm|QÙ³Mô«ƒNÀþã§t _µüKjæ_‚œ7oÒìßЛäìå<…²;á5­ÐAÕIw]s¢@ÿ[ºyÌÑ8qwñÊÉ™£'†C*ƒ>t­ìÇ‘ŠFA»zj_'8âï…Dwü³ 3ŽÓÙ}[ÝìBƒ¯L©œ¡]¥Â”R³™3SäˆËÞ$ú'>/>]"·cqØÏäó'À“˜$Z@¨1å6gV­ /áVÈŒw‡¨jç”ÌŽ ‚Rû©á¬¹Ü¸ìA‹›µNU¨ËµûïU\·]�¾Ý8%SÒò龤ŠêׄÚe�uЮH�¨Ù%s‘ù¡UTTuÍ£R' ~Þ-ŒšQ�&iÂ?2xeï̲~³vÄ1çùÈ9IQÉÁA¸4Ψ/Ÿ$¤#ë *áÔ÷»4´T§?"¤Ð*­Îû^QÀAQ¦l"×ÌÜ�¢z„­ƒ”®!ÄEÖ‡,œ J÷¢ÂŠCm©ºPÝ;‡�¹�,ó홵ÞSm1“ãïð¡£åÖ>§H€ÂqÌœô7=è(útžþÂűòŸÎMáà¾ÿF°|µ o—‚ÆÂ÷ˆXv¼©ŠŸA5~²¿s³Õª糕“±™•»óÿ9¡«´l¡}:‚úû­É$�nÓE2(gÈãÎ÷ßð?ˆv1jp,Ì÷è0ÛBð^‰þʈŸ²Iw ɉL쉭"ï?±qrûÔ¥i+§òÿ=<|ZïˆãÜ£á$áÙ· Ú‘àIîvBsÓ{¾Ñéä×ËúúsÈûïòsÊ¥ñø›/iöb7š3APNû°±’Myš¡sP�0òÏzÏc“ïàíBnÍ©Ï —6 ¸R Òp“/Ùsíî¾ÍnÉp?Á²ð_x³ ¸y—í 0NÓÑcqÝ…œÒEÞ èä¤ ˜nî\E-±ÎtµJïÆvâÕð‡y¢¹õóâ –Q¿×S3pÎßöf³.µX,d3·ç�=úÏ>cR¼=ƒ„+ò¯]¿”^ëŒtÌ3¿¤¹¯mÿµÃk“,±nóÍIlÄ‚I³Î‡µXøISøÇbà tGQ¦0×]™¾å�ÞºlŸÀý«BÁü±z¿8ª<$&É;­Wz€FÞI¼B=àA ÷�ïÆÇòú×�µlùŠ,ÅÍ+ÌÖ?GyòÐíÈÐô¢YuwªA¡šÎ×ÚH½%œˆ½›Ô ÝÝŸU*ÒÑë[×<‚êöÔNˆHpìù�íPÎMJÕá;G¤ sÍÖ>?ËL‡J¾HaCƒÄz¯T—�xwuѬµûPE;àžÌìhU}Pȹq  ªŠ©º<ÞÉ8ç¦â�n;hmfD h úWªtfö^¨^™=Í]ã˜`™îÓ{RsºBB„™HD­ÂQs%º˜…¦*!³˜DÇݤ¯PÒÚò´ûD¸F댕n�â†i áCª®¢Dl‹|Û·Gc:Ê›FíNE’Ÿ#Fĵ�þm\¾:wt!ZÉŸtÂYSw­ÎO*F Uõgܦýt´Ì'>KlM?±þ7ü�ÆŒÆ=~mÉå×#~k×Ǥúû:¬|Yßž+öití_ŸìŸ;ÀÖ.­yj0Ì&_m’ùF~ëpy.�ÕB­sp?8N^Bƒ=ÏšM¾"¾”o[ÒeåV¤æNî±±·6[Ÿ'èùT‘fîh!¦.�ÚïÕ‡Ùxp£V±81Î_o`§ Ô¥FFwÈŠòRí\¤ÊéøÞöè:8�Ű ¹¤=6íßUí¦Óé¶Õ÷orî1ÓF[÷kû)ö¤@îW¥{’¾~g¿Ÿ[ŽGú7·1uÕ‘§÷hév|lPuã¶±�O…9�í‚Ýù»îùžoÄòp…]V?Ì!Çð¸ú Ãtâúºé [u)”q^;9N½ջ؟•]VÅ>j%ö8=çÆìÎÉ÷žŒ�Ûó§c{¶œ¿o.{¼€Ù¢PÜâ•}|¢öòœÚ‡9¹Díý‡-ånvÜÓEnî7¼ê÷Ì”\ÎÖžÉkKÕÒìÂ¥­òò1% \þ:]Hšž[Ö[C•Çu ÞN‹ú ² €¶°¾eôÍp8ª.ØEyÓÙ¤Z^µ³õ?w¦P'þÈ;•GÚz †b¾®}¹j¿Ríapüíž]h·[8Fï„&·„Ð�üǵfê)fïÄ»1?B*Ã#ß�]D÷E¢˜ïsíiwƯT�§¥w} H#5Ô˜Ø È˜ç«ýSœ9¢V½ªr… ;kM¤_[CémI'vcÞ#Cçõ Æð!o;yT€>µºª­Ç÷@Tðh EjÖ4säôóû$æˆäªµŠVA�]º©è¿ÐªµÒ@­5¦RÒÝ÷¢µj ý]£ R»¢B=I9:’º‹J×Çï‘R©)šÚñíˆpjFLÿGι³(‡€€ç4åÆw½–ŒTâÐ=tž+59òÈ‚]�;11;ŽJ]òù«ôŸ>;d¨ÎsÍš(ß¡+8Y»:€–nºÌ)Òy œ«T§8 ŠÑW•©k¬ùGÎêJÑBTvB€Z+t–¢<öý*ƒàÚ#™)PáûˆFj_ÏÁkDëõ/k«¥�ž€ðìÛ<éxÈc`öé «‹m��ÎÉ»å¨3› 9Šø½Èž­“z<*ŒÄA@M‚”S`”·q÷~ò)Î{wÝ®Ýè9êd¡2ï}lvÞâOetÃm¶�d•H^&Rî9ŒÀ­­&ŽêTŵ­m�êýigÞ4àTw¡¤z¸\Ýps¥�#/¸‹¨3™èö¬WïfwcñÕ¿±›â©²åZs(Ñ/vÒâïÆ¿'ç&©ç¼ýÌsÁ¯sܺŒ'íÜü×7]0Ÿu^×k®Lh½wsPø5®_îó•Ú&I—˜ÞUàŠZÊÇ.DŸõ5Ùqüÿ=õÃ[JÊ”Cwu#¨šD\ßnoÉ#�»ÈɌϗœ€¾¡sµu¦\ㆶÕ�TH†?X§ËDù±Fú¥©CÁŠ?úø¬ÞôØ¿nD;ì>ÊÎ{¢ç{Ww‰ûÏ}ÕŠ,z ÷Æ w}ù¤| ` Ù£‘�S‹ ~!&ß§�nСóægoº³ê–ä¡1vé„I„9hë˜ìîXñ'ó´ýnû uˆø¡m‰Ê d0½‘ôøÉå.ržæTïÇ.úáÜ9÷Îíwo0=JóÒíKÂ5$’ïÙ�-j´É%&Yÿø¿Ã|�ï]c°“]¨8—Ý^½™�»7¸Âèȸ5€ Ùˆj^‚U¤`û|+×k*P#OoüÜgÿ›¢(Æ`¢Ø›ÂåœÐuŒ‹Z}—\œ<�Þ<*Ÿ<&Ë“#_�éó ¬—·2S“ÍÆ¼Üô»%zˆ;צSaž$W§¾T¥†QvF1níwK¸ð¬éç~rþ>ùÕÏ>hÞRæø¾4¹ã³Îé‰WÏ®³ºÏùBz&ñþV̳åùºÃŽ9Ä÷„Ð3&n(dµÊèÙý“QÄtsýÏ׋ƒ?º¹pº3ãG�n¡ÐGnVùþòŠâex;sFûšx½-r„Î §ï7«¦šn¥Åé*«¢ôX 6ÀžØÛ­w¢M  ).ý u‹õ‘Ù€\Áj¿�¯î}Í9eóFBÙôý]ɧT)ן *ିË~ÌWd‘õgÔ9dëîg '™�HwÏ>j•gu�t¨�"zWqæç5)ê—\—&¨/ÉÒùk^®¹‹£æÍ�Èã' ´óõvT´vk¾¤µ[p¢¾÷%ÒqÉ'ã ˆl׬!u_§¢­gsµÃ¹ÜÈD•¥k¨fPßÑ h¾ê§… @ E¥ë]:y­=ÓË¥‘NÏäb\]�=¤‘)G¦vS°‡äÅóøºÇ=‡!7Mq¢9·2@8…|RÖÃU¥ó1UW‰\_KÇüG‚‚Jª;ÐK�Yé¹êê-Pþ|.¢€3'ìDÀÓÓî Š ˜*A8²NóIrÎN˜ãéõì*#ÛõúÉqQ㈨æùêNZéZ¤Nîž¼ûêçwp­EÆÌ 8MïB׊NëÁÏH%gz”®ÅQ“®TÐâ©ì R©'ÙÔzP³ª�0ÏFŸ#òý¨Ÿ×�B/�ǯ΂²‹û9dò‘4À'£þpªô£«\ÇÜ$³H7‡À“� ÚóMÄ·A9éÍ)ÂëGþ7Χ�$Ö•ÊŒÉ{X]ZÍ]b­wï¨�í'vÖ—}cø:õ,}ñƒeiDÔSß]×^Å}¥°ô_„ÝŸ-kŸ¥ƒ6ï;¦Øèc>„«oúo�®ŠR£î°?ÞL³Ao:óº¦6Ö\÷Ò®æ=io}Ϥ×Y¨•]{äø5ýèkfÅ.a²³÷¿~¿žá<Ê’6 VG“Á˜¶¤ŸU�PjLçË=7:e*HzŠ]²êÅ ñX £»¸PU ›ÊŽLæY¡�±Ï°ƒ#N›ãàòð™ ›Úâz¸°È£oŽL_=ÃF©ò&�õÓÅ.'IÅDv—‰ý�u�ßÏ»ò\ÈÐ;ù·‰˜?• —ó ƒ€°8Â,èÔjÜoOûGNyþw×*NŒlv;¿êNe1yոЦ\y+4wÛ«“÷Œ]avç†Y?þº[RÿÆñaž÷Bz¤}·¿{m®[+FmDÔ‡öýf9ßUX¢ï›)ÏœŸúÄxGÜOÒ¤.æ ]¯â¾£‰ÛB+{š ÐT_P[q‡ oÇË]vÔô@W¼Uà»1‰?g/A�é|K+|§¬&îas�Pü‹þÚxaÎoË;¾fª>t†ÙÖŠ.Džï:Í•ç7ÄŒ—øÞNE»øÎ@™ÿÕ±Ž.Ó{Tê�îƒ ¿<ŽûåœRÇ<ú®~üe^èòñÏÄ®æºy–¦üüãjÛ‰|ù òœ 4¾Î͆<ªõ�® : §sªIµDEåµq+Ûû·þp;^&¨ý„eVrë¥bÂ)X?×ï[Ì©c¾¼l¯Ÿ8\æïïеC˜u‚o‰|ÏZœÛcm™s|LN“­+ü9÷½‚Ï lïvXš=ª›âµ(’¼Èûy›$HOggS@ùô M0~¨Nÿÿÿÿvÿÿÿÿˆÿÿÿÿ‰ÿÿÿÿ�>Ø[ÂÏô˜ Öxs'ÿJ‰ Ì!®ÀÍàEûl_¢Wéz I T6>ö$ú/?üj¿ÉÙ‹Àk•ó×ëyÔ§'%­uJª»~ª¿%çBº”ï'ŽZ/ ÈSE÷¹hਵó¿žoÐoJÌQ»Ù/íèÉ—Í÷¤L]ìSôA�g^ÔÜ�R³’!qf2ºJÁp¨ßû]Þ›I�û»‡ý'ÿ6㵡_N�² "¤59"‚ ]æï®ñeÖF�‡Â 2æ•� ’w%«ˆÓ¢î#èŒYèÎ0UÑýˆv¹ŠÓ=Ä~ü¼&¾<’Úx�ÐP×3ïÞÙ5‚b΋ϑˆ)¦©Âþ­Ò— R«Äܦì¯ÔeR•z5¢žêtW ˆ�uOEÊz­�hÕ®áÚ½@!P¿ÍoHÑqw Š&áŠéj]UÝŽºüÕªYÑ9]-I¥Ö}?®~sªœ 5ªx}O­iœF/EÛÏçª^éΣ6Ñ�ykפ dÖ³õ8àDOìЪ…šÜ�ý!ÝšFÏ5£¹åÖlú^fþq-ˆì9QÜzÏ6é%÷ДýØ éfŠRuN%B ÁÞ�Ñ»’TÙˆPy:G@DH �µY¯�· ù/"àËïÖT_j%X§2œß1Ù¥…%Câ+ÛS3¦ìP2|¦÷ÙOay,û?%§‡g·¹gpˆö,ý‡-'ÕðfÜuÏ•ŽqP¾ò°—ŒðaÉQ‡´ü>c+ñ^סyBëqä®­#Þå\$úÆ©?~Å#z9h�T.¿ésí.m˜87:û�œøì•#äfWj.Ç9䯸 /“²ÄüóÇk™øŸµ­s£�–'»e±²Jû_b’øUl­k�£U5ûzÔFw%s]�lZ""ºï(íŸõ×î¶楪ÐJ³{L8Ç- ?j»ôá}‡�t‘6+üVã§HÚpd@¥t¾ÿ¤Œ}ÄÞS»¥mºˆ¿äI:ï_Üú~¹g›Ìcƒ]å2½?;Œã/–ÛšËO3I¡âRð¬'§-“�ò¶×ív�k¯DØLw‰•‘~[s´™©³G…ìp4âxn<£K¯·o‚>ù(¾ß_K†ä(_-Ò^J‰#%K«ÕìÁÿ€R¹WSèíÖ`µ;•~‚¬Ïo±n|þ?Ó{Â%<"®¿µSê}ü²üÙ¬<Š—¤)e$ä¨.¥ñž¹o‚Lr„Ѥ²†©HØÚ3 :^Ù?Qa8VÇÕjÍöL™$í_å;鉾�‰âlZ-+ŸðÜ’‘0c?vY‰×eÈùYþðº„m'xL9Áè'FˆõÒ#$ª Œé7\y¼]~='Q?BÍS�Zzgñ³4ï®xlMåS “›så´WåÄäò¯j_¦ä¼:wœ»SÿZ#Äp\ú²OsÝYV¾Œ]glVYýœ4‚gÌŸ){«Ô%•²ùB(A@nœÐÜ�Üž˜åF?†ùßÙâk6¿NydïÇ93žØ;ƒ¯ôXdLðöé&û�æ„ÙŒp½¦ÿb½–ëÂ;#DPk4z>úLQ¿Ö1}λõ„XG¢‰vÀ{äþ×4w:ŽTEÇ÷ø”)ýÙ©�§ïîuµR6Y¬Z]£Å¡ÆS÷*qþV‡ÆåTÞæ1?û_]ªÃTÜÕc¬6ZêYBÑ#Á‘¹>´‘wï��ý'ÓyÕ<_5pPT‡›@LÐ3‚ oªÖ‚ÚEÑ×vÂ1¢åËïãxbáÆ çOºx¸š!òïcù|-¼óóóã#3‰Ž[ï)AèÊ×<]§uïøª*MO]f8z�"Z¥ƒ9þMNÈ\4Ñ«Ô8:¥�HLñ1_Ë»¡5ÕhqèÊÅ!"B¾#ë5�®»S¬"—ˆ7ŸrÊ�yðPq2ç¢û•gÝ:eÝS¿Wi©3ÂZ£Öf*’ÌZ›²? Ä�ZWWzV�•£w�^L»ÊW÷:…)”‚‚«ª¡N�ïõbèdD_+éæyî¦R«Ô®ý¡Díª± 8 GVš3:¢à9jHV‘©vD+Ž3¥ƒhm­“r×uþöG>ûáöûJ>«<¹…’σ0;ŸÛxÿœþÃu÷þ^«—¤{¯”¸ó;à Ë55ó®Ö+q:Rj‘›jÍ-X·µDf}“µ©¢”Ó£Ÿ-?#þ‰Ö×sQÛxY"¹ ðí]QíW^RaŒæ;=7ÚþHåeu½-n|Y›ŸèÆšIu%¡[‘÷ó™âɵ�½´ë³xÖ}6åKÌX†*þ—ög i™£ÅÇß ÅÌç iªöy-=ú4{E[K{uÞç¨K¡žk.726 Œá½æ°>^;†§š÷7�¬c•R¥àEYq7ÞjõÖàǯG�gAB4¯Cy˜'Ïm*‡÷øs6þÓÞwwã¯U ×gö9ù‰ÓÜÌ•W‡Ýì^£y£;Ž ÏGĺ­=ùëw9ç/Æb<¸›Ëà@ÍxðÙ®¶X|ˆÒÎiK°M^È[‚ﺷÑ6áÌ­ÁG–_d4‰àLý_go¦Ó‹¾›0ÑM5íâ“+õé<‡íÂkhþW„ø+�Œk®ÿ±uñ®À\çªf³ë½B§Ï‘UêfeQhI‘i=æ$ëQ(ÿ]¿ˆ&ÎNäÄ÷ºgs,·.^ÖŒxô8uq¶ ¢Ý®Q´IíkÖ�kÙs‚ÐëÜîH€¬3™ꜟ;âÔ§6¹çRÀËDgñ 6_RwîGç©·jJÜ<ê�íyýæÓËd¨§c<>SòñGñïýÕ:êÇë¡ä«<¿+(h#z¥´tFQ9ƒ ú¥!ÔÁqhÙ‹YuÁö;ìi¾~¼ 5óEo“v¨uòX£ež}ë!ÉE þZw�‚¢6§FPt?Y¡GÜÚ_}¥„#ÿsáRi>p -¿{�,-)÷iî‚x?„é�ÉçIÑq±‹èç½<Úk”S>«>žw�¦’¿·ZŒŠÇ·8“mê÷£í5t>À¹¤hwg�­7¼±Ÿ�¶yNy~?ÜÃäÙüôyݯgŠ7aôÖÄwÚ3ÐÝìëüÏÙGÝ6ùó»τۖ&ý×1Þ¿…«5Ò®ÉéÇë‚÷îá{×Ö·Ë�¬aÚÄ n2#˜· ƒá{œÖ‰¹O®zsïÆy㓲—5'°7z|bÕê«/=7 g¦Ó§áû'®vTǰè»ìjî¶ÙÜ #÷´j�Ÿ&/ðtÓ¦-6â7Ýñƒ·óŽÑÔdq5—ÝB¿žÙ14¤™Á!L¯µ\s2Þ¯M> <¯íº³7¥dÕ¤Ikæ|rã÷[!ê�'äjðDÓ¯»é1¯×Ý/¦Ë¿köËþ×—­ÚïI Ówg^î0S1#<µÉ‹ûñ’j´þº$Dubµ©§·)sEÜ—߯Ÿ¦?=Ñ-îy3Ua.HûMÚ~«~tüpl ØrïË/Ë;qTÛÛÚË]TÒ%S�Ê=?ýÐÌŸúo¯ÎHÀ?¹«ov÷s3%öϵˆoIø´~�üŸ~öÂQùóôÛOˆÁx“Šæ�¿N .»ô=ÕúKA¼Ý1'|éúw½â7Ûãðºc; N1zYØwÖÛÿ#ãѿ첚X7½7jv½SŸMÝyľ ¿J_SÑ„˜´Ñ rK‚Bhöƒlj£Hòy�Ÿ(sg´#*gÏÆ¢*„¸¾�ÞâE©ˆ[N9Ù€~¨;¹�¶ùÁþr£õ]W\À°–rŸ˜¯¸}�óöMG|êî þÃóêo?>Öàœ€K/Áç º.ò.ïƒìå@tËh'­W_ì]ë+£Â“¬¬åBH°‹L™¤“˜5‘ïÚõ¹–Sr»ˆ$&j�:wJåóqI‹¼i·Ëã©ÇtºïZ�èãÎ(5«"j¹4ú�Ó¯ßÚ7áñŽ×$­Šê´äˆów'õn9ÙNè3G"›G&SAóñ¸ç!½DŠô¤ÖƒèÁR|�Öýhj‹§¹ŽÌæÐÌJwªél5÷¨¿üÖ®amYý¨ØõŠãUä–­Q+@×h¦p¦“óž„8JqKÆóys±¤ôã÷5:²MÌ<ýh�ôÏ­NÏ\r¥j“õÇÜÛÇš{ q Çï3„#R@Âóø<ß—R¼V,œ.*ëû%ÑÔ‰á”;4õÞü„fóÖ¾Ñò«<‹ž ÊÝ<¢\ãá{T^r(—@TÀ;¹kª_«w/p|\ß%úòû¹ŠC¿LŠs½”ç‹ÿá0}6ÎÕ±Ãã¹(Ì�ã)ð/ž�â+Î!•ëøîÖ Wªu{µ4Ââ´ Œ\»ì¥¾k­ñ,1"iÆ«+ÿú×{øu4¿³À“kÏEá R±gwÝÓ<Ѳ3néÖGkL¾1=%‹pÝ3 ­ý{É( AêeíæDQ#?fægq\ß¶—á­´lgs¾uÒTGõsÍ)·iµ´êH-£ÓÌêd]†ÏÝS–l2…›VØ8xp_.$ ×E9K.Â?`Ÿåñ®µ)÷Dx; d¦LPO‘ìJ0…&[¦Þš“´¶ A‰>Šü-|ÒÙøœƒG„ù—²�ÑBœÄvIÉ…%“& ‰=ìd°å&Ñ*ÑÓ!]o/?À9áàM�„ôëp­ZÛ[$É+K¶½³Ò‘Λ߬a!·m½ ‡?zL;–:ïbèඪñ¸SÃzbþŒX“øyÒ¸u…«îù7Œ”¬w"¿vq ”öÉïéÍÉOxÓý�–ZÕ�Ï#ÿódh�‰Ø~K¾ã¨­h_pÙ&Þ鱞g.×IªªÑ©&¥Ô“꾿ô·ÞŒ¤1ÿ.,KÎr�[Z�» ´ÈŠR]G¾ÜœÒÿ†­{þ¨�ÿ7ת\¼ÎøîÚüþƼ^ß*㬻š�Maò`Æ ®,eM¯Özï­h/©½ö2ÿy·¯ø…´+�c‚×få×uÜ=x#\þv·ÿ€v)¹·?SÍ�Z/AýXìÝ¥È{èê·3i5›]lJÈ8_ù½¿†ÖÃÔ®·¤´l˜×ïSõµò×)&Ðî¤éw ¡ö™�œX«�gõ &²-:xº&¶©©‡Ýì¯|h\YOšûYþA)=G.ãŒ÷y/çÏ-Ÿ�“Ý;ŽàCÆoòyž'庌;ƒYÚ\€ýù¹RRcèù}=rf‰ãmàü°ÿ­£=)ƒ×Å}ãÝC½ò7Yò#Ákã§læÔÈ-\㢦�¸œŒDSÍMëýŒÆÒdtÉë|Åó^ÉØ2_× ®úfGÈŽí³SQÎAeM(6±ô¼Ä^ÿ«F1!LÏýÔ<9Úİ:¶¯�ßQß}£‰ž<>ÕùÇVAÕ`NQiºVÚ¸.»«ßFޠ莸»×îÉ|>¼ú•âǽ1ø’Ÿ8 ’@5}¨>ó´<@>1µu¡×(”ÔŠJ >¨;ˆ�P°�>Ül†v€+pjï¿Íögû ›”¬TY¡Ü샯Òñ¾´ü•â&7 §v!íÎçñÿ~îÔvT¡ç š3ï®Òiˆ |x�× ìgu×ãpèˆ"ú¿šönP¹é,bÉâ¨2Ié]õ¯î–žS½Nm]Ð^¶þçìÌŠÃwP‘µ|Â")Ç¡ÍA¿ÎP³Ué½ÔêLA-$¦>“d;8t�ÐF‰Çþ~ö¡p?õðü¤ÊtÝUnÕ” ±ŸÎÑRkÍi©uÖùp´N¤ê ‚\kJdÓN!óôHÊ܇Ù�¿ê§µ,Ð=¹÷mQ@…!‡#ÑEUBûôßQÍ6 ²t „néGöà RY³J@�AÙkÖuE¯JÏÈ£[~ë�®Pã €š5Jö€ÓŽhqV ê ÑR›G¢R�™Éòi‡¢¡ß´²þ=w÷D#s?ê;9™U`$ýÅtÿ¢{ˆ,}2 ]7m"ÌÙî�Dktø© 9Íè™Gš˜ŽCì*,ÇOŠDÍöõÛõþ1ò)Ëq¶e+Üà8Âá�,žÓú±eÑ:‡ŒœE�$�î?Ÿ)Qü hf'§ƒL_TSI UU†âcí²Ï¤µÝ6銔Ïí`³°V¦ Öí€|WQùû-¡-Wn78Þü©dÄξ4”ýž1—OÕžÆg.Áf¤7è[)ïÞ(Øòû'ù=pJ>Ãò“}�*×ÊÕ.ÇxØÀ# L°ÑcŠ>Îw"#×q’JyƒÂh¹Q“ГƒïÞ ­weºt ­²ß"¿Û8%^ã„iUû¼ù÷^@·Ÿ§ÊþÄM‰Á`²$0ŠnÁF"äèÊU¬(¯ì¾º§ðp^×6QûpuÔc¿ÉùË^éëö7§dò¥ÌÁʺÅìlö)îPõÒÑA™ÓJÎ&¿ ö•©¯Üp‡<ØÇk%X¹&uE‹94ÄS¸Ç=]S^¿ü_\+¬öKÌüwO•žk¸]¾æa ó˜SÈ¥Ï!Ÿ�­ýEåM>øêÉÄuñ3;£F¶ å”ÊK»6»,¶³‘{¬=t{TµÁ^¿å›oÀ/#χTš�¸Ù"]¹z1•uÖ™Úm‘%2‰•m }=T10ØÂ4Wɯý~/[/àð¸ÙÆ[¹ ¬pŸ¹<\Ëáxã;ë]ÎëÄΑjwÅîrÞfš�ónß�­#”ñ˜ñßøV¿^¨‚ÇÏT+8;ÌòÏšÄ;½PЏRýIÉg£®1a±ðQw1O@úØÉ¹Y³ Õ»›q 6 Φ÷yØ\ªMÞ×Þâº|×¶÷²k°ÉŠ�‰ÐÐ%Ì3„¯'u,Êgl#åÆ?¸!7Û³¿%:üÿê�_sÇþ+³ñ23jœ�ˆ%¿Wå #dnlÚáí?ϱ�4 ¸… ް{[r~¹ÚÿlÎÃi0¿¢kp0@Øý:É;F¾­Oêr›{¯îÐД/bÌ�Sžj�ÙÍS2>¨Ûò?Q$‚:\Ë~¥t"ÒWPûÅñK�on£ iU'b†aó[ï(}¯¯rÛ ÄŽnÇNœ÷ýü×ûá$JuþGPI¯Ek=�ÛíÀÃìêìTÐ4èͤ�îºÖÌþí½tr‡xkgh=šÎœUõv‹pýáÔé¤Áy!sH­U»‹[­IòD6 8Ãw&ÑBNP'ë»E�¢áÞJpxèB�8Ú³$ñ&!ð¼ö¦#òì�ÅòuHÇ!Þ7�r÷�Èž÷Œ(2�äת­S½¢Ø“†'€Æ¨4E}"jðVD¤À9cªG¼ãÖ©÷?R®éìúvŽú*H*Té4†5¥¾R3Sc—=[ŽnÝ‹šõyC5Žè¾U;Î$¤8Ù>2ðfJ÷>¹ò8Š6MkÕæ 'öûñ‘îã;aÄ«ÊS=ªÓ•À‰ÊqÖÐʤ²\Œ=È95&vß/+Ž�ÎD­Àl©±Ôéþœ‘¢¯ìý¡Ïíù77]Ì�̳Ri¤uRž5ÿÔ§æDƒäé„Y»B‚èïçÒÏe¶û#‚–ÑmR%èš–¤÷Ä�gkNReÿlÍþHŸªÂQ毯Ü\zpsÉÌæ¯Ò¿Ô�+ãØ ¥<p�-g ¬;š(cû›?Wnûªç»^û/ž¦›ÏkS«>SÄÄ6þÝž ÚÞ{Ó,ÛUý_’€Ý’øªËÆ+ø¿&ã³zXcîsí2 e3)•ä150ÝÿBãc½5h ¶äq5Tê­R€�š³Ppœ¶PÚ~tâ¿}¿|ÍIëVÅI <,vºÌ¢Ÿ@§�:“ºu/Iy–güØ{“'ë~H}ÍfÁƒ.�ZÍ4íØÏçÖŸ¿ML+áá¯Õí2¹éE§Ï·ÌE'Ú‹·)“ãôަéåî!ªì>ª™q=ÅÛ„qrVìžwí]´šÊo^¶+1ÉKQk öeûÓëèïÕîN¸þ |;Á8º,œÀÊ>ò·®»¸A° | Ƈͩ€Ku'Þña�æ¤i g�'µÎÉ…¥kViV)oµÉ)èºÖÅ=»ëLLÖ-lε2"�öNþG èMþe‘Dànm õ”®™J­7õaì`Ùƒ�ª•Vê½üÊ\q±‚áD±‰Ònó&±G5dîX­Ê¨Ÿ÷\�웸ÒÕ¯ºgKÿ&žB�”ikæ7“{o@|EþQóO±¡Ô‰ø¥åQõΓiC‹“ÜÓëúÿDêÀ9ýqóý­ðÖõ×ó§ËŒµç¨9¤Æ7š�ÍNÉ&—ÐY_î.Ü|•ƒÎÏ ¶Ùuô_+²@)VžÆßPòœüå©]æb²ñ–tU›ólÉÙû�cÅ\ïü�ä»ÛªNt9|¸*‹ÿúßWËvæJÉþî{¬Ž² \$àº0ð…éÝ7�ÑÚCŒÊ¸—­1{í!&Ï~íÙ%Þm¸±õhü•Ñp†né2æÎæêÌ×(� IeÕb¸XœN'Ay1K±®€ÄPà¨OggS@ô M2Uj´3ÿÿÿÿjÿÿÿÿiÿÿÿÿ€ÿÿÿÿ„Þ§Û•ï ôáæà;³Mà€Pê"±I×�/OsÞùV±WŠ˜ êÌQ!‹¢½˜Îëïý¦‰Þ7ÓS‹²šâÔìkÀ;÷,Êg)t¾‚z4J|K˜·ËÕSL»4”?g½^I®ö¾Fû‡�µçp•šû$óê¶ÄÕ ™7~B™�,W- �©¥=M§÷ÃdPC>ZŠ¿ŸYU׫û!ç~„:€cÔ£‚l‚Êñ0Iæ²¹ÕÊTCØ99yùÝöqÓÈd"z:”×cÎÂéì¬D+“ÃÜ ç¡H|7R©„B&÷÷|ÑuQhÉ¿Zä2:_Þñ9+PP£òiv_¼úˆ„âÙKýOŒ/¿ò2ž�G›¿Ò-* Â…ÒAU*»LǤF�vÑý©‡½¯¥§úØ¥�%×iPu'òRZ5�Ÿn#EË#ŠcΧ9ÍÎB,�Š\î‡ÔËCÿàΜ\Žù±h=Õú±=FöŠ¹ï«£Ž¿ìùˆIÝBWˆyÕ�Ç»rä Wj±é<·�d6¾|tŒ2Çm�QÝ¡Ý*ÄñP]‡"øk<©9ƒÐ‡Îœ:EÝó¹ËF^HÈ©•#Sªƒ£è˜¼'I>!û¨¨’D·krŽ å‡ü£I~e «‹%ãÚlº¿Ò'¬ÝÂ8ã-åÓô®kéµË3N¦kŽÓ¼qY—}§Ú‹:é^ž‰‚/ê•®Í|ï:U-�~Ð_·¡¦òçÿšÝ“¡Ø§1™ÁÛ‰~÷EòúþÑaåów~÷2 xªeºQqlñïV­sy¶§r=À¸¼c˜³x¯˜5Þvxº"f°x€¶}T¶™$u°Ià¾tÚÇ#˜ÿë}wO§ù�Ôª¢RMJs|�É!øˆ‹!ß1à~;®qJn5ÖDYôt¿^UiµSµ1~ä*OÖ*~’kÆšœ¿^Í~® 'IÆ‹æ8Ò¥<Ž:é- 7¢ßëY§1Wlâ_lx�|Æ×lá±á?§ŠÜ]zjFûUiåI„§±ct)yä úWGKÌâØG Ð;îß6­Ñ8©ØÌ·W˜Y“KtrüÊ$�`ŒuFñ×*”æ®­$WÁBô¼rpq•3s}Ëé)ä}�¯µ°2]>©´'±*Œæ;DY¬êfLËG+ßÏM»WEMVR× ­Ôk.˽Õ4cr‹Ä.Õ'ÒépÀ›îëŒv^kšË^™ïX>‡áÅ9åMoÏ9âîìâNeY[¢yu/¾‡�4m²�.LJ(ÝK]ýžÓ}\6ïRdzÕ�ÿkoqÉûŸ•tk/’Óç p컺ºÐÌè ¨N^gŸ‘¥!2’9ˆ€/ÌpYRÉÊ\çÄ�‚»äN;Y%_Õ{‡9²#ij¥åeÞ•‰ã1uO»ö‡¶fÍ=[ÑJVîóvbN#•¬ïŸßize…ãA|»pR€þNÏÜõËœ/³|W§×œUª;â¢J¢|�Ëì*B%Ñ*I;ÌA�_ŸZ4Z�i'š€ á î+ùí‰í�’£ß‹ hÁQ™;ÔY�X>ŸE=pqÌG�û4 �8L´�‹&gën¤»à†¾z@]S¥—‡Lòÿþ,–óÃßá c|Gé…¬y‘LL¸b²ÏáûÒ—‡OmdR‹Gï½ñOè` qs÷ÕÛ))Ô·ã7̇ñæø ÛÓá t Wy© âÛG©à45€Œ’>Ö…omgÙ]²@ VsÀCø7‰D�nRÀ¼3×áø7äÞ"�Õöås û²j�[¦/Ò…¾û~5z½ß~©ýxƒõ¶½¾fg<Þïš›_0ÿ™ìvÏ­à/ïw’àùÁ´'좯�žO™# ߣ¥]_Œ>�÷Žb‘Ô ÚßúÖˆr:yÑ�W�š±kpÈÃks´2lî*ˆÿR¦~t\¾ÈkÃýûcïEÿéú¶š®0$Å‹�kñ°3Ì^sμ,2ž(¥­²s/&&×ëúu‹~�̇ $(ÀRöÂø®ƒaéãß¿ûâhÉ·wïh‘«<œÎátKí‚´¿-a”ýU†m$“TlPŸ~0élþ^çål;wQÅ`»¢ÖúÝÓ‘ó]©}´…³ÆBQnK“ÑÚb0µÍ½÷®îçSÆ•-ÏWÞEýÓ§žÕÃB /ÐÄ£¯éqºäÒßwþò†òåçaœ¨ª¯íßø[<ÏáÚ‚KÒr ÄÚ ÆUk¼9ý¦ÊmÏ abuö«KØÍa=ž¿mjO˜6y©2G2[3åk29>-?¸VLvMŽªõÖTŸþBý`¾—›¹_ñX�°†:\ ~êYÓ÷DìÝn<˜˜§á ʼn‰Ž·tÔÃ�ÈäÿûË>Õ«Pï� ®¹®Y«èýžÀC,ýì�Ç~ˆ r寯@úoEoú“T“¦£Ö}¾ÏE§*íý›€ì¯‡Çœ½ÈÑRôšò0Z^œ¦@ý×��}X4«P .†À>�ïì�Cû„ÑZù[ɧ�V].´ÁÝ{ê०{c�ä¬9•wŠŽÓÚ?r÷Àµg§s¥�÷[Wר´™VöÏ›þ—ˆÉçç…%$è[ì*® j-Àò·ßþþa×*È^Qö„lªŸ·ÕÿÒÙ¿°.ù^G�A­Eæ}]O¡‡ %®×‡Þ&v–ô¹>•3'UƒÉJÍK1ܬóPü¥ZV|æ¸O{ï‹ý�¢�~*4ö£Í«5 ËAo«éa:Í2ŒßÖ›Ï_/ÎÍqáþöÊ­8írb¨Ë“ þZà5œª�öüZµLÎë4¾¦3³ÔÛ®Ž ý&ÈŸg¡ïJ wè?«�ár3îc1Ÿ˜¶ÏÃØ¢ÇPU¬ó{5!DËú– ¥z‚ÐJÒIH§$µ¹¹= +ͱt�Â+±„·sÁ�·œÕ€AýÞKq¾W8é7Þ;ÈÚ‘æÌ8oø�sZ«A#/?gØØTýÕ}©kÕÕ˜U·ú&‰‘¥³QƹRfå%óQïÝwJzꭑŽÚÞõÁ¡žTo…’”5åq'â—°[ßøºüÉÖÝÿ¸„;±nìû~Í/ òì�IN%Î;ž#qˆ¤¼ ¥öösµø=ö|Åég×'ΦÝ~5]¹yÎ*J@͈ïõœÇ£gï•-XËÞÖ fy8¹Z‰WB�ê9…µQÞl£»n„ w¥†fÌôêC—ìÞƒúh�Ä©¿ÿØó®˜áùd«‹GÑÓ2¹Ó\ð߯&üo£�ü#óIÎßùÓVò‘î«É„ñù«cgï%œ¥ó’‰Ï%ꃯè fŽžh;ÎVjñ¹g<V%x‘¯š¦§¯|äpVÝô wÖ¯:ÌB†o„v*osÌyÔÈæ�y£¢êb%N�-“c²c™o«äß¾ç×ÿ€Ÿ}ïóµÁV£çe�µîÛãŸy(L6>‡›¬¯PˆÃµÌ¯zÓÀ�i³^™Î—åW^››œAbŒ pžØˆ *MáüÆãúáôNpÄ”SN½sÿmÞòÙôªAÈ ÃJ¹;$Oýí÷•})Éw‰º†Ârd?Å¥ ×ÿ­d�Z µ�£žµÎ€SyT«T§Î­8@Ý+|ÛD9M*L4�YüŽúúnIõA>52€bw˜ ÇA ¥¸æþŠFG�ë”é@¥²“hͬu>eÅßßu=åx¨¿¾Öõ3 éÔ=qˆðâxâx]VdBÖxd5ǹG�wâùd<*ÚÑÓ�æV²uñ‘|Ññ5ˆàš ´/QÉbŽZµö'u?:’$2u­"Eæ!È=ÚùžC3õ"qý¡{¡;‡©“^Øw4~­Ãy"JN4[q“Ü3HÑuÇÞŸ‡mŒžfyWfÍÒŠ)dÍöîÍ^b}—kqöW¯^®Š|5|!¿K×ä iQßVªÄ´Fn¢ ðø—…ÒÝê ò‘@–ù9Zto§rˆ¿r6UßÑÂÆÃÍAMâÄ•Ì?qUjÄZí󭼕“ßËþÑ.“¶ÿot½5cäîM÷e�CC^gµ&ëOŸwúS+iÞ Lm¾Ø9¾ÕtyÏ7TÔ—R‹þ©}‘ÿæ »}Žü­Ôþ•(+Õµ^lσ~¹˜bòfÂB“œú¾Ü ǵ°Ö4¤Û¹¶àUw ;…ÅÌô­¥KΓ¸öÚFì=?—åc†¦Í“¾×ë©}8‹ôºö’f>ûSqJb¼àäÿ»Ò®ûž=)Oû[êw}O «­ãeò;žÍîjXñ�DŠrÙ˜Þÿ#úé¯ÇU®sÎïlÕ”ð¾›+÷#\Aõ厞/®T²å®d¾XŒò@£¡ƒIè£ê‡©tët:�Cº‹ùpåÜ›‡Æpà{ꨞ^”[¦g¡o(ƒ ~·•´ïg ªÏÇÝa‹{�eÙ|-/suÇX›Éëá.¥q«ÕιTÿ¿–fa‘'=²ÿk¦´÷œR„³Ò7ؽd4?›©Ze}R®`Oûb"á7Ü]Bž„i*8·bm–ª‰âÕ9vŸUV»O².³[�ÎßÍøzÎÅÜMú0m;¤+ŒÃ 6gÓÜa½Ô¡Ø÷¾8»Žm±°ÉOggS@)ô M3ÙɰÖÿÿÿÿŒÿÿÿÿ�ÿÿÿÿ�ÿÿÿÿŽÞ—ÛÕŸôj�4œáêÀg:�€&î8Ä�²¼ôkàô_£¾•“ú´ûÕ˜ å_³>(8ûîü¿ý»NÝBôÝ$ºëÄÊÁÏ�?,¹óœÃïZ9öwŸ™ß¿9ež�F$݆øwD;M=>vÌu_>ß¡ŽK×·7UÐø¢HŽEµA´ÎZòáç |� @×ÓÛî)§‹—äQ�Erh¥`ÇI½ªÓ½¹9¿‡@X‘¾ê9ªã$…Z ñ�¢ó™_3¨Á¹¿Ò©¬ËB‹ƒfÄôS¤*‘݈j½‚£¨{´85‘O¥ÐðD[ªŠûW•ƒÂõæ�O¹?¢ºˆr1Ç/ÑfêVxôç2q¾³»Ui—E§.œ©™T¡ãè˜O±rD‹¬µŠ¬ô™¨}ùŸæ}áRƒ fZD»³¨G’Á<ÔKÎK˜�¬ÉDô¡—îËŸ6Æþ{zà³3‚yBÂAT’=H·Iú£ÉP¤HɽÖã&•»£NÀQûà̲Kˆräôñï¤Ã€¿ß~ÿ°â˜G)ônwÜ|DpF@Ή$Ç¥Æ@ªÌÈ6qJ‡ÌN(š(¦ EÄñd¼ïmâá¯è¿‚æ¡ ÙE׎²G(ªp CÀž{Çd£·£ ­Üå›'TÞ\ò¯œÿK }eΘ٬a‚5ÌzÚ½–†|ýÜz’çéHƒ­­Ö¼Z Š ÒÒ§ü£v}¾˜¢®Ç÷N�ŸèÜ)îCÉú)þutß#°³þ.c&‹ÜFe4 ¶@,óª™P¡ô=e×ûèpœ ¦ŸZnv¹ùlUNaÔ Ÿ»ï\vVî¼ùùÊàY¹ùy¤"ºÏ·÷Έ¥:ã\~=?–‹!ˆ¬ßwg®Q³.s6Œ,“BîpÁ™Ño1AÚ%o…è:1M–Ž—?ƒRçÀ¯Þè}p'*1haÏ`Ñ=Þ ì~�åÞtó÷ÊGAÚôu°õVz7Ã"›Šø·¹+xM7Y¡ë¢G„2OKª¡è¨•VÜýC~¨õè #Äücõó¸ý›eiÈ¡‰O¼ž¹nÚwìUFêʇ.®`�ߪô|ÖxÅ�ø�ß] Ïp¬»òç>ø•�ÂJý±Ëoߟmró䤿B@43w||©Htù}°ª¥­dâ{˜tè`tGï³µ±�#T/µ†£ðH×OnìUüùë'# ª»ÉíT~÷ ¤Ý p üU:rç0¦¨Ç‹lsYØa;ÿFÚîH0vŠ)8'o3#)ÿä°6W¶|õVlp¢/¿g­÷KVöóêN�¿û–º¨×®q˜ýfuËyýçŬƒ‡]ÛÆ–î_›÷%C cîþ»òüÂ|QyÃ-ZîûÆÎfþ?Ì™/Ù#vø�gë zQ,'ên{ÿÎcàÁ-VK»“1ä~]¸ H;gƇXéšÏù?×N.íöyývýó9üªÄÏf{Y9°Ô‹”€|í•7Wúž‡[Õ_™Þö¡ W³ßéÕhRàê/¯Ë¹�èþ/ÆŸæG)ÿ›7 À‚Ãßµ�Ì>�ú•ú_ó{U‡2S3ªû¼zBó|õÒ�wtXkÿؾ¸‡@•yÉ"Š®Ñï(xÿUÆJ@ßœ¾;U �Å£ø¿¼‚®³^A·Ô½„ú8´4ôU#IG� —¥’ý8Þ™H"Ï…“´#¹%�ªÖöºÒªÄZœ¹j•v˜åH)*™EœFt�ƒáýg÷K‡^íD@ô5MJÍkä5ô™-îIWc¶ÎS¥^ë)Å~ìî'TŽšsK(]M T�©kÍÚŸËô~Mh‘HÕ·«!�šË[Ϩó×ýðTk=DiYs¨9ÃL•ìÉï}$…v‘Î ÔÕü\sqçO¢Ž+Á¡•:©Ò©».Üë¹i‚ƒ ÔÑ,ž.Ûï’Ý•î½öTô|Q®-k {+‘N£­+2î¬{q{>ç B•%Š(Ä!{‚Å1?–yÜ‘?ãðÔ�ˆÌ0I'9¿®..Ï`wþÍny½Uâ7CÚøêž¢¨8‡@ífhÕ Ò�ä0GãO«ÖòENûÖÇO‘î˜ý>n2� ’Yõ¸)ôíe@¶'šW§GÓOª"�oo À�$€í‹òo¿Ÿ¦1ã!?Ô•oÛû‰û¿k©[ksAÛ5yEmWCGw¾}N¥vó3gð}ÑÍæ:ã]kñè2œ|Ų¡Œ‘›fð»ýªšZÚÖ¨ÏWüën¥ø¸åÁdfüo+Žï¿ñ§ÒYÍ>ì”§®NÜÓáÍ ŽuÇi®Q^tìÍé*µ®—ätù/(­­¡cd6ÅÉ^Ÿ·ft4üëuÿºGp¹½±j�åºÓšÿæð‰µ—Hì5Æx>¦!0—tÁ[Wèjð¥çúzÚ÷€@î\ø*’ûЇ¹4z�`iœk†1†*mBÓʬºúùðcXÐÏP›Œß‰ñZãœàû�ŽÎúä¡”þ0ݹÒêìu°êyߊôØ à3­Ýd¨½µDïkã�ü¾ØE]¥¦}ÀãëNyw|óëyxp稟Pz"»§òøaÔ<\®ÄS\å÷ø—ä¹pôÔ{©ì©{ï%Û î‘E좚çpDi�y—¿å�,1…ãn®¾9;]mý­ÛDí�ã¾DÛ^³ÓÙž�4û4öõs r_i=¯ÑÌíúû}j4'ÉÇ×åМåÛ‚÷]÷èX_)$súëù-—÷Vgîõð}�O=ÊÁÌ0åëϹÍdx£±oþnLDR¹¡Ó¹«ÿ Ä|âÎü챜þ7„©¬VÒ}NRT4¯ù…ê¯ü>�Šerc¾§ºœ®�bå ‡Pdz!ûLWo’ö'¹îiáKfT¶„Ÿ÷ï>ø �ÿn‡ÉÖf›åûtôùçrWú: ¸ÉN V#d•çã.:ÄkêËx²”wþç¥Ä“oõÊ.ê‚óýƒqQHKˆ £ÛêžMå5¤Õ¦¦�MõÃÞ’ÕýwZõå´^ý5·o¹ªiK—ªÇV_Ã) (çÿej­.~‡›•_9Õ `†9ÜšûÊNwRE¢¾;Ôƒp??ÉëÕ^´2ü™Ì;ú&ÑÞû¹OkeùÀ(ºý]Gf¶‹…V¶û÷ˆà¡¯…ÓQç•P[�Gטä!°|PºÍBá‚ï”#B´e½ �×ë’5õX Zö9�ÍÚ@ß­ …Huê­‘ª@Kà@ívÎðš½ }V6dŸü›®–q�J!ýz´ƒ‚®T胊“ï(M¸qRÓ˜´ fW¨<ŠúÙ¬sfju´û ‘k""ý¬Ÿ…³ìó‡pâv€ �Òè³ÿä [PËû8ÜÖF„¶ì?¼¢Rë2ƒZk ^­ÉT»¡Æ£Ñ¢\ ZÒ)¢• å(tý©’é°d/5¹”.:Qpš¢¸é}ŽÊT«8AE#HƒC*Ïϸ—ϧï¯zE…„šY8 DQ¬�8õ‹¨ì‰8N@ ¡µFUQ^ÑØ‹ H N2Wé� ´gHÃD:dJŽ?<$·IW·T^³�H© Q×�t¨Rd�+µ˜[òUõ©¿ÚÿÈ£üžþ �&·NWÓÓMæóìþ�1¤@ßy¤Ÿô~ïU=^ 8Îà˜qâ:ýBW#—”VêpºÏÑmcñ"v[.’è2NI´.�‡çhIj¤U‚DlvD¾_§`A“Ù< ¾›ôUiL�ñ�[s®Íãì¤;䚦;zÝzKÆJH©šy§TÐGZ{ZGÏDHÖú—z;v3í7 RweÐ;BÒ5 âñxù¤äïø®ä± >¿ÏÕZ_±¦•R¬�~°Å"dœ–4ý=R}FÛKöþ8_Úh2�¸Ãqq)¸ËåaK÷�"ÚÅÙ¹o#=§f»ôôý;QªkÉ¢¼•�§Ìý÷|�Ÿeñƒoà.G3—×RöÉÕøwû麇“K´ÑiUcïÛÄ[¬Î¸ Ìf`C÷\iCÍ8—‹ý°�y¨÷7Ûûj!»= „OñJ£JJùÞ+2#´-ÞG¹ë9ÿ¦¡ÄÛ˜Àª“»ô‘ê? zFC¥8PÃÇŽ"]µ„î„ëŒð�XxæG¢Ç="àÁ¸œj4ì¶N~Uï1vU»�Î57nBŠÈiî’&á 㨭ž’×ùüãBŸZ…±…C_É?Lªlûåb¢„~Õë•ÖÑþ´Õ}ÞÍ´£rI?y}‘”ór(àDÕ:â%¿t„–qû]¯eL’»‰)@ãK”¿CØŠ�¯7þj÷«m1ÞãÝSM:,LÕä-–¯Åa# ·5mß� ¢ýÔ¤»qU¤ËÙ_‰'zs «ÿ=¿“Nœíp¡C!ž»§Ú?ÞµÖnoþîûà ïäISîX]ì<’gú_—ÐÞ¨G°–ÛŠgÎWJ…Çõ»[O²^¦mÔîµÎÆÏùÞ´ Ö¸ÍM/_üìVOBNmÏ•ÅØ\¥¯§½ú•ìýÐK�žÛ÷ ^×Ò,!iï\°X—DM'ÚÍãÕ¼e8eYñ¿¬Mž¿d®¯Jðòs07sÇöbõ2‡Ö”ÎM‘4r›ú†Ì‚¥€À~‡[øßéÕÀ[n R4pbžÿñRûÄg§3Rbàqk§ÿóý]ëú­=M@a€NþsD=jýŽñhó|¸ C¥i]t®’óRNÅè:»¼ºu*à˜»kF%¢¡þ¾Ê0ïÜ®ˆè%AÄ~ ¼iò©uJšhÅ¡w­²ÎµfƒÊ×P€Z‹<7Ë«V ‚ S…ä:å=CµÒQk�an™c7ÅÓÿÅé×ùP‚Ô§48µ›ãˆtä»kÐÒYå”$„2û k“òsÍÓ§*³bˆˆ �NÖéäÊüw½Ž0ïJ8½ì72?¥Æº]ÆST?kÆ�¹ëz¯õKA+!9œRä'…ãMG‰{¦Œ7Kz){¥ã‘küžµ¨ëÂFgÞUª^s†„Žy:êœðnæN¤xňÃ=šO72òþtÖ¢fj7ÚT-PêÑäÎÎ11«"]–RŠhuŠ –lþò÷Ê“•…—d‹ü8îסJ˜^D$ïgq}^æ¶è@hqTG‰¬QÌЭ’øÉ£ÌæKä sõö÷lÉùÂËáCõ«�Gˆ¢'jSú±ë{×CÆÿiìW7ºÅ‚<…‰Ÿ-‹ú‡d‡¿‘ûãùñÞêaZþÎ9‹=ʳW¿úDÛKú¬Æ7ØHíq°P€ˆÂ±ZWfÜòØ ÁQ¬ù6»ÇïÝ- ­ã!)ã^Þ¬�*áÎ…Ö5y7/½«wæŒééœúÙ }•¹Ï‘u´g¿6`__0Ë=>¦ozãÈÌzæ~r—iý•ò�Ç7Žf:_„íÆçAÔ Ç/àpÕ’�qöðûx¢tæXöëi˃ÒF…3¶z¼Æ¹ÑfB±HÅ¿J‰õ¼$çGüñ†ÿëjG8x.Ü~ÂÔç7º]Lå¾l%8Œkýøzûr|¹TpúE*?®±³¤‹»RÛËy¸{y.ûNÌfù�ß|æzkÓž‰¹¡ï2!š[¸}øî¿º3º�¹Ó ãë¿v»û”w=HLÌÁŸ2Zátчbd¼Íy$Zèùïÿ&Õ#1±L@§¾®Û¿[¿!0úëB$Œv†—õ�WaÅÛÿkr>æY¶mµkŽ×VÔà7r_ð³V{Ò÷Ò�ù¾gáX¢ÔD¿œëûæùgµ}ü}ŸÍ=ÎÿØO™/Úm–5­¯~M‡ò�ñj+±ð¯ì·ŽÏ¦=Œ¢þ[s[òýCÒÒ å/B¼zì¼ q³m_LôÍ[F›¦#‰báŠ� OggS@9ô M4à3 ™ÿÿÿÿ‡ÿÿÿÿ’ÿÿÿÿ–ÿÿÿÿ’ž‡[ÕŸ´Þ `†<ܪþJô®@ÄþíÑ›Wu<‰ƒï•›'¿;�Ãë2 yt9A8@-ËZ¾ÉL".ð(9%>wã<®œ€©é>îR�Ý�nuïPåYxü×0‰ ¦‰N¹‚•eÕ>™þE&KïSÙÎ7©U¥IOòhP•ë#Ý æ¡>+E­€ûñǩټ̈vÁÃÉH¢†÷Š= ¤Uõ£œî8¡N´#ÃÜ‚JÅ™›ïwm:4«(µ]º>®•©Bô; ª}Ð2‡#Bt¿ÑÞ‹íæ!'çÖžÇ9×Ï÷®"N ™©s�äô=$ÐàÒz…f%EûÌ©…à!ëS§û,Ź��Ãp@nÓ{fóЀpHV…b^µ¬5þ`­edM*tÍ" ¸„ê�£×Ÿô^"î(¡ò‘Ï–—™ø¸W,5):n bªµ�‚¦F;ûÔë ³(2ú©×!Fƒ@Pp4`ú 1 -âÔQ`¦›LeŽY“Åý0˜ì™ÎOÝŽû!Û×À�b§iVm¨E€4 =Ý·Á�}ÓQz×(וºã°“�“Y) À¿x\ãFFLµEQ€mp ÀuÙŸxÐ )uéR˜½Ét\ÜEž–œúø:×?Èuëì&ÓE2O?\2>6�gUWŒê šÖÏÛ'»UÛi ¸#ûµ£ L‡´rï‘F�úL|¢¢²­�6éGšŽŠ´¿Î¬{r>e¥Ñ~ó«ÝLm±–ß§Q!¦V7n{^#XjÇñ'ñ1 k�=hɬþU»8R gàŽÜÊÞáC_½0—`» ÷köx÷»ó]ÑÄ&~ÁÈYnwÅ7M¿a3ÔÜ¢x8þ&2‚2æ}e~м^]ϸÚÉüNµûv”?3XìÂøý–ó–$¿òuaW1R÷[„+ÿ‚UÔ™�O�4�WÆQe`Ø€!›ÙUÚD0ä¹ H7N õ9Ëm(l]ò¾;KÒúj+nÓŠÄ�ȇžõ$mâie8 Þ^%æuY\×~eñàáù(]ïtԵѫ£÷_‡ªÇ5¼ùò¯]spìÙ%ðó¦Þ¸))b—á…Õ.+´æ�ÅMÅ»!ïÁU:Ú•*¨UqwµTŽ6ý? ¼ÊÀyNQ�îo|2^¦“ªãjOt³+îı$ñ¿£º¼2¤6(ìØí?:í‚¡i3ìŠrn õ·þîÓY—~]ˆH©ÄßÃÇœ×ó…éºÊóœ?zÍFæËäêpz1òä Ú¹@æKrCÞ÷{Í�[rçùiyüç^œƒô‰‹+"a �Ž6Âÿ„—í´Ç=›?N§ƒ8· 6~GFÁ‚3ù0�øFìâä¤#Dy=Ôwlö=V{JPæ`Ô@0‡w,6OáÊvû{-m‹I+/·!Çëç1ãz$.ô‚&Ÿx­›O¥‹n£kù”Áš˜ºôR½›íãZZ:`xÏv’Ââ÷WP 8«ˆw²¼7¹“ ’¿o¿sül©'­P‚&ó1…ºQ¨ë‚ÿ>‡[Õï4ˆËMöOV,PwðäÐü¼•–;ÂV¿S㟿O¿þ'�2̵ýý¿º_GíDukæ¡{¬<̇TeºªÛ»F=g]Šb>ôašv͘k]�v*Gžµ¶Ä]ÓQNP�õp¢‰€¼¦v;Š;ØŸYqöÔ”Ô²³“P]ª¦tdÌ)ÆßV£ŸŸùï°á|ì×îÐý[JÇëQ‡–T‰9k:Z湋ʨÄÉÓ�úóyWÿ>´�K=ÏEŸÇ“–~äâãçLAßóùÜ6xïã‘>¦ŠÏÏjæ(±Ä•-$s µµ(H(’¹/5õ_ì…Ï�v&¢ÒE M #i§£Nüð× ì¹G•(€dĺy³¹™‚‡ÌZ^H«�Öëw­‹ÜL]Ý„_t¼1Gt!ÏÐìL W~UI7"©rUï­† ÊíwsŸ�Ðïqv2Ìe£ r!ºS÷M˜šéÖ=ߎSS<«ê»þ «Ym¹Sõ;‰J0M��º™ ¢#(º~ã}Çw¤±¶~»– 6@Èr€¯Qjól¤üVñ-æ6ÞQ%q�÷pö=Êv’V ŒÙcõ㸆*ŸYįeLm10åà‡½Ó¾oÀ{ñƒÿŸ0â´ýͨooÑïIÈ~ Ã1ÿ>íѯÝ,a2�Í!›ÿYOÎgµãH¹r,…2¶pÞÍ”o�¶ù% žàRrLŸíĸk] ƒEy¡U•Ü„Qµ6ƒ _ÅÜ�t“L—º †w:´�-¹ò®߸äí/düÏ =.zTo}¾çñ<_ÚÜ�Cƒï׳\ŠÇ1W%s=ïª|ï࢕&ÏSÚ6vÌùhÚ�>g�fºá똠øf¼®XNåGÕGýîI¡Þµ“È¿¡»;ã xïµû›¾Ã篿`óUKm’b¡Ë™Æ.ÿ u îý¡æSþs”Ú9÷n1™€SµÃ’ùþ^‡Óm¶Gü©£§›£¼,œ€UŠ\¿×¢ÞUî^éÍ¿óú¥ð�IÿuE¶¾7MÉYßîþy÷j el—ðî©–—;'ØßN6ââº�XÝcuºUö[÷Ê«EÊ:˜íÎcs =ÀEÕ¨êCr¿Òe�*q¯º›ô»tNГZòù¬ßñïtzxZñÊ×d½¬rðp²ÛbèVžè]zõ;1CIÂK·×)µìZ' Ki�.¤RLÄ/ÿ˜rò’ãU²�^`Ô8㬫'c|šv×Kù*�¿gîn¿ÝªèµG”}q^)6¿ïÕÌ á[c! Þ £¶[¸^«@È(>‡[í¯toD)‡[‚�ôh qN* w�ú’åÊ}‡õþ^cW}F£ 9{Ç*]â¨óôÒ?sWÂç?9jÎ ç¿G8ðNä{7öw0,åÜ,õ�@ýã·p.š0K�!ŠjRÑͲ65þ1„f7‹¸EÌN'õ’¯€!Ÿ•r’àIOtm˜ºlQœÓéwŽp˜“9v…œÖŠ]Î힯÷WöÜÌ×÷Ž�©B6…“™É´ÔŸ ‘:Í17 „œë�HSkŠêôsm©•Ú—T(;­H%B³fûýSkc‰÷Žó¶©QUЉ:_O͵Pæ¹.­:ㆠ 'ä;§ªUªH…×U²VÖzÔ–@e…ʲ‘·ûyT³I ÖÌØɵêW'ºFªVN’Ö$©Ô9ê|#ɇˆDÖµJ:8‘N¤Ò ¤.ßÅá’!9eÔœÀ r-œŒÏ pÖȈÚUe§¨2Ï.™z˜@”mê’‡<ðÞN꼟�'€9µ†:¡‘凿Ésä3‡ ÉëtHujÔH¦¢jp1'Ý …ìè9ÓA+ðT‰ŒÇ†.—É_ä÷8‘àÑÏ¢“ vD†¾»ª[4.C°yÓ�`«ùÓžs‡aW§úñnÿÕéÑŒ2V/uŸÐÓ½5ó“tùÃ8O´ˆšçÓÑ#’1\ÍzÓšÅ,§Eß/*;g÷4›?Ú˜ð×Pc4õK¾\¬»=nýÓ´^›óC�s*íþmfâ¨ó㣡ný*¶ÔÃnd ’‡…Èsçÿ_®ßØ[z,þáŹ)ーNÊî†K=ì“EþÔ¿3|<ŸÞ5¹â ÖÏ~1¿bmÓ¿õ¦//õf]¯o6¶êh‡z7 îî…ó±¸×^…‰›æàúWãJ£L*ýÌ(kw€®0Í”Âx/­'ôõgÜëŽ~ƒó“?湃0^RÃ<“J+ð®vàO[ïzªÎßjïw/õ²šJû­Ñ/` íÈÿµô­ÒZ=q¦øv¦èݳ]¥(ÌhËDm*çàµ.ð°‚Íñ}ç%gÆ.K:V0£*¾0ƒgY”ó µ6œm˜o&«´x_UðîQŒ¾à!?l:kã¦<ÆÂ¤Áîºü7xv <_[ž²~–“)á Ýõ®>¯¬Òµº׆G|XSý¥\î?òŒY;A� sé�¶­:ý æ¦r}ÕÍ‚2ü/« íAmÍ�?¼·6œÐ;×hÓµÑ$9'WÂó¼‡<µæeœöD7 ÇÍÙV¦ VcDÚ}´u«¨röÜí[I=Ÿ\�s‡Qµ3\󇿳@™~ ‰.ê©Cf9òÁÌ=ƒ8·ŽÖXI4¾æÑïÕùôÄô×±åÑïgï0IMjìªoïÆÛI‡æ¼¥HˆÂz ÇvD6¢cÜgVìU£ÒmÒ';u¨þ/«|kZɰŸûëmçdî¤:`é»$æ{æX¤�žû�šÕ‚rŽü$ÅÍMs™h8ö>X²¦íiŸÕïÖŸÎ}½˜t}É#/�ÉÝ|nýp8fp^ÎEÕ¿á]W¡<²U†:SâËiBµ^—;Ôï¬h¬¼á&ë;­ÄÍVÀÐã§¿Þ¸0u<º��“' È_/W¼KÝÕÔ ywkˆó†šGò¿N÷=D[À{}R4†y %dkQàéàY› ÎÜ@ôé†ðYw”?¯ß*Z ‘J-ØEùA×jj@ÿK˜¦¼òØ›JÏzÅÑÒU]¿7jT¢a½>¶Ä�¢úC¦Bjì�v'ÅyH*�ÔH­éd†#Ô—# ÒAò{¦¦dAD« KU€V~¾‘"QM�³’°ß¤Q1ê¤=iêG“ÄS.ÏIg8pÊ3öÎŒ8¢ñ­1-¦JeÚÕAgf!‘#˜y)bïn§¸h§Öœ’8Tò¥=ï”ýz¸ "ç[/Šº¢;©ïV´):ô£CzÒ„#©�D‹ÆL¤vvrH!HG´RÈŸF„êýè ÙöS5R4ŽÚJHWɧ�à‹yÈo~y�ºt¥¡’qº;©Ý}LF'²8ÊqB;bwÛ#ÈωØïXù«=ú¨äø|äI?eQ‡š ‘HÅ fÄÁY¨gôz¶´gåqv3”x2ù‹P ëDFÎ�W²¦»B%ŽÅT‡Ç$2�î?$h9J žI5`á$°½ç^ýµ\tS`Ì+˜jçNøíý8}O1û=eégC©~9³\kíUÖ}Å¢ñkÝ; MÕÕqµÝs�U”1›Š—þêÒvd—NŸ¶s=©Õ>ÐF_¯j6qO-»ž1» êqžÄ™kÄ£¦GV‡$çFìý8X8ŽUvš÷Ûej0Áy\§ÕÖ�ÎGvä�p„&ù{œI»�ê=iáâÞ}Õx×ø¡Kåx‘ û«RÕ?Ö.$:\` {']~0¢hbùQT²�ž5>íÔÅãÁ÷þA×vܯ$´Í­!Ÿ¨ú®%n²÷Ýà㺾‰ì2Uß$E;†›Í$n³z¡ÖÈ—Ùôo‘ÔF¯Jñ_z˜o,;« KâØÍ"mÏå¸ {Óñ©Sܼ»di 5·¾²÷BЦhT¼¹Q0>œm Üñi¤´©&~Zòõß;œRüHOö(©®%�5„Óç]Y{êÙÖ_ûôv‰s£½*�s.òª† ߬’DÍ/þ'íìùWå`æå¿Üãú½l¦ìxógdíó²ž&JÙÎm ²Ô­ƒÓ¡ÁÝï½)|Ê‹ Ö£§²nç ËV¼j0ÍrZÙ#?Q½óñxËA}•1�EÑ“åuǘ8{�7ÎÅ·çí<çæoÍíqÕÖ¿õ%¬qËGô¤õªo›^ûc׋I?{ó~ÆyÀúÈu¥+8„ÁݼéæTý¬ñ¶køÈËêÛûhˆ2¹LXýUïÛ˜œó÷ú—¥f<âî ê"2Kg;òÇ´-ݳï}´–9_ f,åÕLL¶ì8˜ïçxÈ"ªò†w½¢Qáºi ”Ò �ºµÅOggS@Iô M5›ú¢ÿÿÿÿ†ÿÿÿÿ�ÿÿÿÿ�ÿÿÿÿ„þ†Û3iÑÈ$’Vâr“õ+³7pêº\ÕÎßzfK¶AJxº½T~{ç`l{@6€“kj˜£Î?Ä«â AÔßþW›¤$X~ðµëQnýÔv2 £愃Óå¡0ÊñY�¼9k•OyiÍ®¤1©Þï%’¨?kÉ”ìÁ5‹3Ÿ@Ì_e¡„Û�#�"R:º †¸¾Â9N�ê@Q£ ¨*+ÿ:.h@ŸšU‹¢ŠT�uª0é7Ùt͘ݤ‘]'=¨NÖtªüv™“äÞ…Ó½Ö‡JÌLk:æIù§ 5"‘9hê%yM!Muú‘й«ì�\ÞªÌó\\yp$à¼h‡“äœN3…÷ÇÚQ‡8«öË]Ⱥ§¾¤TÈ)%×K?ƒøÌAN^/êÁªÐJåHÌ€’I†äïŸ~û8šˆ�z Z©�N¤œä.K¸Lôüùç&Óf€|nõ8¬´†GqõãùiJìò÷"ÔÚ=9À܉ ŽF�¢“0î5›öCþ]‘{òìNì­Çß¿S3€–g&Ù2Ó�]ž±G¶q=85`ªe:f¤�hÒ‰™Ì@Müi÷Ä®YE„€…¡$€¤ú„6™–|רÎÂS)ñ y¯äIÝ&rït[ü=µ»æhù‹ÉÞŸ&áÀîþↅÇ.·ÇxÀ BfÅ}Ð DìÁôúÞ´+G}Õš5~í«¿ïÃ~£…‘r *L{ úw[�OVpR¶�ùáÛ¬ûxDüÙ¿8~oÂl̬O-Øùo‹¨½�7wªÞa®*c=‘O�í¬Ÿƒ}×=fè»ù€÷é>ã�îv¼î”�êyG K§¿´gW¼®Ã›*׬úß›É<¦ŽòïDÝL|¸‚_™ªÝ-Doœgƒä(>Ú–Áìß©­b”êZ¼?¿ÎÅo�ˆN—õ0Yüm/¥ðò˜zB�’–Þî[ó(ÄÝxW—æ88¹ã¦l¶Ø7}ëÀÆúþŸÖ® ¥ý‹wí³~ßH·ì2·<‘õ„mÎS=®µ¼x½?nóXíê,2yGÑX%6 às²˜‡w^‡'ì~9xJå?xœrå(mÞâ�]K'·‹ÈB¹’Œ,õ®8ݳ֞jguœDtqÖŒJu„¦¾›�?uQ4ÐAÎ'¹WýŽ¥Lê6ŽªŸp‚§xæÕõ§âÊ%R�(”¬Õ¡¨3G%œ~´Å$!}׺ Q¿ywÙ¹&œ|ÏËC5k‡¦ž›©ÇdÒ¡ƒ#è·4Z{Ù9¼�%#8:µßò\!»f†0 1©dtÝ…[õp NžÚyU÷§Zl=¦Ñá???Sk‡DӺК† µFvƱD YŒ§jê<�hQã,„³�¦¶,C¥÷ã¦�bÓŒŸ�R;éêÄ,4hm@²˜™£«B(sJ"Ç :Ž &ätü>ï¿0kÈ3‰3Ã$ ­µ[2t%Ž»jn?·N¦CJvÍúÜÙâùù7¾öÕîßó·ç’¼Ÿ¹ÕÙг6™ÙDÎëþ¼™M»BŠbâ…ãÏh I¦PÉäßïoæï!bçÔöÞý\>™ÞäLO÷¡P Àw¬äaý×<51­�rÃ{�¸eU“È©’nÆÑü–Oddô;™¢vL8šyKv&9ÁðŒÓòƒöE%¸$Ƥè–ÔsÏ› H»[´°ÆÌ�è»â±[�Ê¡#*+é^Fö(Û£¶ îÿÀ!rí¤yÄ:D߀û„­<×µ²¯toW+‡¼å�`ósÉõ±añ ù·‡wê>è[j%²—_?«‹äŠ öŸŠ´úw÷¡B}4>ÙbÎÄçTÑ—ëXãƒü´€õÔçŸ.³‡/€ûÄa ž;}éÄŠUBdîöY¼Ô»YM©”÷þÝõƒn9gP9•«ªH&!Ý&×\hËXusñv]¸ŽÓCöÐb+{¹å¯qo¹~r-]§å?7~Ç ï;ËDpÕÞÀ¿Þ±m–…ù‡ÏÈÈkÞý2s™4DÓéYï�¨;à�š;3…NÜu¦~øqjä5Œ÷·!#qZ­êî¹wñÄõ«öŒ³½×ê E×:ë¡þÃVäy<¿³qA’v÷IØë»Àd>Èbß»‹_œ§oœTèÖ–,ÏLãõç³—7f>‰ª÷m&øàùý…ùhÓB*¯ p6Þã®Ø“lܧ�² õjàÂ’Ï/áO<·Ê­ ½Ð“p0ýþ‹˜¶¢þÚ �Þjò䨃L¼“O³TÖlñØ©ž†›íÏT4" Ж›íŸÌÖÀ=€ì»žfdÒß<{¥p^ŽÞ  ÀÁ1Ü=A zq2¯ÇöB[ø0áP:s_¾€íû^3Y òpO€W'áýÛ¬AT‰í$†ë¡É)Õ uŸg%§¯ì�-fÔZT×qºµ%ŽáKQéCÏ�DsS:täü,å�ÿÕ‹~R?]8ªº&À´ƒ>e"'ɯÏö†ä|Uí=j£G‚†<Eø½×ìµ× :ôszïT"Sõ;S ¼='4©¡h=§ð¡*ÇY¹.‘ŠöoUb\yytοÊõ¾"¤Ëª�ÑÔì9[½yAâèÇES':ReÊ7y ‘uw¸¤~’�R;ÉÈyVMØ©ù˜'ê8 ¤CLtK:¯ˆµ3ÏIRÐ:“ ¡:Ç“ÏC} ·œxÉåC™ü<†ßTŽÈ‚C­!{8Z¿sЮM v!m‚ÃMÈ‚ÓSꨓ¡Å„d1ùÐÕk�«u,õò|<_Ÿí¥£Qe†ÔB³W/q¨ÍÌÏß+›c“ŽŠtí£H€W陦:µ!�Šdd31Õk?šzð·sðû�aγJZéÙ¢ÜUï\(�«€€¡ ¿¥x‡Þ÷=0ýû5f<ý•£ê‰s&:±§ÄWW[A7Œâ�¾\»9sù©¾W ]¶»ð¦^”àóiä8½3<Ö4ãçù:_­A‰H°ÜXùÄ?¼Ú3%ZiÓÚvT*™¥¿Ûú?üÐ*bJšâ‹Do.i…gÁ@:M ÜzÖì‚ü¦ËZ~4¾Ò'Çvß¶®…ý/ù<#˜a§wd^Ÿó>jS«ÅëÛN+i}ŒµáŽ-U¤gÙØ;�€$$5=a•S®ë¢~]Òí ¢lœ·xÉlëºâezjçüÝ#Ã~ú&.ú™×»ÜÓÞ­›:q¶Ü盺Êô³+AÎ�Ïã‹Üžes­†?´yx*㎎•ÊßZù–çW`Ô±=sk_ÛÇ ‡7×�?·¼·7ÊÑðþ væ#3wå®!Òý‚¤Õ”šü=*ò9g²‰qòHiƒv®ú7àúq òØøRàô|êØ*g‹»óD´O©ƒL›bµÚ‡´*�A–±3Ç¿þîZ[ºÉñk…›?•1b!ZÞpŸ¥©ÑÊó›‰ÅIÔR¢‘ä4v»_Re³26ð…kÝ›œL¹úÇÜ`œoôÄ÷ûïð2ÖC&jï͞ŠS~"c·ÞÉ É¬0­öüYÍË\[UßV£Z`Àö”H¢jƒù½gOÎ"WíŽ,}ŒÛü­ Ìª´m}S!k^×4vþ'Ö ÅŸBSµ¯R[ÛÃ)¯ál-�.)>ÁLÝßzbôz/^ ÆÞ<‚–³¶ÉDL‹¨©«9;½Þþ~ŽÖãu}<�Ïoî‰÷½¾…ekµì¸ïÅoM¦ž© ‡;ì�4o'  W‚ïôÙÀ\Çÿy?{ušœšÌb¦°ÃG¾>pä^»–+Àr©dwÑ{ñúøþ¬i‘&å¿·�ù©ÇÁ�2×ËœTÇ»W¦ DU“¢èÓ¦ÿ´© ëx“WÇ‘p Y†tÍX¾Ö½›0"šâ^j«Ôbù í�µ£nyQEÅÌ):©?'td=º³Èä©‘su2q=ÿîúß’¹Ç1Ë¡ÑÕDú¨G/áp¼Üº´hÒ(é9‘5‹i®ŸÎù,à ”ìÃÔGqíÅ¿ù“+'œÂ×Ó¿—\\©­QVi.Ü!ÈgUÕåCMÍpÐuØ p(fïÖTjÏTR­H•v¨áÈÁ¡Jjá%sÎMu¦û®¶Oõ·¯FC^šŽÕì\j‡, `¯'kÖštJBÝe~—×MþFY²ùZ¬Mö×§†JÏË3gcÑBB#{õ©·<Fõô?�;$U�á`b>¾êQbhdfŞϧ|î*ÍGÔ(œèP*ÄÎŒh&ŽQįΡ{5ç8[ÎlÛD½?ï¹ÿŽGFv_ú™nGjî5‰ ¢Ò÷hÝ×Öªð*¾~¸(IHŒódâÆï“mDÉ Ù9së‡>GŸîØJüãªÏO+s§KËΗ..{$ÁópFëU÷˜<_ÅΧ?âͺÙävõyž?º™}zÉ»óðž\ê]ë-âêÑLí½ãTlçær«Å¼]ƒð)&˜žT—[ºßhÙ,ÄpšN±Nþâëü1æRÓCò%è’ù]IîgXhÇ'ÃCh1M^7ï´íøÝ£ãÓKZ{Ê¿ý‰Ó5R¹RguÏÏÝìQGÊttÓÔºµcÌh}ƒéà+6ªÓI-α»ã,S.”\M™(¿*0?ª?ûÜYõ½5»ã NëB»…õ´_6¾ä•>šËÇ9œ ïœkæ»gÉB>M¬à‰Æõ;rûÂ$;6Y|¯™ï®¤ §0r/뙽ÉK´œœ?G©‰¤=Ôç–ËŒ°³úï}"»(Áršqþ\ëÍžyê]ÊQ‹àýr“—ö¤í áWëFB_”é?7º�ôõ=_įù–öúèm¡$ HÄ|¢üTký)båмí¬þ,—…çýâÜôxÛ›äÕTûú)8¡A!æ×‡Þ<ùTÚÔ%–G*×Á(zÌÛAýÞ¾1ºôÑh¶t;èöº]#Å0O²Í1o‹U±Øæa0ªÌÑ—Ÿ’ätµØrLDa�ûú£#º¸}žî•è¦ài”¤òiê©så5&/Oß c#údð o˜8öpSQç¼q¥ï|ÌýIŒž›�QG]mˆuPY¡£oÙß¼ñÄ£~é”qF•7kßçnûøó4‘]Ak›6EËMGÍðs•/[m'GÞÑ1;·ø©ß’g“µ¸‰¯\uSrYý%��!Î~SÅ̆ᢱ”ó?†ÛOþõ0-¸ÈÖ9 OggS@Yô M6k ÿÿÿÿŠÿÿÿÿƒÿÿÿÿ�ÿÿÿÿ‚¾†›ÕŸì­°Ð–›Õמּ àI¸ÌâýSñÔ[]ÛL;Btâ¥ýÝ<ûM#~ÜLp\õ+¹çw ÊI®êÉšú k/â¼xÌP�µáá¾<õ^¿M‘ºÊ P¥:MÞŸg„¡JAWÁõö¹VvAÕ­DÕÿÏq¤ÖÁ\Ò¡cPqR²œœn*ñzDâ€D¹eÎ3$SqYU æ”ÌéÃmÔA§P¨í0�u�´“;DõR–{RžˆÖ÷áuµONâTíÚ;Zsxÿ÷#2_¯Oý]~¾*dO( `$1ˆ� õ¤übw$Rîu»ûª]kÜˬ²3WîÐG�¡Ò™y99Õߨÿ>ä…¸÷¹ò2�Ç™"òèûѵkî@WŠ{�>‡~½´6 ]“êâÅN×ÐZ;êGUšÖšW»Îᤜ5µÒUèº>æÉ¢—qi>¦0Š–Ú8}iÐE£§ÒTØ‹æÃ:¨“;ödζüà­øwó8ƳcÒéÄ“AïýåºÂùJwz�ØT TMì\,Ï×{ν쪕aŸ§m1IÿÛƒ·y)bjQ»5K7>j—‰4¨u—Œ‰¨¾"©+,ƒäë_ÛyÅÞßf¾§žC"ö“¤Æ o±›ý—µ›©0�%)_'›;$±+†z/²P½ <ŬêÆê�±ÿwKXÎLB»Ë\–ûôÜê~CÅ)ë¹7ù}ëM—bþ2¼«µèÒTc(ª>æt—ÛP¡¿�}ss‘<Ð3Ñuð>–c7ÞúI@øõzn£;gŸQ™ºÚ¢µûƧÂ�í9?¡ñÆÞ©W^7yåhVs�ÞPKaÇím©&�Gø˲+ž›ùw¡OÚ9ïK�Ñ!yÛ–§�ùìî¼xS2SÔÊ T&›ºº5hWYâÑîyÔΙÀðwòÚ"ÀÞÆA� `§­êE›1³gÅ‚�m…”ß Hž†[‚¯fi“UÃUõ;TƒpØÂ5ío³}Ý�ûÐøÄF26a®G9ïYÑ `¢©:^§®G±÷òú×U¼%þ¿ª£d™¯ÂA¢¯àhbH´Ûeæ@§ß%@µ¦�² UD‘:õP׬Jê’ì•pê]³÷%?®L¡5'ÚÜ3 •9݃Kþ¨SôZõþ"™z¡r2T¸iÖ2Vyd®ÎNÍÙ‰ªéîÈ™L­¢’YåŨfÍ+2çF о_^Õiê®ýþìÊßÝ!}Sç1Õ÷�B8¬hv‘�×5¦(�ã¨8€ um¡©*9qÌ|IùÐzË�ù ·úQ�Û±>I:eHP²°Êý{æ°köC{͈ÎÅÑLLw’Õ!õˆžBãÌ{F+DhˆdoÇù9òó Åtµõû\­ZTº¥B¤rˆ4•Ñýéö\Ôõƒ¾�ùÙËþUÎ-è{+ýTáw&¸êE ²RAõ �y9æA—ìÌù4ëcë©?„psïbrëx&¯ŸûfD?Ø`?Ôų›üˆG} ¬¹·Q÷�¥xä‘�=†g¸ É)lÉ2a"]ë-¿‡ ·4ª8½]å ¾®{Å�¸BŸÎï;ŠDC”c%ß�ÀæÓq†Uw�«Uè�в�¹x=ôy:ù¸ˆKߎƒO™wR H¼4–àr]Tѱ¿ÀàÛ{¤w5šñ‘a9%/o—qN�Ùç9Ã8a;x(ÖÓöœÆq:ÌYCo7ýШհ÷}³y»ÄÆÝY‹U>Æ™`Þ3¡ÞÏã°ÚçÜJnþ®= é}?*¥÷9Ÿ‚VVkí4¿ÄAz÷(ç]» écœÕð„~ãNWùo!~&OSÄŽ$÷´±EÞM泯‡òé*®Çs VËôLU´ÀK»Ù¹õ0¶$åÎéãÇü†ßxŒ?î·~ß<×Ê âT+…Kˆ}[ÝrÝÚ†}áKè>¤Ínݵ™\Ã6ò°ùôNÚ7zA@iæŸMñúŸž¡ªf.½ñ™�s³ƒ®ÓŸm ªœ4'¿àPNë'oc[Ïe}=¼‚È«?;á,¦ÜÞ FAQ¢û°9±¥?Ù;±¼ú3nažéú§W‘Üø1ÜMÕæ•È‹l‘W+aÜ+Îb¼É%%K:g¤“çµ!}W)G:aëÖl‡‘öAK L&,í�¨^nx ^{çÒ’Ol÷ÈcÂ�Aã‡e¹€åOÇ7µï¼r�Ñ„~—ðð¬»XZ6ßWºÂÈ(‹{ÞaSvÂþ(ýÁÓ7¦+5'ñ–¨ñ«4¨Q"ÁÃÛ}zv[°7/µ%ä„â„~ÿ‘„U4'z¿.r„dõ¬XÉqi6ÄG¿Úܸ»~p�í8†Ö #r¿~ìÍ%ª<�³?„Œúu’}§mñ 5ÆÛ~JJ¢]W«vûzÞEŒ®»¢»¾‚§o½rÉwË¢§õ”¸f:$O2;É*¾†[¯¬J&kXÃÍÁOf/d<èvü—/˯ø~ŠYT�"CTô2¾d]_7˜ûËÙí?áAêiüþþ·ãMg5² 0 i©Ï˜Šn¥}³×£ÜÊ=AvîU�¢�þñ2pr| œ£ ¤‚ÌŠVÉ_T»½œï)Õy“ž©`¨tC>“†…#¢á¢y¶&M-Žü¼´»¥Vq>W´�8cÎéNtüØëw§à¨„wTujJz ¼ Ô>H©"PEÉ!ö¤¦T¥jš‡Väpxgìd¶´"™¡/8Âp:ÓÙSOs^ƒvÝóÑ{¦†ö¯ó\Îß+‡LÚµÕ½±†v�{Mêç-I��>æ*= äQ#ÅÑ¡æ3N'0Ïš P‹ŒÚzh6_­sje¡:»zÂâPu•€ø.œš�µ•¬ó B’êÌÓiE5nªÁA@®"ôWi¿o÷ò™/ ™‡Ïëäª?·§\‚$�C±ÖŽb·?ù;gçøÎ½•ŽêÔ!¥Ñ�ÎCÒ2¶_ªÈŸ†½ÍÆG‘�MÝ¡(&ˆ@Ðh‡äu(È PT’¬Ù ìŒü 'ë­îùMÍM^¦·¤bCÇõßûJ ƒÉ›u-ÿT± =ŽFÇ•åFìøÛöbùª!DÅV¡Ï)QîO˜ý�CÊctÆ›{0¶Gâ6‡?;5ym]Ÿº±÷Yog¢»¤0®ñc!å¨ñk ¥¦+“qXKÈÒU‚‚Ý�Jïð²ôy*rzofþ³ Ö|ºvÇjN�wpTPraeå4�¬}Ú¬suy•�±åìÕ4Œ§žË>èðÈVã�MºKÓTÖzyÒNzã{{·Du™9þkÌÒßí W½èsŸÎŠkRalýÓ³ÉßõŽ=cÂĤÅÿä�=_Šã{~BÞkß8víwm5q¶šŸcã»’+‚îcòü·–‘ݵÛÿਿ˘—YÊm·,‘,CEøÿHŸl¨¿7Rbü뤾«…œJs‰÷MÚцŸ1¦"Ó)‹ªÃv‰µ0lvRꮥî!°÷ðe“*ÌŸµ*J“ûA—l»àô5Ì|ä—m�†Ç.ŸØœëŽéúò„C‡) ½z°ú&õéáÖ=ó�àbZ[áìCq1#�¿áÉOÈ1Žš»s£´ §!÷þ…ï)ZmUOEªfŒÚô·u°Ks_6ÉE�Çÿ³Ä«ÞN¾¿;ÏêlÆ“�’q댊uÈLåœÒáx?•àe¶«„oïQÝl§#Ê‘µü3›¸¨Ì?Éš ²ð[QŽuáf³¹ãÌh8«•­¿ªjÝÿ<íûíï[çmœÊåT¦=üñ4âÒ`ÊH< Gégi1¯K˜™»¨\¾²‹ðŠÍîÞà=ã@ü�8ñg±x{|_âþí àZºèíÏ¿ ™bŸ"8�Æ©YáÀ@õ»z7õðèôL—÷{é^üo=¿]�±‡Ÿu½Ñ×®Zt}(Y¶¶º7ãÒï^sYwÄ—ÕÚ¿OxäjÉ ÿ¬Å”ìn ÎO§¦o·Y4fÅž†[Ô¯TKd&©¡,·ä¾ÒE"3Éšà ¬Üç?yë Í´Öx1k­'„¿>Ê+f•úS…š•}­Šìˬ.÷« Ïk!ÎoESÔ¤~­_„ïÝ×Ö™¦êS ×\`}S¼@M:ß¹Ì2KÏðÅ|ÐÂt¾gÎWÄACçÅu¨¯Ÿ¥öÏf É×D¥7UOµ�–]ÈÈŠ.ù¢ù×OçŸá�²JD ZcnÂãi=j ³óûŒY¨Ä« ôCO¯`!kõªV²e]SD¬sÆ¿£&úzô…6šBh»Ô€„ú¯µç �ä8¯½êS�Ð>²(Ÿç³ßÁ…wŒ/SL•Șg•:òˆÝE2èêtkg¡�y´Ê\{u�æï<Å×=›n}  stˆ¼Ö©"‘ sP0N¥|8Õé)!<š$f:8 '�4¡+”ÂìHS«ìzs}>®ëÀ1¯]ç6f[€ÂÐ}ÏÔS“ͧ2+søÐ6^Ÿúé.wfÉ6iq”!âw>ÃQT�Ș…Sé½�D€€ú³;:½×M¿Î6×Hr Æè„"½$[õðê,‡ùzˆéz?0=q˜ºÞ®­CwM™ÈT š ñÑh#Ž! c¼ø:LØÖ(Y¿ô׊¬ˆÍ ïjožçÒÏe\|:†%ŠSÖ ²0�Ûý0«¢KaUé'¼y)¬oMÑô¬¨@ºògŽŠ-‡ÛN,…ÂÎbW…º÷t+ƱÌkr²º•¹VµðòÒJ�ûy¾cäó wÊ’Ç©…å%µFQÙ”s‘óð(õ{|=�l.Fö¦QbkHRRŸÇ"çúI}‡^#±¯‹'–Tÿ²´Œ]ÖÈ×"wç/ƒméîóqô£ç{vwg¨y畎��ÎeÕåŽdµúÜ%Ç�×&äý yÝRƒŒ:ÙxÂ(1‹Ø�7e›vþ«<â—'Sxü륂6øv¯;g÷GÙEmzU6 &bÅ÷apˆípžÒü±ò5ÕÜÌõ·Ö'O‡™3ÙÔRúã{Ês¾˜N‚í%/&¦¯FêZ$.$‚ÿP^Oâ´w`ú¾T yÇ�Rn‘Ûƒ¯�‰ª…Å›GaRÛÃϦè�i«¯cAÌÛVDîà±ÂXy+óñÆÄÿ¥°fe^×þ°4wuWnµ„[ùÿ'ºuyaíŒb܉¢´ŠïœÏÇ<8è/2Êr´ó>\òXgXx`/[Tx©³­ÆwäÂ`gñûÓž†Áê]­.ˆ><ÏõNB[Y?œ�_LòG9Ors?ù*OJÿcsÙœ¾–�¼g›å}¶î®Ãí­;Çb„VûÂà{ QÇIW¸¾6¥üþW||}Ò~Å®Uø~'_Q/�­£³Æh¦Í¾ïZâèGÿÜZpýzuÝ"¶”Ï À¾5#¸Î/N=b��Ë*{—ÏÅ(—¬Þ’:[˜�þúˆýÙ՗ʧ.ß}ñ²®÷árù§²¡$%‹¤CσlK)o“³½¼jµ/ mNŠïÊd“Üp,yÔ OggS@iô M7a÷3­ÿÿÿÿˆÿÿÿÿ~ÿÿÿÿ�ÿÿÿÿ�~–›•ŸD%h…�+a¸þ¤Ÿm®À:ßûï¨rœ'©Cëq6k�'ò¾ÉM—<ÀTqøQ5�Y$—ˆž?�l÷'ïðÚY‚®óþ¨ÀƒçÆù‹"'Ò{ñ*Rnñ…B¶Û�è#j=º÷Šèýªï_5§˜ÉHmÙÝ®Ùï~Tp >�À©´Rë†x­d;á2‰Æt~IÔZéŽZ÷dº ÷Žä�êô¹Ü“£ öuWœîÙg3ZÒíŸFòû4•îÎeˆ¦ÖJ4kRkLU:«G‹Ft�®g�Z|±hô�¦ó]wêÛ9ÂM�r×@xPÜ\¹BË^[&ÝqöÓD/²®¬Oú~“Ký»»Ïaw«SÔnªÓSî'Þ©‘S²Ÿä׉}ç¯ûï9G +•º_~¾=ÌFÆ7?غ·ÇkG€SƒÌ‡ÔtFv¢ÖøT9´VÚ¹DÖy :²£F:ÔÑ‘g©™ÅW‰XDW~+r—"éçã�FíÐîb2IG2ȧ÷³v8uïª9A�èÑdJ  ºr ¢™ÛÎIJäOæ¸Íóø÷F̥ϋúªÉÙÛwz>tn_åU¹£×®ˆm5¢;o¹Žþq,U|$”@fmOÉĸW—>�¬¢ß1‚¨ü?Àx3‹6Y%oèþ"ÿârºûà ©i½b/²åçƒ_bnÕ´þäF7iï^É>Y1n—�ÿbîåëisôxV3Î~~V|ÞÞƒñ¶œÖ#ÁjÝÙûpxàê¡sâ ÆfU~w¿d¤2‘„–]‡Dí¬Jå„9ó{%ªÒÛr¶¾­qì»® ÿŽ_‹?á´'ÕyØäñxn?xý}Åž4ߨý*„æþ‹wîd>í3jL;ÙT5ßðé“$ê‰*ïÒ¬\ŒeÇ ¼[ß�fÑõžößggûÝI§rs‡àkUcxëïÀçòÊÅpÐѳþw.ü[5AYeõ{N� ‘>öXw›rþ—ÓD<"¦ÞÔ'øo²†ÿ:¤V óéË‘ÇÃÁ¯¶—ëäNh!ûJ-²K1à_ûÔÆ£RÇ/k²êÔ*¢›²n8NÛ)³$sq(Ÿ°²:†7BõýáÝô¿ �iÖ]ϧ›®ÜPñvWÖ³ |>Oÿù7]êz[»‘b›W©NÀS»ý*$¸k²s�™›�.p~E¬GÌÒ˜íÄI+©Ï« i!Ë{šƒz MòZSå…#ÚŒ°ù¨I¹�§¶Fò4z>ÈÖÏÃôã<ù)ÆpÑ»ž}½P3w@ ëŽKÇÖêç¾% ý#ê<’.Š�½bÏ"%_qÄ’øìÍ“Q˜˜Omƒ¥žöê¶ :�ä×e\œ ŽŒýÖ±iq$hsÔø¼ÍÈøåh•jRÊA­„&›2>†[‚Ï„Pc¸1üÉjÀ«ÄŸ¯ÿñ§^~úAozésÉU!ß·®8�ú±G´{²’4\?^÷Ä ®Õ&uâžR%·ž)ðHà–ÿ{„ì)A6q¼YIçËÅE¦F�™V 4�ÿ$3ù¯:wÖe�pèzïï€ h…ʤ練JÔ^uò�š‡:H“G´i +z‘µè�M²¸":EÆ'š H¶µjeÑÇÃyö˜¾bYöXHü†×‡¥þMˆDšŽÖ5à‹8ê™kP+$+1¥ÎN<„ìhN^ôB}”G,CeÊtRâ½Â‰9dJQ�pÎ~¨¦"5&•â8Wןæ7ï?û¯ŽCëþ¬N$Uw"Uºy%$öJ R'2ãÀˆÌ�¿ï e%]duf*³ {B×ﺋ£(ÙRÃé:“)QU å; ÙUT”¢öœªµêzȇïg6Û–}[–TªÈœ•Zž ”JU§H8@•Å„6zöê@£ÚÙyåNÝÿ>ŒeM¡‡y<û×súÐM&pJu–ƦÙÒÇCætš@8²ïìZ+H…þ’jMï¡jn„  Àq ãØŽ­Ã…¶]¶å/éž~©z9 º²Ï\ÕÓ¢¦âfI»ë²Ïü¼tlÓÖ:†}ã¾�6¾£’¶¶„X¦O;éáô“yŠß�í ¼ºF.îÇM×é‰~ö¬¼÷yV“I‘³Tñü¼{'ÈI­¦9¯½ -ª7�³a‡Ô_'9‚ø:ªD“O‹šùˆ{�ÑùÍÓ0…˃ô¦w§b,_äl?–?��gk�ÞX�:r§¥.mF^H�‘2¬{ºËz;êÔû q¿Vî³ °Ì¦ù¿ÎÊ.á3fvº§œ¢„]èo܆5¢‹—·×N{ïâ�l¶Ö›˜ÂÍ¡öWÎ|wnËfå9« %Æéáp1þä|zà ‹'”‰H>©˜Ææ¥Áû)�…aÔª¸Ø,•ƒ…îï·GQ½zarïÈ讑çsÙù�ö}ž¯‰H·�úãj¾«£vܧ‹ÙiÓJÖ%zlª_÷\´™…’yäÃ+4³à— m‹3A¸ß•ÒJµ�R…·c�­˜[9 ×ó2�³j=ŸÄ ­'îâa֤㣑äJýŒ�î��4ùU$×þñ·¶ý.bÆy}–XìnäGeõßýXÉL¯8˜$›±&½‚øÂP–QŒ¢7º¥Íþú›¾ú½z¤UR…ÔͰTŸàX|�¿gÚÊU{øqéÍ¢¦•C¿©_á™î¹ÎdµÖç_âdìȈ?Ðöî·’èÝ”åDÿpÁqŠ»Ù-«úr??‚ã3É¹í»¯trQ3rê�ÙÍÈqn%}ÿ°¥ôösdº«·ª €‹Ïäצ”´× 4ça¡ÐÚž"�å$©m½z™Ûá^Dß„€ùþB¯õ‹Ø¶.¿Ì†æÑ—/$… Þ–Û‰Ÿrö œáû;­ðPݧüëÒû¨ßpa¸ÜýÍá®[²>~È'çƒ�ZpLðÙ¾`b/ÇÓ?Ƀ¸œÂ‰h‰wJ‘*¸¿ÏO±vT­Éh½22ηÂùÎpªW¶ö Q»Îí)õ¾1¥ÊúâÊc –£Šö\©çîè±?{îP“ª’.N è 0%…†öz‹©êOÙ38±£5évX´f.YãF_ÍÊþš3‘9w4‚ÔŸECtJ�i41{©]Dg#ñYOÜÌ¥F ²f”T¯¼Ž×îÀÃIR eªõ˜]:Ve©GÝ×ö^äûžŽÔyÎèY¨«ÔV"ûzwWfA¡…ÎC'µÖ¦Ð{­ìÎç”! SB�˜Eµî´d†ÓÇ¿ZI�Jí)&‰æl9j‹JSÔŸ�žgW sJ©²®{�jã(_#©•ÕqŠÈYd¡¤k¾Pvƒ&5sU¨TÇ ¥Â�5Š9#í(:QwdYþ¾¯¿ËÆøÃŒåŸÌïçNÞu!ò¼¯yìË6Âb±}èÁq€"¼>¥‡œ[ŠÙyü™�OžNF×™H¨À94´¶ÈÞ8NF†F·`^¢P à 5¯d×bªÞ)‰¡Þ¼ÞÉî#ûJô ªTØ÷Öß¼ØP|¿Œûë©÷&û©ý*µ¶çîuÊ[¿ÝÂxÐ~ôìõ~™ ½(íèÍ]¯ã°;¾û4+Åö ´ ¹s³%Ê5ÍÝ–„J9þ6¶9év=ÆNOEÍ ëF£·³Y~�OIÎmå_¼bpÞÈ? Ó~÷‡šÌ¥ßz�o$„77R„ºŒñd |Þ_Öõª¼lk·fÁ tt'^˺Oãʼnñ§Å.çöŽõÙy¿gu/Ø;ã¾!ÜØNæxÅßw{�rɵç'hh`.Êš\#Føð° Þûž�+ï˜j<™ÉAsŽ?¡+ö…0  ðà rwíÏù!½ƒ®Î�k,¦Ä¬qesž=ñ‘OPÓ‘jß0‰AJ5}7bL¼X+D{öêè èäèÔ ‡$âÝ®'Á·±w;Ô>œœýþµÔãktÒYÉ¥ã=ûkTz+90+çžÜ¼ìó~hä�˜úä.å½bbnñoO ô‚ñÄêÕ& 1ZÎaL©/9x»wC^{½{UôB~î1öH¯}޲‰Ö·¶7¢BáÁÂs…OsžtÉ‘r[Rgd4åÉÏ7°¸§+�£œ£?Ôˈ§¹ìó@wû—›ùæ´;)-VS›ëR�™¯-<,Îk–›Ó�gŸcªÑììgI9ä·4ÉãÓ{mþ6Ì5Ü66·Â$p* ›A ×�êÿgÍæz×/é; HªfcÜqßÒÕV;çG—ÿoÞáMg²åÔ0ðYrôΟÿ~ײn¯1±·ùüzäe…ßBµáu 2‘?Eki‡øÎÒ\Ê«YOYëǧöˆZ%û‡‘þn¨ù0Z-fþX£ð‘æ²ýškÂ(¶zLö�tÏÓ1SÁ»�ÛõÜ/|WÃÍ3ˆû>½¸¿æÚÌ+o°M¾†;”Ïô^@a†±ÜbÆg!p<^�>ñ¥ì‚:•̳<žp¼oµûÎB×oáÒÀ”äÿ=DZ€h�ÑJì:¯yÔåù9ADµjÄ'mÈ»(ùø{/‹Né¸GˆÆ YãaÒ9ç[28ÿÖ�²¯IÖ¬©´§8©L;P‰?$@™©{ÿÒšDËQç”�Þ9éºçÂÁ3ö|:pÑÖ/GÚ•7òŸe³šPÇßäkôb0‰”øó)Å‘¡zå—Þ+…Ac ¸Í²ÚÇrŽjØäÓ„} iY*öŠ–s³]á’ì�9~ñ~{Jhgòò¨�£s>XåoVÌmÿ{-Ma�(ø5Ó5‚Xa çƒgØ[·çª)³ï’Ý´Ri¿5©Œß ¯áNØ5AÈ&¯"/VvWÜZ|Q˜CxðܯÇúÑ*¤r#¤ÔÔhünèWÒòyÿÃHPTÊ2Kám¢<ÎéýŽÔsWx“ñµ× ´¦«>Ž£µ-8.dTm¿e¹«=îjHcî•"ë£ÍîÉ€»mvïêÙ¬îµÐ޸̩n¨ß‘�§`6¹gE¹¹"ØÜîò“o‡±ÛØì�íÓY™7;:1]yþô(˜ÔéÈ´¥hK´6»É�:©XýîžPowŽrÒÞÕð)œ&ɼÎóúûÕûoÿ¡¾Ž¹ÃìÏá4g6+<1¨ÍxÁ‚_~Ÿ¥ZT® OggS@yô M8ò¼½¸ÿÿÿÿ�ÿÿÿÿ|ÿÿÿÿ‡ÿÿÿÿ™~•Õwð  7ZßéO�ˆî¸‹žSó9Ìâ �ëó~Di�ñrš=+µ¿ò¬híØ†X+ä1;ÕIˆ¿¯Ià)æ,��¦˜ƒZµ(ˤA�ýç†[©UÐd™SÃ;˜Vg�˜þï9¹ªY³B’=íÄQMq`Öï^•Lmù¢·¹u(.©ªºæßËîÎÔʰ­Òˆƒ )Ð)÷à§Î9$uï§v“•HÉNrW²:Σ !7Öo¤ 9¿ú‘tÏ.h¾î¡yЭ×Òí-êÔÚˆÜw’| $Ê5ºÎ5jˆ*í"4³æüÅ*eí) ú%š‡†d.“3|~ÃM§Š8ôœ¡HètÉóùË›øuå÷N…8é¤J•"kõ¡ñ™�Ŭ!­SNµÊÑ5ºgÔÉz©HÐY÷QüÇ~®æ-?ö©ÑÝ�kÔú¸R£}¤ÛÇ/óñ æq²:^øøèçÊ3úwU�ª@e &a¶Ÿý„¿Œ­•ü‰1"Wœ¿r¤–S³`Ž®h­(y]¿Qu?}ÇqßéÈz&P@˜j¤̤N|vs|0Z«¼~°/EtÏ÷÷zæàE;cØŽæý¡Ã½Ÿ>:8Np‡á³�¤ñž�¼G¥­mªOL-Ö'uèåªGùØÈâZmÝ0¼Ó¯ñ�M‘œìwFWM0ðŽË§>ÛN¿œzÙïS¡7#×°ƒ‰üßðö~�~Tã|‰~9UjìE'yͬÙÔä•ÐÍøo¢1ö¬Ÿò–1wŽìÞQýX!Ç‚ír6û÷üqêaË×~ºáȘ ßhÌ«?4�㇠ú_¦|üËiçF£úko�×h×}û‚CµÚwv¹öös•ˆ¡Uñ´Â6Vnà T¾õñâ§•r¨·ß¾Ëúqï7†Ùù§¹žÊÒ�îO[UW±â2òûÜFU»VQj}–º§ªXw ̶Ø㯠L¦¥þH‰i™Ó) nM®Ò×¶qa]›µ¢�¹éz·� Ã`."½y&ºœà‰\òw”‡ÅaZ¼ä×Ñ-Ô…Óh¹ºÍ`­$ JŠk~Bè%—��'MërW‘]y¹®Ï$óŽtÞ_e¦lçת·>"êÄÍ-‡€ä)>¯oo´]¨Žw Ì´'È ò˜È¥cL–átÞ½8Â-5ßNæ¦þ„#Aw�ßUýլʵ`p»?¹¦/¾¦gV'(ìöНi×xé8W¯LTíAõ»–êGrç³k] 2F0~ºVÿl9+_D¿)�à7™«ß÷-´²&=±âM#à&åÆe3;§+‰iÕ{UÝLYk:bQûzœ§ªHVú MÑó»§K³T�(B›Æ&4â¯Ëõ7Ô�nï˜Á‡<ùŽÓþÜqL¯‹ÍÑsšòZO¶ZŽZô`½Ðÿ×Ͷhù`nx?éÓþ<` ñ�>Eïx!û)ðô1}ô(0jJ«�íé]ÕX±Æú8ªVÙyózÝz†`’áÜ6~´¯¿ç«‹™þÉmYli—\UË©5ÇšMå?Û1q¹-›2®vñZ±‘aK.ž†»ðï”"…ÃÍÖgZ/P&à ¬~ã¸}þ$: ¬Á£ž;t{¼óÏøÈt�•½:T™à;öêLÑ#Ð[_Ò™pôV, W¦î:¿K÷}m¨óQÀûãYêÕGë+5~g:”io©U*©ñ^†�Œd�=oFú~�J�ùÈä @Æùv§Ú£s=>~êo¼„ÆŸÏ#«.©óMã1¥F:ܳ¶òäIÌ5�³kv7*“75šñ ¢þš�AÊÜB4LµfM´ÖTmòôY'²×ásk§Æý¯äg�¡OÖÎ%¢ñ.:S²"JïL¯@jÈ»³dÝ5iúÑYûRoeÌû{ý×ñ|]Sœ®T¤�€ú�“DdJ­;‰4Ae8wAù{+[Au§BÔ¨!û�+õ3ô)Í�ԖȈJ§fsÕ©•Éû†H²YŒð­uÒ§–àÈ8²f‹ôñC2MþŽÊÈ‘ŠSu¦b’ ã¨±L1Éq—9Ê!³EÍËto‰ yá:¢_:‹ç6�ÚªH�LŒ+ãúÔÌç6Ùó8Ž7öè”Üä 4!¤üÉÇÉ/õo”™ôðËñÐôå%÷ìÑÇ–™ÛŽ MÔ¨ò7’8N€º Úl7âµ$JU-—é,¹ùÅh!cà~ëõ/ã œº9Ç�/]Ár‚™l>‡8±Ÿæ¹dŒCúÆ`‡jް>™¸‰ö›Öþ‹‰v +‰q7¨kÓ§s›{ê!ï%Oý¶¦;£Ñ’cÙ º{÷çÂ2]í\¶ÕÍPµÿs­ü¼�~ø 1Uï·ß?N%;¹A[`<ŽÈqWÿ¥:hÓMìí�IÙŠøŸzI� &ï•8GÏ·Ùäljü¿WÛY¬îµ�úûº¢LcÄ4×6h_š÷汒ƽ—DÎÔ–zü×øcݪØf�W¨¤òíŠkªAfvôÞù¸êâ}É?hÜj[øJƒ$ÅJVªÒG}|†÷0–ÜÂàO ›¸‹ÊA¿×kÊžqwþz Ÿ÷ uA§žõ_!ÊàØ¥“0‚•®ÇÏánS�·ÓUØ_W«Œ³1)ˆÎÃË´ópÐ>^0+"CU;ux"§Ý »=ïÝt]2¯¡¹SÚêÒ�­ç“©Œñèòžö¾q©²å|è)o�¼‚Fþž, Ïôw¸ëzèVg…ý�R‚·àÊYgôÍ·(…iüïmK½÷¶¬ºB.x¼û3ù³µðϬt®çñ>¯^Ax uò¡–ÊUb)Ý@W¼÷7D]ß6_~7¤yb2ú4h‡<5ŠŸB©»½OÚY—™CÚºè_ÜjJøìˆ{T—ÿÆå¦þû]Tðä°ßYJÖ±¿ÿí§ø”­V�=õä\üèßÕ.Iææ vK \TÜ]ü¾Îú#Êú«0Ưã›Õ/Üú©LˆgݳžO!^ÐÎ =Œ¿Vüö¥}÷z«K¤ZrøîBá—´ÿè×™2¾þœ–÷{ ´˜*’‰²8—ùF(îíåÓc'VÊ•]³ïÈ~†Ûù¯ô–@®«ßi=¬á0yŸ½¯—·ŠtŠüR|9¡ÍéªöˆžïVëàñg¥É 8%úݬ!]«Ù?/Þy�Ùa/x²Î™û¯«!ªYCuNàx¾"á´æÁu­4pü¨p ÿYéÝ!ƒY•iW)"Vƒ!Šþkr) 4y?‡ÝËj;|Ît@”­�8KA@òµ‚¦8콆H¥âˆ�µÞÈ'šèqŸ�Œ¡Þ³³£�J~%I!§Ð;}U¤Róæ£+ûþRdíJ’²¤–LÒ¢RUZ¾×ïF�j:y=R'³èþÊ+Ó“§’Š7‘Y—™J_Sj]¯nG(óÉtZÅ‘ž«ˆ¸už� $©J|ÌD6‘µkÀ%5c¦RtƒÀº?ª8µÂŽìÙ¢¢Á�É©�À‹ZElqйÅÍÏçG‘uÊvÐLB²bvÍSªÔÙú%sq§ë îçþï7çâ½M¾|¹O—Ó‘™NDPèãú‰J“»ì<õ•Ú‘­šˆ�½•J "sa€\’ÆÒ£728 ‚§P �>º LŠ—¹ëÑ�ôùƒi°Rè4¡Ž~C½‡7†òóFÆL�M³ÞfÓ|ö¥c•‰+9öߨԿ Ãý]­´|Ì!Câi#+Í}ÞÑúFÜðÞqíÕ#4=!îï¥Þï%ÒJ`þr¹É;…§ÏÔ’R^z5bW’Oó î(Qû =\õYÎNŸÚ-ZÌ}k•øîâÙÒÅã½7†`gÌ妀œ§Ý‚ü4(ÌéA®7e]¤¹*1¯½�aß—»(‡Ð`Ü3üßÑ‹ïùÉU�Ûf�ç« cÂe“ßf&F_xçîífzÿмÊB­ï r;­ ®ž9`•8JéŒýJþ LN`¥„'}iî6|.+æ”TÏ6ÿŸÊ……W2J›Oàåw×@>ŸHmU¥ Óîê?=<ùûÓ°­Ã+>Ý sy­~†¹Ã½é¹öݳx T‡ è­ÕoÕµ2Û§’û©{›ÊàØËìz#«¹×BÕ§˜oÝZvß‚l{¾û©½=‚S7›ô j—Áñ­ççÞ"¡7¡•OkNS½H]‰ã‡ø.‚ÛA–ÏyH‘V‰%P—Ûó˜ÄÛ(¶_i7lhðê!=Y¹›À(Äú§o[åâœx.©û¸Ðª76Odã÷³nv¹õ«/Ybùlm ß–1õA!qxOŸÖu¢#VäÍý'õ‡wŸ×ÝLVÝM�«TÕ6ZT…ºŠ }zÀ/%Ú¸Ée+ÁË8¾æwg®V6=>Í_Æ×}nó¹žUn_¬âÃ�"VúñWTg(×#•’PŸM<^&Ç?*Á@_ôGÊV9¡–þ%Ï&i7!µg—„Œ÷h: g¤ÏI‡Ïzú�~ä[Úãz‚×ÃËg/Ï{6�8“Vê±?ëò ý,O[ýÿ2êÙ‰‡SîÎçh�ÕœLS… €ú‰’éõi”�ꪮŸõží4éä—S¬šÿH½ýXÇà¿Ã þ¯Œ3ª'·´ äxÎ8üƒrj{¹‰ ò{ÍchÂ_½ÿ°ìþË}½áõ êëš ¹|X¼¿V._SÅ/%–7r­E•.OggS@‰ô M9úãp´ÿÿÿÿ�ÿÿÿÿ†ÿÿÿÿ—ÿÿÿÿ”þ•›­ÏT$(–[¬¯Ì^ b×;Ž»uüÏkÓ:í=OÎ5›^O8wGžéG–@ ÈßÃ>A;àã¤óæ;ò ¿(èÖ?£¦»Ó2ï¸Jï(—êïEW€ˆqÝ) 3òKošyÕD¥E—”X'i©û™ÚHÔÔ‡Ã+‡¨nÔo‘�'EÁ”µÏÎ"9ì�â5Ýïô¿Ùz¾çÌÐ](ЍTb¡ëôªÐï8Zj|‡7oîÍø,ÙºüT_©õ R2kméZß•(‰ƒ£å'4³ŒÊS¦lu»WO$P¤?õ$Jú€Ô#"‚3yPS¤NSñ¢ÔZ¦©¾êª-q“†º§&yióS!„·#54…¬ w‡ààõ¥yä!¬µ%»”šd²jž-Ÿë4Õ**õ:jöZëê¸4 ääæZýü›=õ¾]‹û÷±;n 2UïM?ND¶2GÔT æÔªÔˆ•¥ÖœCÄí:øxœ\æßïcæî‡|ÌÍ�µ.ý;ýû”~Œ4MRI'ç HÑ�‚™N�êh¥ Ù£‚À”íÄ©3tD„@þ}Îs›Îƒê¸æáðÉ Ž^ }ªÓ#È>2ǃ&!Ÿ“�Ý×ÐBãSÒˆnA�'ÒŽ“pbØ8´_v§ð8ÍÒoœú.n*)Ï•Kmm�|ÖКÕ.46lSôÃèãã�Sö—WåÌM%0.¼aÎá'÷n ý¶ûª‰R‘=ŸDLkŒ&‚aW‡ØõÄÇ÷5˜lø>»— Ji]ʵ~5ê}lV�ÈÔ…>õ ¥Õ»“‰¯KZÁ´o«™“‘Ô]SÀ¤ÏÒ[‹}\ϱ"%˨¡êÖ­j`uвgÞ­z‹÷äÿ› ãFê[öÞ˜Ur˺œóà 8Êöu-*o=¯lØpÍA2Ï<}0TbâÝ6:“5 ×¼ð¶�Ø�aWúã�~‚BoûAç{¨…’2[þÊü³|_¸ü2�óÅ·á©üt>`æúΔ@öÃ)åÿEÍÙ�ÅG_,]Lä mw¹<ççuÉ©]äu©:–67u³öeQ»3¼Þ{jØ=“dE/ �®Áý_Ö'Š^ƒ‡Mõæ×þ •i]MåùÈø]ÏmËŠn}7^B¦5W"óÒ1ì£Ù¸TFGòÞ<=ÿÒ;S^=Æ «´*un_°]Ïì‰ôß=�bfŽ?Z.{¿«Az%V,2oÕ­›œýú®.ɽs–<å¸å`{“âÃ�ûaé^ íG²vþ1bCÍ\-:ü�F7&Üt½ö ž¿ —é{彤Ÿ›4¦€+x½ãœòI•l1yyã“k<…ÿÛ33~–É'Ô¾ù�èŸc}œ¦èîOvÇ4ob™wa9) ܘ£w5×9ºO*ÉöÅ_,ŒÏz¶.hü‰_7Ž1Ÿ~†zìÝÍÆÛö#eäIùMÓXo‘y[«vø÷_�—õ$ñá-.:7†ÃÖïûö@n¶|d+œÖX¶º¾DQ~žA¹}w�åkù¤-òiæŒê~]<Ñ?•1lñª®ïk1õÃÛ}Õ‘žÀ_Uð® �@^†;ù�D²ˆÖ a¹S}…H`0 ¸ðxÊSûý›E+§³x¹ÞmÝxŽzf<3�`_jÔÞ+*n;Ñ8pydŽüîdvÇR—»^>�£¦tpõ�÷Y@<Š òÃ8{Qœ@˜¯© �É5Aš¯éubˆ‰BO™#ÖÔžw£Š“IoM @XÒçxUÉHéç[5q¯âqøC2¢ܨ’!œP£†xôë+z�(2nE$BÐD]aG÷ç�Bœ®Wä\�³ˆ 5I¾q¥¡‘EÃÉ”–@ÕA#®oAˆÎ™³Ö*¥Ê•fN^´ôÉë>»Ï¢cV®£&úZø$ŽÐeè‰ü’N]j“I†Û:EU4œlR“ùƒ(+™hÙÝ.$u—½+™-µ¿Ø!3k&µ'Êj�̤r´ �Èš¤ö«Kfæ$¿¯ýà!×Ò'^ÁàqHÑæLK}ˆ>h~å7yèB¦Éé"*étÕ ¶ôL'|ÑTG*E�c'€:e%‘t^D2PÀ™¢Æ"²§¾Ð"ªæ ¿Oðz)*ZÜÏ(òžìqþOEë¯N­ u.¤ÊIAÿ¬’àùé÷n—LßåWʇï€aHxSŽÕ®}ê\:¦½ÌM0wƒ£ìÐQ¶»‹®ñ±þ…Änga—Na¨­çëQ›Ô*Ⱥç¼KÂ8käGíy]åèÏàÞ·I}Y{HÐcf1k°c~Ô©ÓØAE,z%‘¶Âw¡Ï3¨MF�â>È^¯ñâ�¹¼è�¡^_1êˆÖkû%湱ػ”«ÆmÓ�o¼í|“éÕuðà:þÎ)^ã3ßHkÌñ­[ìh£{jz¸l¢]½'[åÅÊæjöþ�ˆÕ?ò¥&†`õé�®ÃáŒw—ðŠ¶»~Õ]<}ÿ”p|^úanÕÔs×ÉYzú?aÒ‚²¶óQ*·£pæóîµOVf�˜Žµ·YDJécú ïáçBÑå±û¼Ýuÿ¨ éàl話w‚,zÚ£~}´É*Ú–ïez³‚`Sk¹ÝKUæ%m�æáîœë†¹ÈØUKî÷à³ug“¿Ó.ƒdÊè�¿™ò0*§ü°i{oãx=ö{ö’mr—É@áƒöË˧UóƒXQ<Šã§x²·�ºN‡~Zçyy¹q\nrû¡™ÂE=­uÎ7de{1 ç�¹†¥Úº©?��¢¤ wøŸKͦ+âá1qKÏþ×ÅÉÁ[¾\´Eíí¾…ƒ�gO”_L™õÙ½uœþSʵàüÔh¸V¹Qõ ÐÝ[g¯·Ï…IƲak¬oómøíAÖmEEÝ|Ü´9#çìÆ TÝ+ˆ?ÉðýJƒ4>†[ù�Ì•dLf(ÃüGÚJ°À¨oÚÿt—»[�…ÛJá ùŽÃtíÏå×T…ÐüGpìPÐCÈ?ö®]õ—_iõw3¢#jëMè©ðTÞKÐ;ŽN9�Å  ï—ÀùNg.X—��˜Ïñ£‚,}MB«ûkOJg_ Eî)É"NÝká@:Ë“…8t­9"Ç¥u¨ÓS‰�z©Ô*ï@Hm­õ/÷œBšÚ—2u6»@§ÄU'ûã©BÈ9ÓNSk¥¯üjœ$Ñ]Ͼ† ˆ®Ž4S‹\Ù™—¶çÕüˆ¥õêªsõjJk�89!Ì“zŸn ú¨"™„jx¡µÆ1w|Jwökí˜kïš�ÓGƪü�$�FGéÕ‰YU#‹š¯+GªŠ2!N;= ´C ÔÈzfi´êC›†)U?á¦{?I«ÕsÒ�t‡À\ˆ¶(=w2î±à·äQ=Énê—;>?õ”c®?r(fô(êM éü<Ê1+,ñ*íü¢5¨5Ñ"£PQ™”¯LIâ¤#YäìD£Dä‘4q$QêŽ�µhêñaA"öЧÇgŒro¿Jðœ�‰kr;Nº¾h@}]p @À�`²¬Ž v?æýÕ‡>ä½Ö|WwE'¹Ž¸ ¯ê ,º~oË0vÐ,†šñ¤ý¡ –Ò$öS&ßÒ§)|ž”_aA10â_*ôÀ3«@s¥‹Aý¸´[h ·Ž")é.nÎ~ùD€Ù+ïb ¡ßkœ8£„æƒvÁ¥øoIÖ}z/¿íZU ô1ÙµGhÜZø ¿G¨Ú ôÌÑëGg‚#‡©ñ¦w}XfPâ3ó=sïí óù~ÑѸ¦/ ÃaÏ.çœÒü_(o7]è1¿ãòT/#óe»<þa=5ûÇÏ*×_Ë7mÏ—¼WÂ\Z¾SC0¿šíÍ*³šN�ëî΄Ci[ ~Zä ô~¬/¬÷ \-YöŽ5u¬ š-”ph×ß·yä½{±1Ì.Î}»L•TœšÍÕ­”ßã³[Õ"§\}N³ûþ_ûD¸>b¼ö(Qûª·eéíŽØªMÚh”Mzáå©R=ðš-[à©|‚‰©ÛJuax°çkyÌ`_éåDI}Oºõ›_ݟú7q]™„Žº,kâûVÁvØÖ•ÛÐMýåpïéçT>§Úßvù×Ó³­~ÇàqF„–/ùHÿ oT�ï—Móý*†?¨˜ƒbŸg»^×á_Ý­É÷Ÿ'þ�é­™Ç}éû…ûI .ýrNåhJSAG�¾6Ö¥+B�"ÛÌU£j~Ñ ¹þrœò;IÜ´u·û»~m~¿°x|ñEƒ÷ÏÇüú"ÝA½ÐÜßçÃ]Wî²�â;-4&›´ú®iOsgåi®+Íž¦$¿AÏêFÀ�Dxî~•<M¸ŒWôóêŒÍ½M¢Þä5 WÎË|Z:•Ç»JÌZ@3…‰ÆTÿEô"?ßõ‹ÆS~ëÄ:þ?mdoŠŒ¸$N’Ó <Ì_Þ �üFÁHa?rÿè×7cÕDáñþZêšN_×ÊÒªy`zë}ö ‡à£ÞÞSW€o¼>�7:ñÏGÓ#ÑXxÑzïžÐwL<ºk¥ ^âÂÌQ¡Æ¯»°ðü…ëQ…ºs€'Ôo% ¢¼:3 ÖÈO¤Cýp!¢z¾¦¥4†‰UTÚiý€¨5€½P´«R+U™2:ˆ£rÔ>Ò}7h±=úóo{Ü?óø³x9Ê4éÉ4å¬GjÑNôpµRuªnu^�ÈwŠl‹ïž•›U:Ð~ÒÞ…;rUW®n‰²ÙAèþ ~Úwä¥w±©ñ·ûŒÀJ$ª’_ªd/†�Úסë×òx^±†§œ¶n{mÑÃæŠgT,tç¶”ÝÆ?¼[z%YÂ$Åš †Û{…¥èÍÍVŸ\Ö Ç§íZYî©0ïE —ï…­MЙ†“§´:ï�3IjÏ£�/u¯VVÙ^óßu…<Ì¿6ÜþcS1ï®Ñˆ\v\¿�„Sb‡×öº%¢'nýãçšåÚpÚ†Ùúæ›k}KZ„êÑØþçŸ_ ª‡­vä�.¹4„1·Ï’ð-ýöœùý~Fɦ¬¾c†3dæÅáÉãÄ�•–ãâlõï{“£ºƒ½ÄöP0ã£ÜF¦uH?Lžé‘õŒÓ�·‡ûQ¿Í8Ê+>ì÷¬H©™Èòr¿T¸ŽfÉîw&_|òDSêŸK“ …¼B‡½¯yÞì}ްíD)o¦q?ù:ÆŒi0Ö!ºyÍ IãÅü4c—öyæ~¤íܳ±øo¯zëR•»·?'[Q»´þGø7Ëö˜¸·½õXC̶7«êéY‘G®í’JÆðµÍQ|ú›yÍÔßm‘êßC(ÉpÒf¸>°9i&ͨÿkû4­®ÿT­¥JReÐêbâŽÂÝ/¥~ ®T‡?¶[¾ª†:ÔÎ,Í{ï›sk�ŸîÜ¥ìBZt†/MÎBîìÞóØø.®ÖÏŸÒ–9¡ïh€W¾®·jÚ=Ïl6#ºmcugÂkö4u„”F¨Œ©-ÕíÖ¶õ»ðýÜ75 ÞþlPFU³¬êR8ØÀPOggS@™ô M:cü“×ÿÿÿÿ�ÿÿÿÿ—ÿÿÿÿ…ÿÿÿÿ™Þ…[¬wª'“d¨Ê5û#5 M™$ÁµøXÇç~Ö )Ô‚Y�™”ÿòËw îØïîÈ l|©{88phò›){t;)ŸïIÖÈZëš}}‰ï®4Ô˜bÈêè�Ðýå<‡�‘Õ«Ôú-#˜yôàzZ…þ3˜*«tU��,æª�|ljBE?#çTTä†YÁi˜fi¯fMô=Ih­O} 0uôä¨LµãŸ¦˜2ª4){W�YêË�VLBœü�Øó¼bØ÷Ôì)¤’³V- 4;?óp‚š3U3Åq²ÖÔ¢@ó¡ÓÙqÊyc-'¦‰ÄàœŸ¡]d¡1šš •Ú“ÔiŠoBÿšY³•#Z³V’&;Ué:¼½¯ôêÔKªì°¦ä„H³§R‰!ŸÞçZ©8Ô#ôîÑ%5ò„‚ß[I¢6]Y˜�Y¢;†j¨"È5˜+³ƒÛt}…CkKF¯8è#ýw²` ÙyiFRç¬Ý‰ÌöR#»°Eg=¿ó·åá!#s×›qŸ“ã¸�~¦jãd9\‰ò1‡ä÷þŠ›Oþè5yÚ§z?cS5ÙýÚØØ‹âïy|¤|‘Ùu$™=;çøü¼¶Q÷WÜøÏÙ ¿_~ŧYp!qNÀî�Ú°¢m2GºÈ7õ‰$„"^¢^u]»À0x4#éÙRË•U©£�±NÙ¸éŠS>,‰ï;3.Ÿî×â¿kw¤ŒŽt/m‡¼uª±ÂfA$ÿAø¸qÓ`•�©î¤3£&‹©á¥4ÄUDlãVØ7hÁngql’W¬‰G¸|±h‚“Ê1Ú[8®5ö*›·É7+¹‹ñ$§Õº1„R¨“§é*Ÿ�ï2øÒeñ8“ì6¬À®*4þõ¸6ˆçôRž,nºÇ‘ ®hâÛV ¹ê À½jfMÈû螣þRN¨.¸8菱Ó`4«–ëñâì^#…ã µ´ó6¹Ée³¹¯.öÒ…pbšbKâ§’_zp lšñrÙÊÍs†¿?û¹Ï˜~E¢šC\ÿÄ—�E[‹?Ý8·yó'ÆÍªÔÿÖ “3êWHF�útF{Û£>Ân�ï”ÑÙu�R7rmnú#JdØ'q§–r¼ÃkËð–Ò›y‚q›}✿†_ÈdÙAnÁ;a7“` ÇGÆöþü�ÌÉ´�¶pIõ~:-<ÿrµ¡{›so«rá_ss×¹S"Çãn´p.ù³T Á:k/ý™o9ºeé={kµ]g§?ÇÓã6i—²Ž2o—Kæ©›ÁׂYnöÔæ�ñbY:À¾a«?À¦´ÊÛð¬w{oïwæ6ÿú9ع§ZÏ^šz]:‚ÎÁVŽÎcݶz_¯¸ <#|ß�³ßwøÇ¾@ v„‘NýTy½éQ×pXŽ;µ4YÜÜÕ)î(ý|dN÷b•á¾ áãu^Â^x m°qƒ*CÁÞ)u­‚= ²"ï0¤I£mªOÒkeÝqÓ…ÿÃlXðÚçß\8Ù!Â>ˆ�ÁX{Á ß×ܸ¹"º6~‡] ”\°“¸ÝÜȾ…›ìÏÌ•fØÊ­Ê3}5ƒ$xI€ø6ÿâÏëLz¡È<Ù)òÿÊ­Ó)_Ú¿º·ÖÇ]s �ë“u«F'OÄa�=WêÊ<´WÇ·½ �”¨�J­p„*ìÌt\‘×ë^;¢Ê†Uˆpþ¨ÂÒªB¨CNs�¤wæwŠA¼@çµéJd…¬LœÇü�Óˆ\˺�Ü� Xó[jrdP\I:3óL<Ö¤ÆÜ’<Τ {:ºˆ8žÞ÷¤�˜¤¨uèúdYk“5öH1Ë4ÐècïÑJ�í¡�zÕèõ*%;£Òõ;¯-E|ªÙ±ÇÙÙ…ò”žcÒÚ"ýÅ.E—×ÎDõ$¤N{kG­]ç–µ£�!⨳{´ U;�ÜS¾ëk±‹xN=3¤+޶Nèõýª™Ý{'7¶S‹ªP#rw¢ƒÊ“3M‘ƒtªÖý*H ¨z ¬zŽ»™·+7ž§rT"çÚUêÚêìïÿ,úãSµ’B@8­¡$U¾³ëU‹¤µ¤vuÒ�€d�cÏö Ž¢tvÍÑÙ~]¿ÄÂ;´@Ý%•£ˆ‚Ñ@Ž4:#U´’Ÿ=Cè1„О/é³}ï£N�€ÚÇh”^ƒŸƒ‘èÁgæyèA}]m)�W>‚&p³>k$øB† †,-*Ÿsöw’F�ùPåÙÎŵÿG-é±¹OäÝ›«BŽ*ü«àÝg‹†uå ³¼F¤2g÷»Î#öŠ•·rc›(EëÒ™8å-sç:†)ùœHsÇ’` Ä ´ä¢Ì‹àÓ¼�‡3Â4G^ù\Yû»ÞÍšxx¢ÔSÊ›219¹M>:Pƒ|[N2;ýð'³ã¡Jœ$ßêœUƒï÷Ù<ãÚßÁL9^Ò5¯3ÑU×óJ‡b|¾ôÑT�*…i¬ßÊôƒËÙ¸QzÞK : Ö—;¯+gi覸³+ɾýüZ ç’z`|óÎå:Ó;fþ»›&çO;aðóvò~Ó7y·6ܹ°ØÁe0¬¯ gzd?ƒ�Ð×D)Ù›ƒ7»ÄKÇxX—�WŸ?® ¥ì²&HF·ßǺ±Àÿx2»ðœM=Ðù‰Ÿ½˜24ûÑÓè›S¬qÆ•„pOÍ0a)/©G½»ÀÍiÏN‘a7xúièK,}¼lÆv£†`èöùògÜ"~œ1Yv£gÔ©�ѯ‚�ÞÆûŽNý–ñœòÏë3…¬£Î±|Hk-§?%kû®ùÙ)/úƒ# 0Dü¡´™\§NÁÛá~2qq»P¨ì„Ó¹½ò÷nã)��\4·\)+yi%>bDSŸÆ‚R¡(ë�Ž Ž»ÊF§˜®Ö±r¥â06­yÂõï§l—aÿ®‚/OÈ9–�-¹(¥¼Sv±¾yÝhïC0}`Ó�«¾|zØrù½~U |it6gžtÖLi/›"ó-î¥â…„‚~…›ùwY3€+ÜaßãU¨ ŠÁµpšn?ëåS›© “ܹ@¯&/Ú$LPèóºÜcþ{ÿ,fm¥ ¡È5êS™•ªJÀ;�æVT�vˆ ñQ‰"RQœü÷kZ5a©eFôßš�*Ìû=*�'„¨DH°®yèDC޲9À)‚Ì!JãU¯¾ü¿o¾óqè»�¿ÿ¾Bçƒyí<�wgö=´¯Ó1¢¿J ³ÊÌÔÓURÄ:Ï^‘$JýŽ,Úq¼:²§Ô«™�8twB™‚@¾W>«'ÂÉuË©q-ñ¼îƒóQ-ꤪ„LÔP­ç£ÿo‚Ãýcý�üE¥3!N¥µÂ^ÑzL«ô%s~s-“ÌsŽZGϬ•UÒ­UgŽ&!гyÀ,r~¿„{÷õ¸æ}Ÿ…¢@H2æþ•š™—úš�Z³ö®Ç™µRäô*;³hê×Jmê•íèá$ÊNDŠVqP'çŠ89·“UÉ«’5ZjÕ©[ŠVj­E’E…iO©U9‡ Î>Õ)Õ�ÌœéN^“ßç5•ˆ*€Ô “"B±)•Ã}Œ½óú‹ø9Ï“m¦?¹x/2éë—™5¦�":(ÕÀ>ØHÂàÐKÑ' ç>éä Z\)ﺔ¿•*nÄøCëyîŸÅ¬NSsr§½ ‚üäs7r¥òst!,wßlÊN”ðWpƒÝþéÕ‰ª=5­kׄs»³­%ï<¬Àì Z»ã^»Ìb!¨6<Éú¼/Š×Šâl‡Ãí�1Ñ[H�(ýØ*l¥z"†Ÿ*·»w�ó9á—‰¦'Í’DqÐu½QªoØ¥Bú/uú&å�Ö3É×”Á§I€?œYßk»m}ûv&ª˜²­;¾›ÈÄÓ8ô2Ç �½NAô�sBÛM×ãVÐà—­ãÃñÓ±Þ„‚ìü î'UDw=XQ)íIEÏý²ÖÓÛ½òmÐÛ/$ζG·®Ï¿¢æ>v‹í8I¿Êl{¿ÊN³sÑl±à8r’«Ñ°½ùîå`5T1æ• Éóò›9±»xzúïNöVŽù� æ0Ç|È©¿FÜ‘ ë æ”¸×f‹¼É éצ:W­—õÔw²9Ø¿¨>‡U²m«¾ÓÁp¡NBkÓÙ�Òœh_ŠêþËPÞ܉¬–~܇ŸÑ“›¤ç}÷~¬ý–”tሒs˜\KÒØ!�xóåÒþ].„83:ÎÚ­_E=’t]ƒNÃ`ý§°7qîÑïÇ�Ù/¤íu&frɯ¼ ¼‘[G íÞpÙ<¼B°*ËÖ3ì¿CÂÞêXJn‚Ò?M~4¤m2#‘(Æ�øžŸ5 º3½ê|d[ÌÛåíõ¼5RöN,¨²ÇèOggS@©ô M;UÈ÷¼ÿÿÿÿ{ÿÿÿÿoÿÿÿÿƒÿÿÿÿŽž…;”gð&œ©Ê-ö+­'2×A‚›Ý>k]硆³6®‚úÄ+ü.ÙGYD‚Χv ·ûø÷Ì^á!€@öù®½G÷ìÞðY‰Ú¬ 8LU9:ˆT²†TxŠ?¡èZ(õVãõEµÐb¹ß~Î!1·#)úwkGA̯… 9Ë D�¼=ÕhU�»?Wåä�‡ÆgQœº.u¯ŠTò˜ªSç"¡_½*5b?ë¡óûsf¨²³GÌq:G‹5§ÉAe5³[�žG†?‡J6HYBç>‘«ÿŠ“™?‘9æß#ÒiÉ9ñ*™Tö3äY[!‚¬nº^€«oÚCkÁ~æ7Gõ¦3¦£ï—Rij±0Ôµ­“{;<ÿÞ×þyÍ|TâÊu}ÊNÌOÊ©züs]{·”ú‘ίWªvsð]ºÎºu�ìTžeOðù•2À�ïÆh¦[TÞñÛG–ò^eíV÷ÃX3ßÚptž£”sœ$¾—µ”“އ«ŽõýÒ‚Cü!>¶àS–bÐ’SS³Zs´Í»„<¦·ciY°Ir 1[gã¥ÃÝWfÅ=²9IÌËG^”xO~ÓÓ_E°4î¹±7¥í#èa×ÅwE3¥ÓA¥ßƒl×GFÕѲÞ.ì8‘KLº)Ú³�¨®Å»ûÄÓ¤°Kò>Ü£süô©C“'ÿš¨ÓÒ`*P§®†�÷/ÀZ§çj€UÅcIé‹€ãE¥ÛgÌfilïÿwNȶ’LHÉÕÒ·Š³ô¬Ãœ¿ÔC�öß;DÏ4–kLÎcQßÿ,øW(îÄxÓUƒ;jû½®?tüe4_ò35mƒÞ–ž3§¼…-ê_2.8wk!Q\£¶7ÕEÏ™ ¼ÃØi ¾ðtk(lÓC<§ù<=®ef+C’É |õÆoN¶_qkÀÓâ•XPëºôY‹=F�ðÚÒDò•DûÈ× œïå¾úvî>KXôåUp?ü¨K¥Ü€„]囆ÛrÏ´È žpcø-�ø�%€S�Ÿ¶=\ÆÇ©‹:†j)­�³Ý(G'�…QËÆ©Ë\üN"9j¶ÅSê ç-$àAŒ7�Pªà@g—h@½ dÿ\E¥vvNuɦf7y¿ ù²ç¦¶D­J(ªý\ç÷Z©¸§®íS�V٠㇬±þůùã©Îa ²©•Z5`æóŽúïC—þª¿WQÒ‡ò§=h Q¥&!‡j•ž�ŽTŒh⣛8 YäL@ª£¢20É“L}ì­à%•ie(ü%«À›LÚÍ?`¶GÕ\‡Í$Ë~ë¬÷b†àÉ×9ëI|{OèÝ–¦><ç*�†-©üJÝd»»§Ò锚þñ‹à¢DöÞéÝ®�‹¾ŽŸÉ;Ptaâ·ic&|ÐÖù^úRþ·@t¹[ƒ{ÅÑqöÂŒi^Ç2O\<Œ†Á;OÊqKèÜœ²@ó*ÃL›^bËÑ­…€˜Á†¸"ÐBr­×ªj«w7¸§õSÄ#tÿ½«†Ös¬wmõ)Ã…½áÓ‡) OF»`ª¡Hx>¯‰|(þ !NË“Éoÿ~xMª]nÊ•®ÍÈçJy°¶Ðºk!¾Ž OLrç^>ZÉøja‡ô¨O}^G!-×`sÂ6Ÿõ^üÏ>ô'޾X¡�çë1;—\n&…سÔp×E“…³6*–9oÄߪD|8],’1gШ­enl7êþïý`0ÜþŒ›.®ÿé¢�ð‚+߯ð›iÄ ªó´õ^½Õˆ´sŽâ®Êâ4™ ç¬}åǯG=¨Â³Ã›˜«rXð¡&ãlÕµ¶èMVrUŠƒkUP��ÕN®eˆAºôpÿ�žRdƒ“qFÓ ÛS™Ô6œº68GI+º›î) æ©žÖü*£Ý7I¤;EKþÁæ›^V=8i×q~Ûjߪ?sóëy"š¾9õœÕ_îñSuí¥2)k‡ |2Õþ•;Ñ+Ì   7�0¸ÏÀ´ïΣ^íbº8ÜíC¬OëK&]K &à½eÇÙ�¸;û»SÖ R ·ª^S™’Yuqà‘j„¾®J'I¦>4»âL:EQç_ɦNÏ+ýˆG­¤8T¯ÜÑTþѵkMêÄýj¨¸oˆ '뿆–蜪U§%ª¢ÑJàL@¾) 5j�jQëDÁ°Nν¥åx5®Qì{BësH�Z82;¡[Ý®ÄÄ%×êÉ1jüÏÃç5*TàÕ©NÎïªñ¹§c™ÇX-DJ©>·ï¯)¯QzÍãèž¿vÍrõ”ç¢V©íx»¬GL™ù}“yîç¼hÊ_¿æóÖ?®è§ !*)y$âÐ-@�3&AžµFõ0Ž,ºoËóRÉ¿�úÊ+Ì$D‹¢½;•yvz@ò@¥Æä@Ðàè×íÐí1žrÇÅv*Ž£)d-Q�Í?µÍãhËF—‚B PNÀŠ×³X/ÛÌgý¨™)ÝtH‡u\�À¢«M¢ýDâˆË 3 ÅûU-€¤:<¹CÿxšñU²}œÚîï·á–ÂâI– *#¾Øf‘~‘~KòDËË>leš8þóáà [IÞèî0.£ËTF;ª_ò¿—¢'W«a~Œ¹¶¸çETÙ¸MÕ…Ÿ4vúîºÈ3Š;Žª{±BÙ~ݸQéÊ>f„UWÒÈ@Çù˜¤,¾o >8®*¬}•^÷¸=º´ØL’ UïÛ‡CÔ/Rª a:Lz UTmñj­Š–é�=5Z”drÓÚFã9ç{)ó×?•¿Mrï-²#6Ü÷µ!1�?ôv¦öf±©^¬î.Yç›v{š&‹³÷½!ßÝ…Oò<�Ü% ýϧx�öHyWìV¨™'}öœÖ$Æ´¤ì ¾à— ˆ»¡æ³¶5Ÿ9/U};¯„y6­ƒß {»@|óÆrQ*.ôOËA¸3ÜßÎ&|•`K“Õcu�b¼‡Ž}OfÆ‚²v§YWÓ?-Ì� ÒÊêîÉÅL5lÔ¿ÐÇ3á-\ùÂi¦ÇßKÒv�÷i›uWèîv´ºÌÂ×™°÷I‚Y÷»±'R�>�ˆ‹ùáåñž9}^çëæƒåãóú÷ÚWÁµV¶÷z*xÇŠ_¥/"Eà(§´þéCcɾÆ·÷›³ƒÊ ­-é]}6_~{Ïö\� vãÇW¤¹Ý¯ ê|O´÷�ÎYY…ìZ˜•%ÿ�;)ÁWoVvÔŸÞv?áj•�•ãN½»E]Ö¨ÜΧxó¾ó=~¨óŒ×�/|ZÉÓKoòÄÑ¿uÛÅÃ?ÛlÍü¥�}±kjkòvz~ýí&'Ç«LF“JÙ_iûï×áüìIÅ$O½àhó½p»£F7³Š˜-ˆ¿…ýR•ž…[Ñ+Ü¡C¢<îf^™{ÿ§R^ñÁwÖÛ>! * xÜ€|­¡Ÿãš}U`´‘ $÷åÿ~hM¢hà“V´Øy8sQÕ¼/Àƒã.ïóYíZ@œ‘ëD:HÃùu}UØ�Nv–zPK§f­rtѯ?/jtV·Xkuq×Ǥ)Ëší(½¾Èz]t•Ó‹:Í;Á,*ÝŽêMC[k=j#ýL˜ç$%ÈÙIaªE1y?[ë©¿³XX‘Ç̧>{Ï‚ÏÏ×cÔ��Þ›"`¢” Ñà¬Z+ Ðá¼ó~;�dHFvGÆÒޤÔ)É?¢†�DÝÊ&¡;Û‘†õÚŸ*{¦�5êÑõÜk;ä!! ûòsÍ#Wk‘Ëý¬Ñ{íšÕ‘“‹ïU3Zà8h­zÖjj�º $õÉvö®Ñ…ÃZ”žÎ9«‡Hv~ìm’N;µðH¢ªâUê~ÄéBzmup²†îÓ>?·½{ÓçG?께˜:êÓˆ½õQ?�ùÉÌÉô3ÇÏG…¤Æ”E;TºkfHÑ')õFçè„N)�5§åqO5?Ș˜8~AíšKϤ BvîÀ‘Eʼn9|ýÔÜ\L‘h/T^h wЈû€ãH¥wàÐ<42£ÝAð™›N  P\†!À{”fTÄÈ»Ÿ�4Ĥ·b4ªÊÊŽ¾ÄZ::²;¢5| Î/Ã\eoUó2\ê9îýdñžíB¡7Ÿ?Œg­9|L—ºslTQÿá0‡ìa°‹4®ùI7ƒý¢±Ùû%?àDÅ{an­âíË»z¸¯Ë!Dpꢅîùµ¯rÙ¦™§Úó§ÜV½«.²²ð�ÖÑŠÿútÔt%J:V�RjxEŠÏ ŒP°×èïv½Fx‹â²[ãç‰ËM×(q€�Y¢¿éÿ! ›‰8åR�ö…ª·áÚPBI]êÜäh,µk=Ö†8±o3H­ †Ø+¾Á+iʵçò¿Ë5'ªS’‚œ¤ègÚFýr?µÉ��órºtæàé>KyêTrÙóº%ðÃ+¥ØñžÍhn¦«ãÊ3îÙLoëü¿?�¤ìH³¦–‹F¶‡�½±9ÍÌ6Æ\¼Ò{Z%W½�ÊLÙsÕ¦nÈEþM6?‡‡î üÙqòßí¯÷Ùºœ‰½·U¯Pq*Ôß�­w0írôĘ´ö…­†YMi;K×k7ûs¾Ï·Ü,ó0¥Xu þ¤˜ýtár3nÜþ¿²| —šùe­Ç2Õqo¯ndÆ´” êJ¢ƒû#�²eƒ�ÐZaþcõ3bM&ƒ´:µÛéLr´Ö ¼á'–*»=ùÁ1º~�0%:žk–>Z%|ø «–ÞI«¬îX¼~è{ßúï0`RFÃäÁ€œÄB]øÙOggS@¹ô M<üÇûÿÿÿÿxÿÿÿÿƒÿÿÿÿ“ÿÿÿÿ‚Þ…;¸gúLk˜ÂMÖ3sOd�®S+ò%V“�¶¬PÝ­oœá�Wªw ïËP�¯,ÿØß8âÜwˆ_üèÌépdXbjºÇ\»:gäS›rx8àýQK·E`nB÷u9kòä¨î4T-D^×Gž 'å›�ªõL¨9‘jV�J~˜©gqÈ59A¶P›¥¶àý!;MƒfíCj3K/ 5J­Lû· Ýgç¼x³×*TéhŠY¡(†‘·@þÒ�5»[CêÒ 5*ÙIšéÕ­}‘’Ždö9K:“ 5ÜÎkú=:%yS�®!ÑÔžU™#k]\õàš=™<¯S¥€ŠvPõÊå·ú÷ð³ä¯G¹…© 3š‘Q“G…CgᵃF6hur¥ªÄSÉßõ¨�Vޤ`7箽wu8ºFüM5»¡‘¸EGL´'PA'4èÇ—“Ô¢Žúï‹ȇ胿'Êê%?Ú˜Cóýžyü-Ô¢¦êL0?8¼—‡Õú#bù��ׯ¿w™éÃöh�ÆÍë¯YÜ]îÜëû¸çÈåçškËǯö„gØ6T�?d>‡‘jF”�F2îEà$¼ÿ<³¶h0aÅEþwP÷ ÕÖ‡^csšd¾v–ör"W+ûZŽþ{ Éè–j-* 5:¾:jÄå>ô½PxZ·>é9ÕËÊojmÑãWäl:é]Ð̪q`ætÔíhÏÞ„ž—í$˜ÕìŒÎ5©Žf¾ûóÙˆ$T�ôoL>×b¥äÏï&ûÁÔ@Å]ÀZ³~«9«ðÕœw7Þ?7¾M¢ý”Zø©ô�Cõ„îûY,üñ<Ü‘÷·|=.½¼{1î+VJÿôŒzÑñ”ðÀ½6^…[”WæJP0CnQž©=@¸örÿ‰ÙÎF€è=H…þÅöÇMû‹p�¥ÁÙ~Ô „3ïÿú${jGYÐÞ§t¢’Qì7ÞÝ <ÌgC�9V÷„¨­�ð¯ˆcr›˜ò]›[ÅÒú�·Ê#Éú“v¡;‚FÏÓÝä(«OTÍ#úx¤ƒÈpª,[ÚºSµjdFQ�£'‘SYw " ŽQÑ_¤dûìv f“yj&dí¨WÓ³Òú�NEXè˜\’j­@AAןÓd Í®ëB팸ê$ ½Ë;=G´ê£¤¯ó¸O5Õ•¹µ½^㫤¤FŸ½‡ž-ÑÃ@dzLÝFÿtiÒu¢éâ¸R—÷ Z�ŠžVpª+qÐe©ÿøùµŸÓÛé�ê¾=œB…wò¦F�õåû—Ýý—?(~=u_T•*tsîí4µõl^”J½êœN�ª=¡êý—ú¶6â+�7¾;†^ý¹aBSùµ¿�¿ú’Ç"±zÒp/·×m�;Ûõê~÷žyOhCâ$’†PåÒìs#€þ=ÏÒCÉwÿ†•yú¶ G‘ ßÜ�WP­[Õþ[†Ìá@µ°ÍÅzü{Zœµ%ÇqÈXf+ç]1ÆÇOOçw‰<•CqÒÞ\{Íq…3šaqhë´Va«ó‚tÓª/ ¦†ãÜ7÷êÃ6gW gTúöûOãˆdüuˆWHÇ]r´Õ3›\)31‰;�Þ5%-fIœ\OÚ—�¨Ñ�¯ñ†³Z á©ÆøÈ] –r¶A¹�E.·ìz§j™×Š¡;ÒÙÚ¼îÝóIÏ��ÌÄç›í‚?�öL0X áÚ@,޶ ØHöxX˜;Þ¸�&ka>µÌÐs¤YÐÍ›§±îUš­9ás?N@Éz©]üºù<²ºÁZ–ßé9ˆ=Nõ»'/'/*H#¯—èpy�\íÛ7¾¹Ìb’äƒSävõ犷Å^�ï®0gïVñïÉÃña˜ö>nïÖ…µ[]ýs‹O»¨Ã\#ù4c¦ŠžÞ{\HñJ…[ù{h JaQ¹I}%ö[¸n \ÿôÒÍ�®âÄ ¯¤•ÚÿÿôTŽù¬Ëá  óŽR驿ñÊ@ç†úsOú9ER¥�nx¸1åðî0”2«’tÏ™hùÇšÍTèÜW¤èí^)5[òûWMªóól¨�(g8µV¢ª�¯íHÖÏ�îÚÎÃ]H¨qÀ¢Ýª©<ì]C†¢<ÔÕ¬5¢ª´Ð!z½¼¥æRk-fD•pk„sðX«S_ �zæ^#�5¢“Þgí�%ŸÅñÌSͯd^‡¬YÔT*Yk×¼†ìZû�y?ŠXTežZd'¡sç5©t‹äTQ”èT§ÂÞ|·ÒµVºkÏ�ì©d…v‚UhÿŽõ<·|<ç&ªBQLIÌ|"èÅ�Ž´d$jÞQ §¾HíMœ:“ÐN%f�‡:Õ†#­RÐ=º¢§`š ¡T¹T“Љ!4¤ ÀÂ)µc â%Á~kÅBɺùôÝ>îù‰•ÞÞƒÜbsBn?Ç¥çͱ`#¡¬¼i¢ÊS#²KÜæàµtÍçJuKÀÛòšÜ·�6ŠÆ MÂO°�à,IPÎj¿wÂÁ�V!Oð§õbV=Û8¥v‘6½råkþå—IWy:5Of¶Ìi`Žtkõ9µ ûĺ¸K»ëqÚ™ôŒ;©†žÌ¯ç¶s¥aP­ƒ p¨�Ÿ;“ƇUc|%Ä‚[vÛÐÿZD#¬¯)ÑùÆ�´ã ãœ/öÿË”Ùn˜ßUù»BÅS²KÎ_b(Ó\_´e±\¯gŸ¾ë»~û‚}¥}^G16'.ŽÏ“·S..þz M.Á=æ<7jĬŸëàä0 và«Wä eEµN­òËß×ÿì­Gg_îDZq2Í‘ˆV7ÉŠ‚¾q‰b­ ôùø¼‚Ë?~&äÆ`)`j˜‰¬]-pàgÿ·Kvîc—Ë(«AîÌŠ›GŸ©ðñ^%ƒ¤¯¨Ed›,-‰³ñha=º.zúž~êîq•¯ìû*ê©×#7‹¿Ö¢æ’1ÄòϼP­þ-FÉ—¦J%âÄöðëç$Ó¤õêoheD^E÷CTT‹ó{t'ƒ‹•s¬Êú”Þ´èyÖÆ#^XâárQÈ}Kqr÷‰¡1?z›òò¹µÖ=ßÖÁ^äŠúŸtÿ÷ž@N@÷ð·%Ÿ;*ZÐy-í6©·E ®éë¾z{é�"š�;öKm.Â"!¢jø�[m²º7ÚÏœ/Û®®â0BöQTå”ÌŽßw\ad§¸ÙYc®¾¹2óÁý‰4•c!ú ¸—ÈA NÝÔÈë÷ùFí“öxôK“K³l×Ͳ”5]=âe#dël€ ^…;ø{bp…[ùgú b ×Òo�÷,œˆ¨fÿ $¡òz„#û—:bá€ã63µ ¢úúòTPпG�îZ퇳�Ϋ«[™='DæÊôT à�øwe‚¦®º¾w¯ðöÛN͟휙N"�ZO™ê‘}ã\�"zý:e³xD•ÜöîÄrusÕ�%Ö74jÎ*²K752k÷½;B´3øprBwúµÈZÌ• '"Ñ…Ÿb'h9Üy‡V§víW%ó©«â@ô¤Ò’ï ÊŽ“IêIHV("ô0££©Á "…È47ºES…¢û,�nÑ}ÏÌ]³E-ûlЉ]ª‡GÅ4s—½j­ýÜw!t®/jqÄ|ȤquhíY*ùó®4L-•ªADMIÉ uˆ¯Ný$Té µµJ:¬8sÍ GŠú)R@=[¡[+$PªµÚ˱óð@å¨Hò3>ý‹ÊœÀýŒtpŽ¢@j¤D’D@“.— ÒÈÇÆÿ²hGwöÞ‰@*uÉ1¡¡š{ˆî@3‘ÉÁšÇßýÌcH~î“ 5³‚}ú C÷R÷Äqâs‹fç¸ImÁ@�.Ž˜t×1qùM»ò¼/è{î¶—«òÿxc/}7+gn-�0l€çœ–SË?-Ì?1û|k¢—¾Ui­VÃÞâÍÓ}•óLš†]¼Í!›–/h¶¾ËÖÿ‹ÑVÕt{g— |ÁgTA›bƒ€«&å{®Ú¼[ÿ·Gj^ø�Åä²LÍRQ ±ž>q±xm&38×®1M]zè¶«|°NÛ›ökÈU¢äý宾üô÷Ô¬¦ÄT8ýQîšÉ”Ùç[#²Y¼ß[íJlsjPÕaKÈ7|ÌYNê~òpW¹ªö‚O=’ïu‰L_?ÈûU•—ïÉ6—àѽ†r³'Õ´H U9±¿[áCzþ¤S½²Ààÿ‹G�®p·æÊ³VPØTv=p†2èÃsŸXS/)­îÄkðl½ý…ôÞíÈþûÎD xÅsüºõÁúsi$­õ}ûé�ržè|ú'ÿžó—ÏÐÁ]irÆÌÉJj}Ç�mä<“Œ�¡LòÊû¥³ž–ë{#Ãù÷ÿ�À©üéáÌO«ùzn§‡KÖå@‚=¬è¢ª’yc?~64žˆvîðQ1˜6ñéÓKU•³çÕ#þ}uI ­ƒîˆKã¢_׊$ñï~Í™D+e³/¸#iÕvˆïnaTÑ–´èŽßÅiîmùšý4tV †Ñ¬•ŠÁ*_ÊÍ$£±,=^YûXÌÄŠŸuI'Ó~ —³®Þ~]åvWøjǾªºØzèºtã8v­ã ›{40>¾Ö¼ O-9­?2¿åž�Tî²'Õ¸‘­!\oþYà¾ëWXœvŠÛÚÇínÇÒÄ\£¥ñ-eÎM·`¦ÞÊú¸:`‡­×Í¥Rɦ Çõ÷Ôty­õÌß{šî¼l9R.‰Ýî/•f¢Äøºq4ë Šl 6‡Ñ`ÌKƺàôÂÜ–™MƬ½ò˜Mã4�ÏGqOggS@Éô M=Õ»¡ÿÿÿÿ�ÿÿÿÿ‚ÿÿÿÿ�ÿÿÿÿ“~…Û‚{ZTYTáV噳'×Hûöë»».�úâYÝþüÌáÃu�¤fí²&ÅMí½Æ;rjw p~[@$‰½ ³äxŠi¤¼^»Ó:) Å× ôþ);ù�i./­Ó¤-˜)ó0›Gw­«Ô ^Z«ä}Rízq�hTïyddÅsBî„’Å4-ã‹#D’}ÜI§JíŸ$B¤¦—HMGB&¡pâHyHUÝ©¡ìÙµ³2k†÷Ià…:KL1í²'êtí@j·hÎáœÚm4ALYO§cn‡®ÉÄ Žù®‘!³J=e ÌšLß¿§¢¯�¥Ð=ÓÈc�]‚DÝ]¨gý$§N„œRîªÎ2G„S«¢U•çÒ¨è$Zk¦HN)Ñ;ICÓ«rçY¢�“ÉMwö�È\D¦£‹i®úâDQ¥%²Ù¥ã¨Áìžê½6ñ*5*µ �$„¡¥2Wä^ÑOuªBô„ R›ˆŽŠ)žî6ÿ–ûÒåú<=vã~Ìßåÿ•¬´Ÿ%D£ªÐÍLM�ÈŒ¹jHKÎ\qx õËßM{ÿÎ<%ZôÈéÜ@çöäžÒ…”¦fsòéˆtõ>D·§V~® ‡™ >œ‚-€$ISºÙ¡z›ˆ¯NÞ}þeßõ«ÇFqœN6½k{ôÒÞM¸ú[?-�u‹Î ,—é[äµc1Ѹ賺š¤ù|FÓÖ÷§¾;‰å5ûµ=pÆh'*ÍÈ›Óå¯SÎÚzÏFóË ïç)Ýr ®ËFÜp€qºÒQ¼q¬Ñxè ­éjÔÕÏ·»é/4ÞÐÓÓ÷…u_¬£¦æ ]‘êkå’íL.#|¶Ë˜IÆè�ßcKT�w?Ô`/«ÑîeYOGÊÅmtoM©>¿i¢±¸r¯;6*Ðý '�Ûçkà¿É®û:·GÔ¸†L‚CrbÆþBõA/ŠõÿÏ7nu\V¼••ÿÇÒ0/nÿÙU¼Ö|#9µÇ= ’“½›ß“�º˜Ô”‹j•Z݃éÝÁ›ÍÖf»²m1"ŽÛ¿¾™ž‹Gu-ÎF,ù°Ó¿é½ÏEOO¤:éÕT¬Žgó)6•†C¹›£H§.� .±7JòTbds; (ƒ&¾bÏö3Ì´õ+Ý …º?޼œÊV;ר|ï?>N·õK# û{Rºi‡d4#ôijFpư)¿òÔq5Rwõ¹'ÂF'¸è=÷>\íHåž»“ �ÝÚ£ZeÜ9lá+x€ 51jäaû7VÉ}<飒ñž†ñfÏäKÔ�;Öð3ÇïëèÓõ‡ÿ““c&OçÁ´}”£C]~|­tÝ“ñRÙ´®»\üvC&¢²s_ÝM|�¿7|g�x�<ôxcDœËÐ/rV/pÿYÒN~ r`ùµ·úæ}‹ŸÝ¹¤ßç蟞e}~p#·Ú’úÆäAÝî»ýÜéQ¾íoÓhôÝqrJ'´r>¯ kàQ‡�’á/ïu<Œ2µÃì-Ê¥a1?¾æzHÃh¬��Ñï=÷ ï]—,:ú ë/k ãÚ.°U=L>•Û‚m¨6  ·ÏÌ“šî@pòÿîÎGöéùSù;k?©€7ÔŠV¨WtýO²ôÔùt¥¨·w ª>´“3œð޳'G]—™”ä59PÚÝ.¸ÉU˜ë”¢Ze�¨’ðŸ:¡ÀCpÒ‰œ‚Fä—ˆ“‘ª¯rSG-;ôíóÉU?kÍaЬUE«¨e$Ò©d­?×=#uqçÞ9¨WÝì­™‹~DkHK×5Nî²GíªdÇóüÉžµA�wõ2ÂuÒI¶bÏtç3þ&C›­ÁU„$­“\ë¼ JìòrÖCZ ÕN”îžÔ é8’ ®ø|«©Ÿ_®¼ÔìÜ;ë\‡E4µ]pVÑõ3‰¬'E²¤.‚.dÅ¡Æï¡"1Ï'œ@v¦¤f“°¼ÿüª=}LùîñÈ+�Mö^P“¤j�pQTÎçNÍãò™òõ³ª×ñݪ§Å¢_—Ý$Û%÷cÈšãÅá½_C79º˜µ'HGD)8tì$$B­ä3~swï")¢8Â�Veâœb›9Dq‰~\=_žÃïVÇH~lÀ²Ã=³:~Õì">rf#;‹W‘~À÷Qn3‡»[$•Œ S à“†k½N®³fï¦fÖ|¥ejœE�+‰¤ä]£`GÆìIS–ej}© ûW|M†µþÉüÕ¿¹æï\�.õ ù6‡ƒ¨“xí_w ð‰ËHFiBºÿ8À9¿¢À¿°äÓ"]_ƒËþümcs÷˜Â´³îšJ?Æêé¢Où~ÖxµTçÌÌýëyí ‹qå¹¥õjhÿYMyè2 B;Ã×Tôü»'2±ÓNtÊœ·è}£©˜éBuuƒs—HàêñŽ„æLwêúÃóÛ‰ÚíÆ•‹­�?'DWÿ¿„™ÏT¿ŠÁ~0ˆ'3eü`Øi¸Ž¥þ¸öJì… ú]Dø•3�ÂA�ج§ +ëL�#^Ùu(6.n®„}ë°É5-¤-%Ê ¤÷*ŒDwEƒmߓж+‘q?3»¡ìîš"ñ|#õMÛ²Ûx{àéÑR|~ã�Oíª±ÑÁ‰ÿ7åvÊjs“;µû¬w{�k"Jl$BÐÛe¬�3a༔¡bý<ül�¸èZ• 5£jå P«¢ß1²ã|l¥‡¼òsëT&ÑÏVùN[‘­´+{ÃG~€æÙŸg߇D'#BMCG­f„viþô´Wy‹Ê­òÔÇa²×d‰åë˜úd¯–ØŒÛPtû:â-„P3ÎÔ ýlÈ_i3ª<ü E«^š?úñ×ÏRÅë^Î~ó©ÿ¤ ÎeûÓÍy“Úuþ–ÉU,2«Ìޱ{ìü%�kÕžõ/¾ÐBûÿi0_:Ö½¡®O±Žô>‹µÛ­ÂZØxRz„iG³Ž�¹ëïaŸgIÆOw«ú0R< :v#úP”¼Øµ&?|n —à÷›×¬oqN~ÿÔ’ÿuV‰$.¹š:h«´×ð´¼-ê%Y·Ç¦©rÔ°-¨ÈÜ›í/é_¸^_ÞR5î—Øë3ŨN‚ ®Ô^h) [Þˆän^òÚm¤íÙš‡¯J®o[ίP]R´3¤bçST¿F™‹ª½7,R¸•÷"–7î‰N›Ç²>/¾œd¹þÔW\¼+Ð˶S@›úø4yo\gp¿¥ ð³sLVKu¬¿˜¿=ðsû;3G»½|lˆûï…é&”^ØgÁ=é-ù�?ío}@¦›L*(}éÐõu;96`ªÙЧ}_ükÛ¸mnã9'|.IÒ¢^ËÝ îKÀlú  •ˆ5פÔE?mþ”[‰{´ ɘÔBUn«Ü2W�€®…ˆß{ÿÓÛ¬)¤ƒãÊÕ…ó©r?ÓúŸÐr½‰¨yÆùyÌN¡T/�ú„“´ž${=×àZß³:y-á òØEŠX=Qô¿(sHÔJÌr¸‘¹DP¯Ú‚^¶ÐÙß‚¤ÉºV‘œ_™Š|eÎîtR•�ò¡µ�#‰tUjý!TÁëªÝG׆Z‰Z»�ýž«rhKd%D ´qÊÓ>™qª’™ƒyäž�)r—$Ëw^ûïÃä`¬]$ñ®õ"ëýª¥F KýØ•®CöÙ3{Ç Ý‘NG=2E>µHúÔîR›Ôz&)"ÁÏN#}áU&šÙ«M�¦®¢Nêë…¤C²+óL¤s$Y‰ªCðÙ]•”ZÄD»‘HD•=¾‰¥P}@D"8JE$gW^WgúÐLu÷zÑ‘A=è“Lúó© ŽÓ%¦2‹†Ôv:`¹ñ¢™Yg“Ÿ©ZLÆŽ`ôð忯�|>Zó«Bãð}ªá� aâpT%©¢NݵH¤eÛ3åÊöËo"Ú‘U{®@f4�+sŽ3•ßî üžl³ “×�þ`ó\"‘xo$ è}gˆAæ�ncw0ÿ¬Å”KÈN¾“éú-¤‘¦–ìs†òÏuùµ9ÕÀ GgfØŒ|ɘÕ;€�ƒ4*¯ün{®¿æ=ã�ü#-ÜMC%C°+— @7*Jæ�¦MN¸¾K³u#ÊidÁ;z�_ã…ùˆ©‰n»õw�=£ÜúJžÉ‡tèEòþvšÎ+®[á£&ýÔc0=-$ˆô|å´d¬ùâ­o:<…V»;]Çs[DòOÒ= n]A&r‰ª÷ówüÓ¯7µ æü÷ñâ~ƒÜêq¿»2Î|IÞhfy³ï›ç&ÉÏ’cgø_ªôÃ.?û6_»lMö¼Á»ZcíÇjpë7µ[ÝmPÿÄzâ‡]F¬žLÎD«ˆåzŒ"æ©å›¹ “½V%~?L¯¦òÍ.ï¶¶˜Ž¯•×´ÒK&o:{ß�¾KtÅã�ÈKíúló—¥âµ2y‹”/¯×ᆌ}Á ¢z©õPE ›;ëîÉ?~ Ò?³Ð¿å ŠÙK“�;®²½QAËKð{µÙýòƒB7ÿÿÿÿzÿÿÿÿzÿÿÿÿŽÿÿÿÿ‰~•ÛÂ{|%’�xÊ­Ê-í€5\ Azý¹þ“l@â¢~æc ùëãÁqî¿ÚÛ Ðõ‘µ'=)DVGþŸ{­Š d®¢ÀIBÅùÖ|ª×½¤ÊÜP÷FC» óÂþÝ«œgÑGªtGk•×?Îþ¿*²ë[;%³[éCgQ¼ø3e¡UB£vCP„ê‘BD´N?ß3"¨Efí¢:âtÕl4u–#öS§¨uÖ) *Íó‘RùʨüF^[ý©ÔšE dÚ{r@=´«£’4õ¨ú•‚œ¢�„=ûE…%º¥ÐH¨Slstdí�*½|Ĺe”™ˆ��H:5©u.>«ƒ\�éHGæUŠÔª}\�›´oˆ9u¯EÉÍÇþíÑç¨Î÷sõïñOø;5›¸: È#É)‰~�„hj•rÄ!2fѨ¡}™RµÈJU‘hý˜VÞD/[÷çsŸúáÒ÷³PL*ìdSUµ²~[‡~™B4M£fîR ­‚€@™bÊ*Ôž¢Oãá%·rŸh ó™®(>sxö]Rî§ü£Éj‚mò·QÌ5Q�žcíîBèTÅÉ {§rüÝ®¤ÊÃìòŽÚ�÷PÕcA)¸°à$?lŠQÑiüv�W1ì“íéü~=sôùbü0Ÿ9MÙ$ë+—u(øàÌz Ù׿Ië¶ÑøÿõLîæ=ŽýršµÁ¢1O]ü·z/3ý®ƒ·Å„V_µ`çIJ1¨´Šù�VjsÌñëòHø�_Œ5¢êþWÊG†ñòNŸM¾|ó�Q?¥J¡ÍÒE<ûaùu™Dxÿ‡‚›#tû‘ÊÆzç>Þ}…”õ¾?ôÓ¿x°% ðÞF·&å£^‡5êŠkJ³´Œ ý/8w¯úb“Ÿ<¿TèÝŽ{ÅÅ×}@Úû(£¤¢¼!q‡_nVÊú³Î'#ÙùŸ¹ïùb¨òúÿ{7bÄ¿"Sý±cvC¿ka;S;uW«ý» Žö/SxšI­>Üôäĵ€yZ%.…dr"xÿöü†Œ\QóRÄ~šþ²>¸G{Þè›Ò]ŠãÕX÷Ó¨6ƒÑˬX™Ý´aïb†Sî¶h}hLLêGă|òm@'÷?5FXj79Ãk1²à›�fµà¦ÌR4Þ4a'ÊÒÇäô§£ÕÚmäýë-Ïtó‹•§©Ta×÷j›©Ký ^Xùa*jŒÀ.n”]•÷ðV´;õîßæ¥Wœ.%vÌÕÔ�/çÿ‚/ìÀã; Ï-uñ^dMÁÍ;ò0L3­TSË@F÷ÏÆYÌ9² :."âÌ æ¯òr"QÖÖŽ5Z‚9ë³® ûz~¼_úM?bþ.s>ýß;çž#{¡¨qÓBƒJ•7ÎåT™ö:³T™Â™~i§FˆÔ†$9©¨#‘¢µà v¨Uuª•x8¥ê7~×l…d¯šÍŽ’E´#¯Rpö¨š¥–TW)ªhÕõ³xiâDö‰Ðšª‰¾ ‰^}õ‘i¿²�ã´:5»�s}tw½œ“N†§Ðµ¾—’8,÷¥ºÿžûþ’ÿžlÁ8¢(澃¡Ù=õk;Ä”ìÚ�­ç”—4ó\íb=žîýûdrÛò½½î U ₺öw,RЕš-^Ñ‘š=kÝûÄÔá)N Ñ‘ÁÝ­™ÃÍ¡ðùSÔ$�ê\(é(GŽtœµ•ˆÁ¡*Ð-‘—ÎSêìd�vú”ÌáãO"©åÔdþͨ{ „j‹Ã\Â# õ¹óÐèúØóêKc!ɬ¯¨K‘½•£„ßµÉ, ë) E±RƒdUõÓm·o‡•¯¸^ÞÜü»“Æu>…v¥ÝÙô¤÷[KƒžM ¼u+úCÌŒÃãíõ6.̧Óoaæ�sø¸€–;±IŠû“D†}@Vq§ýúˆÃÅÆ@é=ÞpÆúžör@¤±ëÜëšš€ö+î„»£�Aõì<`J÷/‰%ç‡Î>ÜUØ)ÌÕ4à¢*Œ—º7_çÞzӟǨõÞÅãξ}íúsÐÔÚvdMÐ{§Õ´i¦0­œÕxy÷÷·ˆ/©�]-”B‡cˌǕª^'fçü£`U˜ùpag~rQ÷8„õÇ=g‘äÎ;‹¶�ù�ñ‰øa°Ë«|qy»‡’·d,­6¸§„ÝÿÎÿ’aÇ$jZýIéÞ!øk¦JÍÑèÀ¿=õÜÿó|óÕFnðkÊäÏíguµ\»“3ÏõŸAÊåipWF_�#ç[êšâOñ€þNZV×x§ïqÂ0i[{¥ú$ç4zw+€ÎÊô{I&ˆ¤{Ìß}ÍíO¾O*ª-Ož©üT[¼N¯Kae\é–ÊM?²æ5|ƒY€é6l¸z §ÕÕ]é鑇}êû}/õMDËý4W"ßü/ÝVœÉàbWþåü­ü­ø9ÆA0ö|Æ�@u?¶ßäÄJ È=…\pþ�øž-JIcÞß®xhwÿ×Ó”xá«ýyüË°Í ®D“9Úþ Ã‹› |ƒädÁ‚j:•E¼�u�É4UݲßÒH@<þ–‰¡ÊÏñ·¥nL œ-×®»èävÙ[�“žõw*ÖÂÉûúd<;ÝÔãõåšÎ0ªË6æôÿgŽ]ÈïÀ6IÞ pEÜŒR/*o&#u÷�ä͇ÛNÜva©“çx<ÿã™n†‚¹þ„ÛªÛÄJDmS¹ÝºçÜ ¸¶ôßö/tát®9ê òXœ×‚!“  öÙ\ }¯ýû•�UjBŒHƒÔZ­± ð8SWîRéç£Î 1 8ð÷ïwpqˆØ^)‚£��)&¢þ;k‘sÍljM=nïвÆ[cÎøF4Ð,ô88ãŽ:ZìÝÔ%:ôõ|Ç}.qï+´Euâ½DT˜UX¿%Uº”%�¹¶H�¤ãp–�Ëàñ©×\/î¢þ¿ÞjH×*N¶3‡+úJ@T�î�áH �—Ú!Z¿j×%£Ö¬Ó»N-Ykž­Yc£ë‘Ÿ5Ñ 9z 'DRÏw�%¥¦7Ã;)ºtw¥ѱף‰�Î+ƒõûîï�¿_ù*Ç”PÂ!âpx¥KŸEIñ¢»þ€þÃôû!{Ú]8Èi:öîç­t­"÷çÝÅýù1Ó{Õé>$šQõ 9Ï‘d´ Ôªô2$AÈ= ñ~þ¶äÉöå7¦>¼CÑì…CâDfm„T!@w¾Ê,E19¢ì$Euh�]…ÐJLÆÏÈæØ§¼ l/ý^dÎöã_qf‡¤"ABSÄä|>Šûš¬4鯄=�‚€LNWÊI.÷H†€±’Ã�P&«vC7Mõ«Þ7%y·á„í¬vq³²w÷|Æ·óó\öênUŸB)€f÷ Au ‹R8/‡E*±>þÉ÷ûÃÄéMD£Ù×Ü È;ÝÑ/ MUî{ú~¿&[së®Và+oi…̹(� ù¶Ÿ:O²Mjp¿¿¶ö½#ìß«ûð‚æÐŽ«ÇMÕ¹á$3!ÖÒÕÅzDÕJ…-H³_û‰€9-�÷_;¤«3ú”ü ,b”n¡ÃwÚ¥ž›Ð×Åþ³.Êtµãâß�Ÿý*V3OµôQ{�ê§"n¾Õ¨Ti¿»ƒªµ;ZþÜJÃÙóº)yó½l.ëpæW¸â䑟Þf�É2ý7ìÖïÒ¨á¢H–ä0w5¬A¯ŒAçv_p�oé˳±Ü÷I¼æAïa¯ä×£žjÞáø2_-GTIÙ1HÌïk›Ñ[*ê7dTn¤Ü�„ý/5yl|T 1›çbϱMóµÙ¿cG~{:ÂÀÏî:œm4vp‹/tÿxA‘?õ�U–Œ¨õŸ&{ržÇ¶$ø—“ÕABÝw�]ŽûïRð=êi†î×6.U�ÇŽ“ž´yóïʃƒ6aϯGý%>’‰bWJXciú@ø ˜†ÔÓýÊÊðߥÚLÒ'�×®ûKn™†¯± 3׉ßì"úÿhNº Œåé_zÆ—¶÷„ýíŽ3v6+¨J)Däq$ßsÜOf¾Î®þ»÷¯�¹ªˆ—Ëššeâ_R{µî¨?ϲ�Âﻯç�èèÕ\`‚Fužf¸[eÀÐs`šM{œ—/r$ βh™Â½1N€ˆØùéé¹·¸®5v°å`‡{ñËÞZßÀXŒ_“\0þ¶ÇM^°Ö+I—ü _¼M.aó:ôï·ççaÔõÃÓŸ…�®‹-¸)ÅD*ªI³üéÞì‚ >•Û’—ø,$ ­I¸Ùº¥N ptÀ“'†/Û¤4zÞâ‹úÁý�¿ÂxV½ @r_óŠzGzK*â÷3ÉØ"þ „è|ÅO*5Ä?ßb£IJØÁÉ‚ëÉvÓZ~ ’¯šVÔ½ëçõ­ÄðVÞ·3«£“¯´[ß©'z•êU ïYÕÇû•¸í½¤±�Ÿ>9"¿Ýß«GÝÜìäò\œ\š¯iq;D¯ËÈ® cíš~€étçg“¯s|Y“.C2÷ÖþÕ½¨=™è‘Õ㟀ùG©û8Öl-mßÁÙFQIL¾ Ó;'‰™—=þžÔ2­ÂëýÎZÚ‰¾F7ÎW;NÂ~ê.ÿÇ¦ÔøèG®Ç8O¸7ûáͤÈXך+¾.;#†¼ë .¤Q"¢/Ô/ÓŽY�â–›eòUFÓƒpÑõüÑ}Ìb^Ö'Es½XÉ1‰K¤Ó]ÏnTþ�$ꈰëGìûµP°=ÆÕ©µ¾nè•ýø[ÅEµçG¾a%Ë>ý°U…ìr®{YÀâ–¢ó ü¿=�:/¶j��CÔnoN\Lx¨kíoøw’E�íSµL�øæÕñ7p&OggS@éô M?\¶ÆIÿÿÿÿ€ÿÿÿÿ…ÿÿÿÿ‹ÿÿÿÿ�Þ„ÛÚgú,t ’r º¤VrU�ׄŸÛÍÛ_š�‚Êðqù‘Tãõ8|ëR‡uH9E�pÔ×W­ š|Ù†ÐÚQÑœ1&à©Ôš¯WSLZjTàU³`þÜ“"•ê9ÙkÝEö\Š<‚úŸo·ˆGVYæcÎýAЬ—<å}À±£g¶¾ÝËmœ¹1=wúP7¹¯ÿñ0dÿ{ü3$Æ2u©ÍAŠP!÷_˜«ÌEf%g 2£ïuÙ¡xpªSŸÏ µ˜)8œDÍšù¨¯S×Îêô¡Qé2yOŠê•1K(fÍŒY—…®€^Èœ§\Ýé(õ%ý ‹vžJÂLUD�Ì)¾�&—) Ý5œà¬¢I$_ Šéö¬( Ì¨ÔŠdx„Ò%œ±G¢âì¹Ë"'•º;QkW†®5öCdïéŒnýxV�#€¹SgB¥BB+LÚägÖa¥Ûé„ÖÍ Ñ�”ÌÔ8ÝŠ1Õ¬@ôaï™…ÃÂ-|9…Ó3È*¬ÍöøC*ÍÐ=G*™ÉN"E$Ïè=v•®ÔpjF'“ ½ýWß«ñ‰L¢£Ïºž|´Ä¦³ßBöçs:šà.ß(H覙5ⵉ‘]“§[¼R§]ÕÿÐÓýÂ�ùÝ(+„-[¤ ÌÅHœ» š±*µÞË_cï_«éÒ¥ÆUšÍãôoÊ9ñ3å;Ý!Çõxt•T9„ì»æòT ´g˜w†Ê$ƒ^ìÙ+¾/Ÿ~e2úz@¶“~úÒ»ÅL+«�Ùü¸öžº¹iÄ’ñt¾l±ë”t¡ÒÚ´‹Iï{÷ýw>m‰5žßåÈÒ?yKo˜~º%–¼éç¼;Õ˜�S™Ñ¼ µ`NR u[=+„xž÷Ä¡xÌoÉû¹ýqØÒàSo 6n­y6è…çLJÉq{�iêàN+Ö‹ž�‰¨Ï1ƒú^“;©þô©¿C]m«ê,¶AÐË”€à…ËÌ�2ö‰«™§èq˜Xv®…%–[8¤eª€gÛì­ð<{ex^õ¸Tó‚Š €¡1„þjEÄžícÇÝ|,Š¾Ç¨ùH>G:o…Çëƒ**Õ8J¸HÒÃÙ61KÙow¬ùªÉ�·Ã¨Žsg™yƒÛrn9ïøHòÎTÞ…¤ÛU-¤yƒ“µ5—š{.™]:7CËð•=Z/Añç‚ÇÓ+Z[DZ}¿$™¬;éUKµ«/X¬ûëºéNŸ¯öq¬‘mǪš´rÖê“ÕsÚY�mÙu2w?üÈ”w½HpKŒ Ž.¬—�0Ð5;|Yj£ oA’çTãz\ÐØðq…÷˜ëuQ»È×ffxxÉ~QVÇú¾�öQP›™”yØÉl#ím×3ìåâŽý·žbÅvpÿÛñ#˜Q8ì| çù‘b/<Ÿ©­½BýbU‹ÛS7I½¹&?$ûÿ¿–_ø¢ã†K(v‡w]o`Lþ¦_ÿ|+ûþöáíI}×ûÿ²{h ID¡“' 5ØÈå¾3ÓèÅë¦qÏî~•†òdÀú‹€–Þ„;•mæ*d�O¸ÝÒö ûpÍ(®6-S-’  ×| ]å5k1ÔaÊL•+×Z%wœ·Ö.ñ%´�!Õ”ßwKÚùݳüç¹ÅÑ:FŒw¶xÎeÔõ›·ÂµûŒï1¾¦wƒô¹ÊŠÝmíw¯*À‚®šöœ05þRz"U»•~)®=íÓŽq%È�U¿‹v¬ÃéúF—l¯+º]ä:æ$‘Ýâ�ð= I×Vµ»«ÕvXMl¿=ãëVÛxá;‚9j/Ä Øb[Á'þO f>À€î=ãþö”˜}§yŸ•É#é«k\RuR†˜É8¼S>¡i²¹ÑbZJWZç9ÙžñÓÆ,†ï—ηݚ›¾s€TÌÖúS­´)cÏ]±›vrtÆ7ÓZÚZ�jžJs ‰‡¡FK.ên¼,nîåÁ'>.]ªæûY)ö‰ý곞'ˆ€·V“öÁeÛ\çüàE ,”ã7_wué6§žEÓ&Zö¹ÿí¯Ï«äÒù匑ð´:N»fš$@ŠM3ïO./c�ûY#»Þ°g“ÉQ:cƒÂñ¨ü�µ† ß}4bÑÓèÁròЃL´…ýû¯�?o›]@õçÝ(K®×67ñÍdú~mîóYÖ²Åu˜�H·ðrbóÂ*ý_ÖÏïÙŸˆINšÑñ.™ûòmSG\ö«pö‰ÏÁ]égeͨ.ù/Á|+]v—ý5dWÍ|ÖÿS MÜV¿œµ±v@>¶ ó‹Üá“Õ�x“Kz~ÉŠÚ‘"iDm�8¾A$ÑÿsÛ ¶Ü»Ó˜=#NFó´—�wæ§ Þ„»ZgfKt ’r»r‰¯°…kFÀ®û¿÷af£]ÌT�U Mï¡æŽr­0C½Rj%²:óß÷v’ªRóß¾$©B/]ƒZx-â1ðÐÈÇ‘=CJ­îSBÑúwçXÁa^&Ú©³DÒP©¯wŽýµ¤†–"'»ÇÞªsŸ—›¤+šO4¢„†\z ˆ©¤. ôS–¥:àFÊ!ÇŒ©�“´ò{jT*±{EÔ,œ¢žÇÔ¡Ký,¢ç„*«öœNª¶: 1ËN¿ ÉÑH*JJߘ8 ¢µž»ð]¸�Bå„9ææ©25uˆ]%ÜmWŽÌáE.ƒL];BaªhêÏRÝEX©UBQéŠ"ìå#‡ÄÕÑdf�]â¨Ç ]ݨûÌŸW3t®± 3:kt�2• îùÓ<·—Ýs·Ö‰:ÃDÁ„F g>²?ŒíCGe³lŸËÇãOîÇ3²®_¸Œ}É?ãQfvH¾äÒG:3Dmž Ù›êD¢Ñ´j­ÒY;{(8H«3 Ô˜o|d&z]=ÀÔáˆ:Pyy-rßþFôÞèaÅD´ÛŸÇ¢ÐŽG!Ž g8¡A KO÷½ÜRÌví„õ©IîNäÞÐûÙ…Yò¢ü›t…°çÒ[ÁćžýMú{ZÉÏÓD¿M=Ò"ªô=OÂÌe³*.ä^)XRºŒ¬1BWÍ\gðÜ[8«ß9·æC4q —Q\âÏð®6i³x+uy¬zÄ=3ùÔ ´GkÎå¿1œºê}+rçÒ�…¶í·Üûpz÷Ï�//ó©ªò [ä¯xºN®­. ø›ãùbŒ|;/™V÷šB2uß³=ÞuôÜ„…Á-Ñï÷&ì ù\ÀÎ)#o'’H7kU܉MÔ€æúxz–Ô+�ÌÃ�»%ûhûSýéD¦�ž™�'¹džKý ÖŸk€ï­oî98ÿâ¾Ü×…¨,¿ÞiåƒO†§¿ †ó»¶iœO^Œ‹òóÈ·™þ„»YgzKô k M¸mÃJЮ!Àtú°^Œ¬{9×´w²A·ÇÐÏNçwêÞÚͪ ÿžOpbêú™¢÷;w­MÌðÐe�>5¼Á�væC�<¿�U�÷ÇÃ,�Šf·—}H­»d…º×öõÇ.µ&S9!;dךYUêpï�OíɤUzeîC9w&4¢å£Ù)�¾äpt•ãH˜¯®)•êôO=×*�êU*IkYëY§–ZÛù@âÚ™¡fUQhrN yu’È~h5è”—B!Mϯ©Â_Rëy¶[kÍÀÉ'Xª"-ĺä¨ÂçvëéÇêß³´ -ÔF•½¿©I SQc—8r1e–*sM;NEŽ{^GíŠ2×ìb?rªÈת "�s™Ð‚ãÔk9&áSB«¤@ïAm‰ìN�qbÏŒãsr84çÓ©µ†}Vítjv•Ž'Ú©ÝÇŠÂLJ#5”oÕîÖ³rG§ˆBé&d6 3~¦?ž}|Èóz̶p¿ªzñe\¶[è�øùÖ½Ÿ{?—žè|>’…õ4‚=ŸÌÕO™ô0]˜9ýDv²¾|"»¯bzÞß÷Þ£3úŽÆ£$­4€2|'amRMÈ«ôõkœ&0ŸŸ»~»îLU‚õëÔŽÚ½9ô=zÒ�¸NÇè ²âоˆÏÓé…È¥»Q/,Ô’Ù�¾2ÑúIÈ¿Eþ®~_âØ]_ö~°,:0Drí¢©ÌmÁî*±¯ëá¾î’4Æ÷»ö¼Û铆Òoç¢'6šÚý«tŠÇ9÷ÿ�ˆû‘ôÑÉ!ó�”…}*÷È´qÑËÓñöyMßZŒ¿ºQæXãò�~ší÷Um|÷?Ç'ê ·¬I_ªãù —XÉÛ7µ?xºKK¬Û“I×iëjz–½¹ˆà/׫iÖ¿d·Ô�bÍ;}ò´þIƒŠç”ùÊÒózš%þÓÊx—*Üb÷{»[›�„ÌqÎâÅÖc•3K)´ƒÕ|ZSuì.’—e•ž™¤Æ–Þͼµø-?í{š±¢íçhï¾ÃŽk¦|ô¯"½öÿz*EG†3«6~Ü}èQ'îùøð¦ÂËp=ËtggfGÚ˜™§&ýMû�<úŒ½~~"­îÇŸHv…ùvKÌUp6*i¶!§£ ­Yünì®Y�ÞC8Ñ·]�šúÜñD¡ÙÏÄ®�LûÝí®hùŽ4—7�͈ÈŒ[,º �½:™²Ox‘_?f-lYO𷱫»â™~ש¾SnIÆ|‹ÊëÞÒpù\AV3Ϝߔt¿íÝ·ìß@YP�n=™-$´u‡ƒ§ßlk�ñùŽR‚m=±6~Jßÿý{ÝÖÍ%­dïDe™ÿËû4Üë)˜œ‚Êõ½Sµ:MÈ{‡(mܬ>Šbãq¸3ECª‡,_‘Nˆ¢kFo_Áà ½ÿ{õ�®¾P¾‡¿¥ÈávYB×®þì>JeJ¥?øtò`;ÕÍäS„†¡É¿…DMnõ¡a¸,fìn¿²zì÷d²6U­“]ÖźX+ö U®\OggS@ùô M@ß™ý}ÿÿÿÿ}ÿÿÿÿ‚ÿÿÿÿ‡ÿÿÿÿ‡Þ”ÛÉKê$˜˜`*·…×ÔL01Ã5æ öˆÖßìè*ZE¬ @õ»>0‘Qju/]¤§ÄE3\Ë3_ÿü£äë@¨¤³¶¤ D¤Ö)ô,ÜK^RŠFDgíʺÏN¾•‘×C°;µîf=XöÐc(uˆZÓ£FÄŸÐÈ´4•ìGô¢ÌS—¡µ�þŒ�…�Ô®SïÙ ^VjL‡ô±ñ¢»ÜT;(.U’êÕnPog>þê ’}{m7ϳÝ!ÑÈ”¤#ž)˜+ˆª“ÅÕa— ®!*ßÐ*s;‡¡]GDÄQG•(ÙJ j/KuȉšJJÌG´ÖÖ专q¸ÀjO­5èžB©Ù_¦É‘.¢Š„Ó¢E‘ºŸ¨ {6ù—ÏéZÁ=Æ7g{³Rç£û3õóx� ¹ó/Û£þL&.•ŒCègîÏ”ÇçáoÙ2îçÞÄ¥²I™Û79îüÞ¤NÍd†Mç’NHˆ“§E®_rsEÌ š÷U!¡E/¿É]½÷¨î ªßxPÀÂPÈtL5Çb�¬ U±©Nêó•SW—‡ëù'>¼ú C0Ž3º®ð0Uøú0L>F1òÉ¥ŽÍÜië�`LysæP­tÍÚ üJþ«O ‹ó•pÇNJkŽ„ÚÓ^7õ½·zWúÝxüØŸœ—õ�æsGsRjäùÖ×L[L;ëŽð]…î¼ô9\¿:ÿï ÷Ë"V‡�MbXl�öÕ—¢�¼z¤à ÂOTÇm˜UbçÜ…?v3ž¸'üoÍ a¦8áô}Óçcï¨öëŸVp4EeïñeØÐLv´áh ¾¼¯ª‹IíÀÒý°·4hïÝNîË2qš5¾Ú»Üòú¶o`§ü9ãÌþ áÓsè óÇR’™-“IÒî-Vtõ‚9bÁC|]Sn íºdÑ}wú/u¹¡�{†SêRPñØ ïQšÓ�z^\¶éZ='m7¬zó÷ŽŽöÉ…¸ßyã¹öEß [W¥sƒI±š9Ηxˆ—YûÝÃ\O+è ×øØƒ?3Á¬øów÷Ö^¿4Ïã“ᰣϔy-å;¿ÄìEÇ‹ U^ëv,í¹€>†ùà7PiõúÃÇÄÞFz8ùò©8)àsúUnãóÍwCÔ^q–�¶q2�›È«¢Ùz,«°XÁçÇîøô ùVÎn8TMqËK± Å„�°ÛMè·�‘fUÔ50WéI¾eÝlÇòÃL(îTa𾮿d¸ÅÊžB2qßøûøo °<Ï’¨ý6°”n®4ä$FÇsûýÓÞ±õ ê�VØ$=',[ívÚŒZúV�ÉõKß0E§ë@~++:6çQÊå+¯89³‰½@]|ôµš~›¥!ÜžZ‰Åq[ùgÅãÇ{{B¦R¡ÛöÊK¯¨ÍToïöq[rS‚‚ ¾”;ùmÚ*0Ãî†ÎDT­ ×RÂrvíþyßT©á¨ËPqú‰z‰}=/�Òo�ˆ¤å?ùzÕnl²¡}D¹‚Ð̘iàѹ‘‘ ’;]cÑnp ²Dÿ³ú{#µ²D´ÔZ¡Ê4 ­Ó×l*ÙZûœOÝårgiÂ[kñ ú‹ CêqÖ©N¬"Úœ"´¤Ãõ‰DMº¥^A׎"¤î2Ý2|8ù745 ²T¤"ì¸�ðè-¯š´£ùÊFd(¨Ž³œ|4—0õ©ÒŠ· {Ô*!ߪB�C%$K'ä¼²¬4ݵ§¯¯²³é»Ýû\×½F]Zç]”Êþ C�t¯A“]e½´³«ö„D¼JVêóvI�”Î}™£Ö ²+G g¥rT8´Éß8RÿËÂÌÓyÂAQœvíE²«H¥µ™ä;;sÐ)Qs"ÈîÈl=aí3Úuÿ}ôsá¹hжB%­ÓP4œïâš"îg>dkù<>Šìø8Æáú®µãJ§p@[S;�ª°g “>æ³ óÙ¡ù»ìêu×Î×%½(¢ûÑ8þJ;‡Ò�^òлLÔ±u=9�š¹èµe¶JÜ„ìÝÑ;£ŒN¶M`a(ä& ”ÅÈ6~»WÆ\#ÜÕ¸FT@v·pǎ׆ÿÝGÅÍ0-÷þðlï)|зÕî»ÎÚT8#­wÔÀ¥¥Ž&‰öˆí†Zô­éƒ#ˆç�ư½‹ªÚ@Ø”«¾Ü¢Kšžã[=n.1~ú'1çÓh”ÀéaF§ÿ ¸µ‹Gá–üWÀ '•‰É¹2¤ú{ª`þ±ã´s È•œ÷Îa¹¿uÀ× «þ=Y]´XÆÏºN8Ñ6w©ÓÕ‰_‰ñ~4¸ËëÇpW®,Ó-‡.ÂÆ&æ)õºzwaèó x~¥]Q©Û›TÝHó!ûÍγ†ý÷c-�a¿ú&»þß¼?\E=lí�Å�ùG\jb Ù·ÛùâœW½¸cczÅÙíÿ¼ãõ-&_Â1dÚsšrúºs8< £Xã&Ç{ïø½Ë£ w˜ZToû¿÷è‡V“˜@÷Ô˜KN½½ìùî{^,wUûÍb³'>÷KáWNïj­ÆÎz�|c«ª»ö3Ã.#‰äKݸ2žÄפ]°‘t<6™N\މîDãÿ X ííZn~.Í¿ÕPÏ#µX›4?ü÷^£1UÊ [˜¡Ûè¤ "É3~/\�³@ý…µöѧÌß 6Øœ¶YÐü² Bõ;]­§�G¥{¡]qOëxƒî,˜Þ mÏ|ƒ¾EeÕ˜gÏzà‘S� ±¯ß|iïîj©{òöüåÒÚ›ÙFê—�´odâÿþö?~§¡À½üUîðž±l}ùö÷°Kõ��'|°yï‚ö`ø;¬•ǃôDÿ&j‡¿Meñëôç€ûÿx?Yé,.ûÃ#b×—ÕÙ'_G�Å‘íw�QF­T[µ­ö?†'¿‘¼ü*ùóÇš{@(ü—?T¶ygÄ~Yý~®”vÚIF:4®ÆßeS> ž”;ùmzKÐ@JUîŽÎ´Y¨ Á5fÀÔŽ=Ø•8i³u€|/¸Vgv?ßêÞÉêO(ÐÇòñÇÿöŽNe>»y<5éšQÓRxAñ„Ó‹ÞZˆZPÛé¹ÔÎ/àÄï¯Y+YÍ:ѵEœ©µPI’_çë-× ¨YåLC‡&ùÎL+:$+’·�$û�rõ»Ñ9×Bè FíP ÌÂ# Ò {-2²$UóÌ=âñêâÖ’F+éÜM×¹F"5zo÷¡®$ÕåjÔDÙ[Âè@Bb"O¨2…¤DLµÂ´©¶—oèœqê µ5ƒ¡;¨Uu.áx�{ÉIu¯ª‡rWâ�¬ZÀëSМ§é9«Æœˆ,õ$§þê€î)MW-¢2iíÈÈ~kôú8~Îðæð ¯²Ô9©*Ìq±Rù®‘8]é ZÄ¡-½«üD‚h‡“BÖt¢2RErÑÛd>SdŽŸnRD-êE4Í_#*Q8 å¬M­�èè<)tÛ|‘R§éOª¸æw‰È㦛lõáô1ÍÚdP½¢#e»å9‘ñ¼çc»úÇÁ‹Ð…é¦ö€‡(AùÀ­¹  |õÊX»2Oý´Û)6øÚ5>µ�¤¯]—ɈkmT—°?θmÝü¬³˜Ïç"%_ÀŸŸ`ÎlM–Ê«~nŸüßá óõ×µËLs;}aÕ$æ~Yu½TŠ¿.öÉßPÞ[S~žw4L}ˆ„%ù%Áiùè·²«kqh Ö¢÷ö誀Åè®N¿fËyÏu<1ò™Û7¢û~ÏÇ/”ÍQ·¸ßÕlé°H{Ëó¡•ê©êÀ[5ƒøq}áaººô5šÆ û£çãî;ëLšs¸‹šã¿Êe*sX91Küñz©F˜Të_äŽ:%¿Yt?ÂêÂëJ‘�æ&Qöä­²âj fec �Ç\ O¤¿¯d�¥ø8iRy´‡B‡Ýr„ån¥[0iäjÇj~nëïTIxçêâ¾Lº%’ÝfáC'#æ šëI)§ñ1=�¤™‰]É¿X¦]Ñ=éàŸð`³§ÙÅ`wÝ/ÂÞ8ÝFßêj÷̽ÙR Bªó¨âˆPA>òv麯kÀ,ǽNZ:Rá�\M›|£ f+ºˆÜĹ59ÖØ…†€p’é�*ÆôS}nQW7ÿmˆuiÝ•„KRóžKÔ«Ò'À ä9ûîÑ3gSèŒp3æ; ;¥6hFù’[NŸo2»m4"�Òù“ú£à{Ëà+ç•l”3ŸÙNäï¿\z7]ÚNOœß*:.ßó Ÿ+?“ÿW2ö!òÇFK¾äàŽ³!ïÚÙŸiÜädñr®{7ª]”œàݺR#|ú°|ÁÚ(MSá{´®;lLû÷¹o !áå*�5âõâëx}g¿÷øte Ãqa9ö¥u·3|¹ÍôÃïèí¡w9¹sú½ ot=¡÷øi�„ý*ù—{Ÿ=n'ÚS"¾×³uy"kÏÒ?¯q _’õ›{¥`¾MøüMÙ¼Ñmlµ&ºbUÙÖ _-²n³ÿl¾”;ùmN/ôÖp„[øKúIP°à ˜ZþxØý¬.T˜Ñ…Vˆå¦§à½{î·€8¡q‰¢P`HgzÍ=#óÜN‡~ÅÜ kë <äÃÈ×,<Dn’)ê!{9Lé¬H‡F•ñš­-´^Z©2DÆþ"*NÏs$ÄòùСjçµfäÌñzÄK¡s®sWpj'df±‡~h¬D!©´h ¡¯®™u!s:ó啤FL.(8e:œ�ôAA|Y3‡êI›®DxU §:Pçu~º"Y› ¤VZW˜Tª_êœèU鮳s´€H¯“¢Ò/ó”±y8‘B±:¨SCÂÞßo¼²Ó‹hY;¯#_‰’ÌZû;‰Ð“ƒ]‚¤¨Ò) Ñ�Öå!š™z@ã8…›"ÅsÍJ̵Ÿd"’ƒAœL²VEëY5yº‰9kÓµf­!ó®EÒ8»ˆÄÌõ³ä¥Ù÷'»'Ûá3§‡§¬¼öÏŽâÔB:éî9«!HQaÉÄÞ#��}ûÔ8P˜ˆf���Ç�/‹L»éB(á©�û0ã^q||n=óAçáã!))Rzñ«½Ž-�òëk¦NN²ÞqÆ÷ºð¢¾ËÓ†ªm¹Í§f𩔦NÈTYúíh¼M£¾Áì†>„ùO½{w]_W?_Mnß_2ä�Åd1;&%ûð3îË_•<¦štþ< É÷ÒU)âŽ|þªx+ìɼ7§ÉF½;Ž‘Qz~×;sßúŸûãýÑЬO“ÿ•Ÿ<òIÓÔ§ ²HwEeÛç5ñq»l²äû’7j1µ„&¿̽§Aô†?åyÁÔ�¡Ys(^Ÿ$íQ)ˆ‰Ö2-Ûù„Ú–@°òažkäÜ)©ŸëØu73X/›£›Îsþµ¬ü"Ο4YG6W¬ Ç5™OêF�Š.zk�z©v¸^Àœ š}xÇò?¥›²è[ÙQê/'~õNÅæd&Uæ‚�™�F§Ö~H@ÆïÕq‚ŽØk¹×J§Aý¹:‚#гR‚ÈT3µjMȹ‡Gúgü~¨ó_­Ÿû]ù;2¥®ï_£ÐÏÊ»=GžóÇuŒ Ø+EÅéìÚ§I`g žˆÕÈš]JFçö1Ë‘~$ÓŸèöKÎÝé\„ëgRæôjñÜÇ=y.©ÏÐ]3{ã8ýhšàé>•œ{‹'35ôõ ž5TRà´3æ®% F‹ª®ŠS�¹±tï£HÖO¶®ÌÍÌ·TlFoZÒoÝ ø³ÅÂ{ Æ:µ’œNØTOìjyN}%ÒfÇö¨¹àßÝBî»»µÛÌyssá4q™Þ õeµÐ5Ú½”é€WR*MáŽ�nÝØ–Ú÷ß©-c&¿86Š›Æ ß)ÑÇåã˜mYäß6²ô,mù˜û§_©³Ãû=׋=.'<.7¿&Ó.OÝ1-5ë FGc'ì ÿ£é?s¸H«›õ �œU¹·< +!ÄœðºÄ»\ŠL ‘¸a+¥8ÞªŒg¬ïÆ<'}ÉÊ„*5í•ÿÙQs¡¡o£~õÕÁýš†©ÙúUá‰{½«åùãiŽã–*õÓêè½fßåFn½ù^zvP%/¬‹õ¨qaGÜ¿Êÿ`¾˜€¾N{acAàªìjwG�»qÔê¡Pnb|»Œ·Úlñ�Ú“/‘»ÍÂÁ¶ß1¸óù!¾ÉŽW†_ËÝãà.½¯wiªù2hC}Û9ôÓç·IèQ±¯ºUÆ2%r²ú¸š�‘{Ñèò'ÓÍ9®à¶Á#¹�°Þ…uaRlÝO}©ÛU–gIã‡Ê¦È|×c“åÌàÿÎUP¾ï—w�ƒ]œýb­ìè�<î–?…΃z™#'’eËwø¼×£Gä|– ²|:µOv÷åÜÿ8Ô�á9µv@7Úº_0�³j%Ñh¹Swp,鹞Re¯g�_ýe_Šç˜él÷Q–ÊßçÅMwÚ;«\löšõ÷Ú™*@‡Á1Ý�´×5&9%!Öpw5ž¹Üv�mYm­IY;U’Åh¹N~²Níå¯ÍÛ]äòm~73¾Äñ¿ÛzeÛ/ÿmeT¿†mp¾ƒ``sØ}‘.cªm˜>„»qs< †&Üœñ–&’à õxxõ·'�S+Z[¿¨ß†y‚ß”¯l¸@$NÍgÝÊU½Î.Gƒµ�<©ÚµÖV˜�D‹OØx_y?¨«PÊk¨ )5ÉÙ[Å=+T &‡u—Wô[+8éh Sª�éKÖ¥Vu+­­…~=rš+YwŠ£‹¨wÀ!u©:Ô�‡nA—Œ#ë3Ýëd�Ò«~TTÚ‰ž;"fæ@è*­ˆ¦ðïã|Dפë^çyŽnVS;‹Žk¸âµjs•‡²OtGu”<4»ܧß38T)ð†ìB•ª¬}õE¡’Î;™Ù4KwψW଎KÊÄGw¡1KT¢Fdô›Ç¢u’ÐxÕ�Õ J P9;ª0¥V)ò�hÉÖÚÝÅêTB =¨g·8¯M�šbÙ“T©¹_]vwûM˾¼_,Qƒ84‰„ÙÉ—ÞAQ¹wÍP‡Ô™‚v²"Ôwš*-±ãHmæPQG²ÒùÐÔ¢ •½�Bi�C�£iq8ŠF¯Ï=ÜÜ‘>~<Ìñ×�Ø9¦Å=)IòùØêãq¢‘•' �}ÿš@Jö¾¢p H•BÀI8oSªã¼”é‚m?s.ô¼¹¹,&¶íP‰©ò±Uk»x»˜ÅÕrÉ’ôl½%òÿÌKÏMÎtÛµ˜ξ¯¡zSò"b£�´Nü¸0íi2…d/¼øÈü¼ël†Ô·XèZÛ?,Ë#óŠàÂyLRdu=º�š ¦·2Z¾¾´r„jB:A;�Áý­Žï�àw’­g×ð®Ò¸â³ûþŽý�!¬ß÷OÌþ­¢›Õ¨fÙ~Êsšy5H”ñûé^d¥ËÅ…�ôŒh7®dÈœ…èO¿ýûÅ T³aŒ¬Òp®ïðàÈ›Û]€]å'’ƒçl~”FŒùˆÑÂß9±¤”L—b’h¹)ïÿ ;Á„„¾ÇšXý»¹^Éàr"xaõ}µ$¯!߉Ø*�µ<€7þãˆY—#ïÅ :h’äzxm“óÔÖêåÏŸïKñÔ˜I{7÷û¥W–uœzê 7§[œ&Ý%Þ΃�M›ÙÆ™S]¦ÀéWô¸ûMT:Wæ¹�>’…iŽü[á(ÿ’⹤ãiSÈæ_‰Lfß<=o”å°v‰‡zh|´Q·£½Ûý“_Ãßç9~¹<ˆ8˜ynìMx´WY\»› ZõTµK•W{³ØïèáLÅÍ·ðS©mÉÉ_ªÂF©ïªl³áìðߟú¶˜ÌµÚ{)úQî{Þ Ìö»ÐY¿ö…’Oû “n·Ùj�ar™½rŽ Ÿö®0œõÊÜ}Â'¡4=…¾(o7Ĩn7dtH8B?ñÜ6–uÞ£… GÙÛÄ ¶·|j%_ñvüDœ •Í(û©ŸïY¢—Pãý°‡kެvç×zo©�”¿ÿ'*¦ÁÞbbÓÄ—×{;�˜Ÿ8_Ùi—8dì9þïÖ)q<Î.‚^VÔC8›N~4'Z˜Ï !ɶs4dk×,oT7ÞÀãBŸl¯Qh¸ê3»·^”;‰#ô4á¶t_�` ^€¹Þ®î?üp&ªƒ8ñµRB×úÀGE>²‘àô @/Èk¾÷)s5`ž�Ô9ÞÌO]xp®ýù�/Ð褃Œ£©±ÖDÒ¥ÊZÖꜵf�Räj¢Þ³:}=•&ß÷hÙïS«d}§4Sw<5w³]* ’:åY’QdH 3²>Þ«®Ï§¸ù\óè_é(9sªs3*?B,d:Qe‰WßMp£fí}é9‹º¬^1t×ydG,qˆ£Qé¯]{&åš#˜dÊö`æˆJ6}þT³¢¹î“fdónÑÖ¥'§€Gç)&!ë4 uBžë¡©rÖšü.³HÄQuŽc%U͘cš‹Ø[~Ÿ´:¤5ÕÙ‹*´C'õŠ|M•C�V'Õ�„äŒÁáÆ¦Èàý 9W¨ Pô�N‡†§ûg¾2zТk 2jÒÚNM&�O‚@ Õ‹GªÓh&ˆ¬ƒ(õãp'OWL·ç#éx¹ÐL‰úókB“Ô8 Eµ˜„zT ôÁÉ}§fÆ^i€€lò˜ÓëûÍ1ƒŽøXþA™ÿ>U®Glµ&tŠÆ™«ƒ�ËÖ;0*H"Sj|þ’¡°—lq’�êz+t“–ôNS‡_I÷‡{OÁµÇæAŽ8ÒÖgÍCP©¤((¾f‹p)áÞã íÍÌaÖ…d÷ìÑ>�]1í�O¼‰á ø˜Ý!”®í¶äÎ}zY9ÓþcXD£ÿSa4í?1Ž÷Sý¢-úXGçÌSw“„¾ë¤!㥹Ÿ¨ìZõ#Žwb­ÁÇו?‘t3>ýSñ·ÔqýÜ8f¾[p—£’nð�rOXÁì œÉ+ò¼�{QßTÙ_oï§ÅÝÑGïz–Óï¼bò“m½Z�æàrŠÿÒ¬«Áþ{Q>'ò8ñ¸ûÀ-ä5"7a¶â3³âøõPÎÜßÉo€–“U"�ÕÉÔÜw�~#'Êvìãu�íT÷,<òg» ¯{ƒ®БC‘qcò´ÖsLÚ/y² uæwygNÎÿ¹;Ó}è°©îõ� Y¨©>ÄÖ<Š©JûµÞÉßUjßÏ$µÁÂÈ~AiG¾G.±ôJ�-ROnÌ«´ºNÝó)ܬÎX�¾�øÝò‘d«Ó¤`ÆŒûá4I…À!ŽÚíDsV÷ê[Û|ävÐ OtÄÇ9Ÿ2Ø>Bûõ³zvj%±÷(¦#ˆº{cfÓâXËX;þy-Ñ®4’‰uTK篪WÕë"¸Ä“ÿ)™}3ÞR¹äY:ÛÚ4éÃlÝ íŸèÓÍ}¥ãôl¸geùå~&óîÖ{ï~¬0ÀP×ÃÖ¹™.¥o×ûÍxéE1;>¸Àˆ÷tËÈmÕ©+\ì6bÇϲ6íç|ï¥v©­·“-sÿã#ú/ùOnùëï }´Ù�½Øªñ…qß[/4ê]åñšv_“é¿#îS› ë Ên•ø–Áé¿‚æ£NÁá |¿V}_5Œaw öÉ_É_:)ÀÙûޱ»¿J³gÊ™”;ˆ=´ )w€mb†‰–®uK¿ñÙ3¨5:×{ýe çWqÆßt ´ûÉ €ß˜NÁAKà{+1hGQÐCäÒðP=½Ћ2Å´3‰BÒI�sµRÀÔE­¶ùúçþø0$Nü[Vÿq¹TÉt©”{F®Î�¢SˆÈýkîÒå\CDwo¦fÔ÷A;äT�OrÊ yxx—N…†’2Uç÷WGH@ä‘{+ÉÑGóÖÐóXü~ò¹úúHwyÖºD³7dëî²w¼V…¬]÷…;Uk’¢•3Ï:ÕZ?h ’Ìô‘ÈQtW¼šrÏ—ÖJ&pÈ­‚9åäX RzŸ«£/Ù„‘š5´S¨ÁKeÏ*s�óqŽd€`×È5�ÈØAÞÅ|ôzý¹§Äi~)²Ž—k¦tkgÔˆ¹ÒïumÏãï&Ï1™ýùÜVEk倄D¾vµ˜'ÕÌØ“à go43~fà­"5*79"Ó¡@Ìá¸,×Kü‡¼¯¯ò™_ „ãK~}ý;HOU+hd ô>Ÿ§Ÿw䡸sgä³èFcªáP¦Í:¦)4iô®Sëƒ9>·C¸rø¸»çxŒCëÁ½8&Ç4ÿþÑée‡ªÓ-¡ž»3] `HøÛø¾am£±N‰OjªêC~¥‚릖ü=ÝVµ�6}ü–~D÷=ÌléT“råØ&š(ßQZÎòƒ½q­™ùÞ\©ôôÕ=xîÏ&®üCO–ÍËV¶‘#=LŠì5�¯Zð_øá·ïcUùºàŸV}æt{ïŒ/ܹ—¯`ß³Í=V€Ç‰n^¶‹åÙ:Ï^ì©Bë³Ìü« µå�pŒO¡õ½ÛÌ“Ó 4±þ"¯ ‰?Ô§4!×.Ñœý9ªÃw±kFšÍ#Rµ$ºÓ-…ú‹4ÔD½„&SÐcÊ‚w»ºê¹½g‘ÚÅpg o^¿~ÉüäÐÞ<ù(ügÄåªñíÅÇï!Â=œ‡:ÔŽ�JÇ}ˆ’ýË׿o]uc¾w÷�®K '½ÌŽi–ìŠÔ‰Ô”ϤcJŽ„ú¼ž–©@÷à¡ãò‚FÀ1T‡ˆp{OtŸrY¥¦û¡u*p”˜´ë•d’zž5²VÕþ íèׂ5jD­%rÒsWóœ™-]ûn¬µB·À�š{Ù*¿»ÊÚ­Ê}U ¦ÄÑ#ò#œ®E¥;v2¢¢s€våPž.öPÑsŽ+jÕ$úškKtP[ŸN2Ô‰¹ÎE+…2 ‡Ò];ß Í#$9';*;¢G̓=çˆÔhéiÿÜåýÇÙz8]÷Ä p”Œ¾f×–å�™ùï�èUq"ƒÙûówçÈâ|M͘C�@­þãfêéÈ»å„3Ð@Õé0tÈäFwwH¥#§‚ î\ÇI͹‘;íKíó jf¢ŠE?I<Åž@‘mFb5N‹¸ù&õ=�9ÕÆŸsör³G®½)h!ö}öJw8öüFDËý×ï²õY·å�ž›ÄŸKÃÌ1ÿqcoèU)ŘõûiÑßSGPÂ¥ÜòXíeøËL¢%O>¢%¨ðíÕS8r]4{—UMÄ C×ñ;ÁÐü÷@i�±$»–5üc\šwúѵ”ŽZOc¦YÎ�íÏ*·x-˧Â>ÕhSÒ ¸®ßê8c¸½Mx}fGÃï\úpÙ= dßMø¾Ô®åµ¯{¼ý¿\›ø åa©Óí¢8îJï9Fø"“–ÿèD•-¶0l–^õF³p<‰œ.~—O÷;è"-^SdUëz’<‚i f0åc’ú¿úUóŸ5×B{–ÛŒuú…Ÿ¿ýRi˜÷ܘ·;¬ðáy¯—k@Íó{fªÝŸNBæ¢!<éýߜ֎~ˆ*9‘¸RêL&ÌÒ� ¶ÇÛ½Ì ÝTF¸ÉÂ~ìà—œZßá^»ï\¤+ÇójÖÃÉ Ç_8Ë1Ã_gØe8è1øKîÉœ4'XõP§÷ w.Í=òOëk®|‰ZÞ ÷`üZ=Õ.Ö?Š,[„‡ôaO—]´ šâPH@¸ÒS¢a¨–âó·û yeö±›mÅâ i<Úÿl¸‰ëmK�:=uªSsþÁê÷lš³êÉ8s…µÚ?�ÿHÈ¿ue{ÒèwçMÔó÷ðx�«S†)¦Mîìîµñ>÷¡ÀÑRLjíb%–ú+Á' ûÃFÏhcëByÀåçÏ‹cÒ%UŠIÃãW”-5’º¿þ6ØÜÕ.,>¬ï÷Ï8Åyœý@ëo'éhþIégÛŸL÷f§Ež´\"Äzþ&\³÷Ÿðµ,d>0.ŸÂ3ìÙªwÍ>á�=ŽtûÜa1®�ñ~Ù)8è<¿ +Õ�g­ƒž¹�Ë Ñ¬? §§v*xÒÛGþ÷Y8ÅkÍ�í÷ˆwÏĨ4vµÔ\ /-t’‘¸.Ù?L!áoãã5ºÖ¡AÐwS¶¿c¯?“�¶Y ýÛµæéó&�[¡VB�—l<òû¸è£«{ú‰ûŠx¦>,Ö\Ÿ‘ï÷ѹåË2|ØI~þ ^Ã6ú‹}Îæ\‘ÃÈ�`×íBÿWÿQSdúíÑ�ôör™À,¹pÄw‚R²ÂÂr}ùp«‘¡¾Ðˤp9Ló„)�Ãæ>Ü+À†aÚ;Ÿ2 ÿÞÚóñmr¸é_ç†ûì;ºÆ}ýSË2›T3ʦûIn{;÷�ÙOìáÆ÷K~Ô.¿íew¿»ÜOѰœM¡ŒZr 2qäè`MÍN¿ÿÝ`µÆXÝb,C>Éê÷Ô­}I‡…sm¥›Ž»á9eÚ[õ6œ]šÂ�ü¡² #ó»f¤»o«š\½*$N¦÷Ñÿ‚ÇŽ Éx¶Z e,&í·wUv#Ý|óÏoóò–Ê8J6q%¼oöž/àTáDéšKxHY…޶h6qå¦|�…?œn_¸TàTù^Ü“CgìVšóScó'‡ûgÝÃpŸunz;þd3»'øh¤So¾áõ¦Wœs#D\�„Æê±.¯jn´¢'&Äý*A|ÈÏ>„»òkZ%p”Û¢#­š‚ ~jœ)Ñ�üóÚ ,EïÄôœ×’æÕ®R�xJ�a"8:õ_õè^½Ó€«£¼.´Î¡®/EŠªÜ¡®AC\=£³Ô!êŸ^%rŠqŠžSYgj%3k:çJZõ ZT ‘Ô˜ w7Þ-G?3ªµåÔfÃù\«FÆ\�cBu^û›H¥JÄ1ôet)ùîÎÚÑÎ1Dùªì©r¶¬rÞÓDÊ]Zz_—)qþ|cŸÇ¾úÜWaqd²½Æ|!ªh@FÔ ¥¢TÂi¾V}™‹š¯–5ê»jÓÔrM|¿¤cޤMoŠÔ]®¥§xä«k=?j�Y£{W4w©óêÐMçnP×ø½¶:duH%�,px½ßB:wræSêÔÒ­šÌ$$J�$ê„t¼ ¡‹¼ëRsqf  ¦Ž~K‰¤ISq&q”–¡ž©«¢‰š}€›MöÕùüøÐ}=u²‡íãW¼~óH©TŽ,:I€EÝúñ0O÷�qcÊN'¢ª�Nû7ä3cúÊ(âPèð‰4‡Ünt–Éãµ?‹·¸„¸}e}˜¨ïeù; (Ñ8RC·¶ÏƒÂtãNU €á$òˆŠÖWvZÖÞâ*Áv`…{·2icyÂbƒþZÞçFˆ<·Ng|M��T%÷S£î‡à]Ò·;å…ÉõÃÍ‘*ñÃÕ�Æ;·Ê©ßøä<™Ê9÷Ø}¼y7Á“·'¶¿ïÆùbp«½½.Ï&± :·[á\8îâ¼^ÓËÃvµJOñY|B�Š�¼]òînèúnuÔñ‹Ûe¼ŠÅ”keAÙ ¦ �v‘»Õ×è J3Í0K`48Þû>¨”F,î¿9nC¾*%£öœ*¿Å ÌäÞp~ïÄé\›D|ÂÐ@½^…¥“/"è9h\�ZÐtõ¶sv‘øð._5^„9öÈbI¬�•ûZÅc[@öGûe°Bê%ÿ_‡+ø ɺùâabè… Ž3…ö�üÔßT3úƒèd!Û¨óåÕ#OòM´@ïÝ2@Lå ;ºý©Õ¤Å‘î@§±$ÎéaªùTî-µñóáôѨ£¡yÆQdvø«w!šUwÙûÀ¦Kûóvn-š_7>÷üߟÜïÏÑaÛGŸË¤•áÒ 8²VŽ®èðJ-ºôiý#ÂI=W�ÿ;èPbwEc.WiôâËûæöêÇææ·jý Ú¸[Éìþö×­#C>>ñÇø ¦~RÜ/“8R0¿Çä'"¸nʛ͛yrRJ;/÷·XæZƒâXq÷�Ö¡ßRo·.‰3÷Ž_£^:‹W(çÜDµ™§¿ì§ØB&Ü©o_Qãfªšb.‘t¥]ºwñ´ËgÓMZ»ÝmÌßà£Ôý÷­s¦‚^xJ{¢Sø…^õ[ûhXö˜‰p³ÒÔ�àX>=MõÕIÚ%ò ÕœÎß?�ÛÐ^¯K=µ,ïãÒ] î‘@_\èºx¹‹õ]m¾¾à�kyet˜ǽ°ô‰ÒÖµ=F!cÔË.þƒ»Kˆ~p¿gE‚�´p-Ô!PG�÷oÚh­Ù‡¿TÇ>ð9ô{<½@…xÇìhJ‘ùKjÄZ:ÁÕŠ+E•w ­|Vj­óç¬%Y£sžÝPeî*„ä—C¥˜§†×Ë|©ÖJòÐçé”×R¥�«v’ÒW}4ÚMBCtDRÍ5�¨¢s­âáô�öúÒô0Ag¬B�/æ A÷)DB\ÙϪÚ)+EQ…c:µ–e®â¯>y©ï/[¿ÿ·«Q â[ïһܳ>¹WÖ,&]¤ÎÙzF½jÊÍKKùÔ¨3�Ù•èŽzD:辯 ÖGðRêå4sÿ’½…Cß�k‰Ð˜Ú­S­‡6M;µ½Þe¯YC×ÞiàÏÚC×ÀQY×NU„¸æ§˜ñœ$‚³$t¸’àd\=÷Á�zQ¨,$%ùw,GÿsW"îâ£øÎ‡ŽêLNvh7L�_%RkÕ© ”JSÕ‰Š8IÔºz¦õ(Rï‰rœî•!²Î5"ÑEF>y\¶Î»!*„8¼[æ_?ŒíáòÉ!8ý*®ïŒ{Û2–ÖCôÒcnþNèã’V²a–VŠ9OKĤ�QÕÏìüî;hu 0 gG+ú_;^ êäC¾¥ËF¾�½>�áAj¬î ƒ™6¡™èâÎ*ɘ¾aiÂ#�zžÉÃ듉YÍ48o³=ÁØ´ öš÷ƒ>A zªèãȕװîØÝøK�>6nŒ¥¹ñ1>S�l×mq#àÉi]¯Å�²¶`[D¯í8ÌónêÞ”âãû¤[ 2s3ÉPy©ÖÄÌ´Ë_£ë¨ûKtl;Ä̹¤, ùįU²Ô�xÖê~LA<Óϱ÷´’Çî¤Q6ÕZ±þ�ksþgw±óûÃobïËŽ­®í_2d¿>×»_ó½c_v­]îÑÕZÕø´ÂáAˆ]üBàJ-¥¬T”O»ÝsÜ¡7}�y&ÙîM²YSð;¿‰£ùäèÖ¼êAúÁ5Å.Tˆ\é"â¢BYiÖ/ÇÀí2§�Þß¡X³¥Ž_;Å)Þß¹æqtÙÕI2.ìl+¿Â1窷z‘͆ÌÚž³±” Þ(HŸ×¦¾™¿ãäOggS@)ô MCyû\iÿÿÿÿŒÿÿÿÿŒÿÿÿÿ�ÿÿÿÿ�^„{pSˆB5„;É51 €k– òûÌh)^3TûÏOòàX^>Àþ©Š�wøºw��Óu` u�ì™S´öR ^»ÏZë§§VX9wqzŽ ±ÿãÕy¯uuƒtB›E$Ä�žRê×£+UôD£q:{˜?'©ÅËÉxå«/ ö�L9E¿jï(;m’ó÷C³ÎM2z—®¢•æÏ„D]¿£ö…S5¨�yžµN=Lî¼Ïtðõ³ŠHEÌ•Œ¡¦“ÔÒÐsçþ±7"õÖ#R"»vAïÉÁñìy¼kLpã. ÝGR¬¢­tOeÿ}.–†–˜j�95‡ SdŠL²¾ä)‘Ù-à4‚§ÊNCÇç1GÖ2¨ÍìÔvPjÊîdª~‰-Ù3Ôª5{­8MBÄy:´ÙA;4ËÌ®7!] ɤªg©ª!°Ë’bv? sÅÔb‚çR=èļBD-‚S‘„Ô'º?´¡FDAP™ujî Šž¨)"dhÀQ ‡÷™W<3¯Cr©œ<zx3û~oEgÒ)NîSgÄþ}Qi#E¥Mq0ÙE¯ž‚£ö¼�˜s?©gϺ·»®Æ{é>g§ƒÍŽðŽS�†®‡Œç`Rºr°bïïP6î¬åz-£#ï¶é'ª'pi S@܉®ðåO˜l›ƒ´“[98§Ýþ9 »½Ùìi�=_ôßšf"ÎÂ2Îy:º—Ó]—g×ý-‘ŠŠ±¾²Õ;mªWçHlÄŒ8ôKÔ 1ë ÚÄô9bÝ=ú/5µöLz•O§òÒëÅio>�áªMd•éoãh¼«Í5Ëü]}ÄBùÃÞzÏú·÷élü^�ù5Pªž²�ùùV3Í–²­bu®Á¯^c£i/ßÝ“ÙçL¡8ÏüùLEè4†k†l¾;ßõÂíÃýW²?Ö…—vÁq嫈ÇÊ=÷å»ûGý/�†|e�¦]PùbjÏŠuü6­Ä4`âúÀ!Ž9L {),Ë˽iW=?õt0¿_Ïì›yíÝӌ׌¾"ý�@|Æ,rÓo8ÞdÓ… ƒ°¶Z?†`y°°ê¥ò•à†MÙÔ™bÏ`í^\bóê ÕÜ/&cÓ®3u“¥>�»�¶zþª“£¤À‹¥u÷=’M!ÎoàýHŸiTÆè]Ïž¡ÿ1oY’3cúй±IÜf»ÖÆw“6mÙäÏËb¿ã]è,?ÅÊ]1k,Çöö›Ïäßcîpþ#ÅÏïæ¥´C¬-çÛK±UúÕsõG·G0×§ÿØÖ"=çË¢w tlà:› ñ‡ÏràÔ«\7Rǽ—É”Ó=tÜÕP£{?<ïD%r+µ2¿¯Á.“PPã\ru\ƒV¸ß�¯¸¯®|v& Xõ1óÕk>†�Á.�õ§2Æ9³âðÓßÚf¯wËÉÓ^Ý–Ëæ,Ÿwi:ž)PV½Å¹+r¶ú]•ŒzØ[)yûXz){z‡Ú�£áþÕ§üÚyl P¸¼ ¼Ú x¸ÌSï¥û²¿Ð5('ÕÍi¦>„;ˆ#5,°“Û*Kš':m×GfÂèÍš7Aÿñùã0÷ôZŸzÈ+"Œ9òd1#çBÁÈÙsFÜ«£ñ&à˜tÎ#u‡¢æ’9«{­‹tó 1׬òÊ);楣5»j¯´Q¼N'H;Ô˜DŠE*©™,êEyÖþz±ÎµuÏž¯Ð§ttN‡œ{м*‘Ä„f‹ÌäSfbÊì¨úÕuÄkqg…l¦Z]ÕŽêhJä× ™4jÒ‡³Tq‡I¢¹¾‰Íìy.Vj¡ÚrÒ-DÉü¹Üc ¡Fk^¹Ó*Yµkà®{~•*:GmÕZY¨�B%fªðLK°V�q ©BÙY‡sh^‹îŒ hÉ*}xGD1#Â!K>4õ¨N­uáÔ莔}'œJpÍu?84Ñ9’…¥޶t0;Q—˜²3 ê½ò“Hw�RD¤�©áèÞ:ÓÇ™Hr'U�IòcŽ;ÕGÆaܳãñxòû7—ñy4<�èáÏŒ¹¦ãî�0Ü<î-Ç£ÔyKä˜Ù2}Mç_ŠŒû~Dñá÷£N¨ün+ W’Û¦÷~¥;õ“=’î°“ä$@�@‰(Uý œëDñ'ݨñ]÷‡‡Í~Áî6Ù0A>©·G©)sá€G.q2é‰råº Y×»oƒZl³ýcCßj&é}¢8æ] „ѹà?~‘�×€ÏÛѵCúeÍŸX»±>F×åÁ«óLçDIp=ZôWdí»E~–¦K+N¢ªW¦öºˆj«©aAÆøÄé×JsOI•/$þ}�ÍBƒw¿bC½çW“åìå�o"i]Ûÿ¨š|2Õ†H(‘�‡½e²öF|êé0-uù¸{ÆYb-6ÇÙ°cþñ™çœ÷/•±Š*ï£Ì“<7ýæ u”ª£8�¹v–÷EŸ„¦\|Iþ¶HØô½‘êY³õø=Y{‹…Ã^r}*ðßsSÅUkWÑÒ¬t¸eŒÅ\—¯sUåyw7“æ® f1ÝÍ0_ÍâüüvòçÐû~-`³šê'%w9,ŒÒ‹¦a½ò¸™²ïÒVå Y=|Fn‚HcÂf¸˜¾š+5\6W·ãT9Õzð°yï²qÝgZƒûõ¦_ ^þíøh1�ûÈÏ&mSÖ(i½±Ò„ãnšëóWO87ƒÑ3L˜ì:ñÿ,™6©èš´¹²¾Ðjv|Þ”;½õoU¿ò8—ÓÑ{¯Oz{Ñg§¥¨ynW¢÷ÏK+îpÖ±pýØ>Àýç¶úø¾O!Ñ«å‹dã~j¿üÿ°ÙÈY�eEݾ‚aïe·Ñi|ª�¡¾¶óÖZbž)€™Ô„‘å§êÅ®¤+ßðFVN8'ëÀ޵p(m'õG¹ÝšØ¦uë×ûœ¶ëy@ 1nQÆéáÔ‡q³Ò».ñ•w«gG.Wù—WË>b?ë³Â—Óó¯ê}iuÉu‚ ©KöjÏeôú&|ªÃ|v-NX¬FA뺧=œ^Ú~ëY¶P {þªÌP�ÚäœOÅ�àòh¢Â^”{€%�Àî¦@׋ƒìþ§gÔQ–;ÿ1ƒ÷ÿÊOÇ™÷þ#rp™-Ñ�È1;ýïã Ð÷êèã„pÛ‰\W™ªWÈI1½ßAŠrÇÇU ɼªÓ*±B€NB;�hT©dÈÔsÀ·8K­HÆš153!¨&T‡$¿fÔ=C"¢fhxADФʣ MÔ©¶th•ë$âÜ%…Z_Ceß+^4‰IcòúB‚yrô£íé`ÊÊœ•zÖâD_™ùz4Vñ˜*ݺG�›¨kWdÞ¿kÖŒè¢N=t˜²ìÓSpûÔK–ãs kíå {Qž¢‡dóvjßϨ_ë ­N9Õb 2œ‰«Ñ×1¯N¾»ÒÉ®Ç^#«Cà¡ç;C™²ë/{h€0•ѵÒû\„rAÿ%ÝZ1¦Þ«¦Ù=×JÔ—&éÖй™´J­{S…øœ›Ð1:éæk.”Ä©GÔ‰£NDTÍ=fï$;Tÿ¹/æïºà€)�"»’ Ê|>ݾ[˜¦¸ã¥•gÎ5ä>�ljµE»í¯=îc?ºŠzÐ8PÕØ!’�J)�¹ªz‚È)BÓ §0²÷…u‹T·µífj¡ŸÓÎ˨ÝúC'W±JEQñ±¹{e‘™Úç>çèŒ1É^”ï8øx†vO:4¿ë|Kf—ñ ®éüJ®†J¥Ý¦E0ì‚Kã²¾D[>*#¾þÐA™ÝE#:-ûdÆ÷ç~™÷‘8íÞݲMÒ'ªÞÃû'Å‚ÄNˆ—AËŠ¾J¬'–Ÿ$;®=5ó^ƒJ3dæîßÎïÒwè×”j~º5_$í3“„Í|j!U¿›5ëç#tw<ùÚj\|ûÌçϼAêiÙû%æ¦V3â±jÍGŸ~˜ã%2«¸vÅÕ®ØjY4ŒmJ‹Ët¯%ý£€|û0^Œ·$RIìtƤÕÍmù‰<¤J—Ä·¡�$^ï+ÞÊíPÑ8¤›Y~:§[Æz?2„È>ìŸò‰ž0ìÜ‹¼ËÞÁ †5{zÏzžð‰ÙÏl9-uò¹Map÷d36ò@mÅX5Ú8�ùLźž¿O»?º`ûxË-عj³Á¨~z½!S¹ …¬³ñÊ‡Ô 'Ú·y äå8þBý5!Þ¦eSß¿@µˆ•BkŠ >”{c… ’!wsˆà}=á8æñÿý¯œ 8‘sßê0ïópÿ@ßµ�"uˆž5Aú uÚŽ@‚–˜tÎöZë ÝW}v«ÖªÓJ?æ×ASTM©7·fBT™.è㨫ßÃÙPfE�árVô®ªÍ!•Ö ³ I>k8R³>ÅÑÛôU!™µ¡ªœìõgŠšµ¡è+g�½º‹d /ø^Åc×pœ)2%ÎÈhÎ�®Qgþ&41§ŒK:�iš "kåxGZ¥5$÷S"Š÷²IKDt}|ªÝÑâÄ¡ïœ�­W=ðIy*]QÉ\Øé²’µæÈô$Â-Y©Z!ï¡MuRŠÔÛÊQº†SkÈRÙ1>ä oZ6˜:Ýð_‰‰”¤ç¨ ±$THhTÿŠw=Btt‚LªÔ(*úIÙÂSVÎàÆZ‹VG ŠCâ$4t=Ãê0×ÀC–»EljC+  ¤ïØ—e }l|–|Î 6âäºOœ¾¿×Ð-ÐMÖyt>9é‘?ùѧqØf‹ÏG<03cV}ËÂa¿Qqgö”¢&I@ta¤Ø:¤�æ�áA:+�ý€V °�°D$Œ˜Ï VWÚœ±û›ëRn¶v°mÌŽ‰ˆ+´ÎcèÏG*ö¿Á/dÄ­ìü *àöøÿ ê=ë<¥éÕ’KŽ�tŸéÜöY)å‡ «r!ÍK@÷È׳ç‘YvÒ¿»Ï¢+°#wú>l&ÇãŠæ×ÿ3îèTëê?µy–Å(�TLî{¶ôÜØÇ~Ýþþ¶ñtí7¦+×½§.fµÞQ¾BñúÛÝ—Efé~=8}¼ûÄÚWó°©Ã%„½w%Î4ËdÒ<ñ~‰pÉØ¶îzä~éc§ÙWÚ´‡¾Žz¡——ë^ºcÔeŸ�2Ø|"ßzdÏßjõögõû©`&Ó zýNUÏÀ¾[o/h °1'ê'=Т`Åݽ‰G18åÇññ=Ñ[á¿L;«þ—K™Ü8‹†ŒÕÕóïJÑT¨0ÿ�@Ú/ Z„®§œßÂfÇò‘ºæ¦ RÃm‰�Äò4Òà(OÈ6g'‹{Ÿoµyeºj¤d³73"·èƒM/1‘ÓC.ýzÞq‹¦_',——õ4òÐA;›ç[åP0ΛÑ�§`�„ü ™6žvŠ—ÉÜ9]ÀÑý\ǯæÕj”› �>"Gwî�°:˜’ÚëGÃì¿óîôdyûr­8Ç/ÈTk,7^¼Ol7’«×ÈC+b(&óý©¯ÐáŸpµ§ûæQ\ïjª»×�I¼u¾îƒ²Ÿöy—ÿÎEÔïï�B#wÛkMëzŽÃ¹�<Âì…N:*¿Æçs‚C¾•^1uÉ9ÀgYOVV¹+1œMÞçzÁmßÇO ÷mM+©$Šæâv–Ÿ´$-é+„-mû¼À¨�eá~gÞuËu·:ÞÒÙµ»Z¡¶=›%RƒÍy¯6iŒj7×ÌËi¿‘yäOvÜnÕïr÷û¥Ê"›…ÕáTÚ¯‡Á“Å»Ï!‰ñêö´>|žOggS@9ô MD¯ŠÎ]ÿÿÿÿ�ÿÿÿÿŠÿÿÿÿ�ÿÿÿÿ…þ“»‚9TC¹˜C+à:r6óu÷Çl �ren>�»þ2n{€Sý”Ø¡ êå8'ÈõTŽ}ªÚÝu©²óÔ}®ò~¡@ÖÖph‡2¦�˜+Tš¡B})jDÔp¤Ò]Ì*-]�<à8ŠÌ0k§ÖœÀ²_ùä …Ž»üäi2)BU ¤!j…vvjÂTŠ#€®ªÔ92q T©yD+5š*t<1“é{¢'Ï> Ñ ™µéâp<\£Ÿ5¡5Œ|,9¡Úr}ªNÌ6]=ø èŒ GîŒ\S©t(  œ€ZU¨”¢Ï¤Ø†�µ[¼Ç=ïš!�ä0¤Oð“™ïü`ô]Á±¹ùêêƒün*šE|‰=�_×ÌŠGiauÿµOõ«�<�Ò¢%êr4\Š8m*ñ²©MÛsÿ ÿá)Œ»ë™ôò®¸Ô¹UG:­bÙ„ÀWNgº›Eq쎽qØD‹Æ^sàWéõÞúy¢ý¹åùMƒ$§ ôÓŸíWnQ<üªn›â¹SÞû°äh×ò9¢oàŸ´8±x ž±)éþýWÇ=Œ®ÞY×AÏüóKÔµ“\ÅnåÚa7jë>Low›'xÿ{éß;~¾|{ÈU¥ÊËö {na¼–Ù‰í7ºÖSƒJÇÔžý¾¤í’ ž[Ç‚›0eîF0 Šc™Î>¡Mp}FþÀ Ú6”e——R‰‚SWM.~;rÌf’"…n·ö¼ã.lÓùÍ.úðTûÚŇLþ§Ô�}ú•»˜×ã9§pwG½Ï“ý˶Ü<+§+gó8ÒUŒŒèCl*¹üöÑôQòGÈ.Ô[¥‘!‰Ð»~GWõª‰â=Ý‚FN~ÐÃjÞû;P6\¯8¤Ð—ê\2•ëóDSáµ·Ê·6i‰¨P&2é®Ý«ÂéñÚÔÂH*=¸-qZ¡Nrý^©Ã»ðaZ~L£ Ø\}ÀaR)ùxþÖŸï�…½]ž�θ1žUUmT>Ê/~µˆ:µr¡Þ[¼5pËñ%÷(À•� Q·þSO‘ÉŽG�§ÌlÒ°#4e™‰Òa´R¥N°ÖÙ÷ž �ÛÙZ^¬¤&x�eçþµ4ÒÞjùN*Z&6pÿWMÂd¾¶ÒýL<_ŽDñ!úò’ah÷–Ý©ô´VÛËãwXjÎÚåœt³iïÉ:~„c‘òP,è5÷-eö9�Æšøn_ŸhõEêY–ìÊËÌŠ�Jl˜õ«^„{‚)@îÊ÷@×Ó w½¿I€ÝY+ôÆõPèS®˜ë- îš8í�Ý0ÿLy!Žÿw þðôS 3Ž—^sèkÔ×ÊýKÇTÏXÜP¥é‡ªªü[¥V¯†ÒÂZ¯¤^Im E‰Ÿ£³I‡îJÌq²;šAíUrÚåÝ#R¥: r@5ÕQG‡cý}DZŸþõû¼ž¾þT=ëžµtê’/WAV²9ßQ%©„p©Ÿ¢J%öÎIèÌÌÐ)¢Êùù¨T�2î³È™]»ž­Ó•Et}dè©� !¨ ©q ‘ub¯õç:çz¯©s~^‚* NT�B'É—i‡Ýõ.%g*¸U‹y×È,žˆâ‘t�ÔJ#:i­—¯h“µª¾e‚¦£V©'±ê£ß©EÒNf…ª³d'óÉTq8‚X—û9³Z�V9‚S³Eâ(HjòÚQ�™ jHÍȽiø¢¶á@³OÉ�N9q<ÌŒ<â#:wAGž" Õóûõq&²‚2u�í±éï^„yüä§|Ð äîÐÝ¿yqoòU5ßÿâÚÜy†«\šÕçÄ9íçHâÕ€ 2$€8¬Ç“ÄZ!{Oß]¼,šµ¦äj¤f¬0ÌO¡&³ÂEÕݸ'CjÉJ¦¹›²;^k³õa®HøÈv~Vö]NÑûPœÓI©òž3ñ0Ñ2,E�z÷8µÔ»¸D{�Ê$÷Þ€þ÷Svùå"î(µN<ò¶àöû •2z`}Ÿ¨Dv½yÏÏ—�x¾˜õ¼Á³€n[‹û¸Yã9Y ͵|À¾L}ð�T÷…)úgÏ"ì¼}Oô ëM±,ƒÚ®rÛ¬Åõ´^†|¯ÌnœâÜMÆOD¨ûiëºWÎwù/=ãér`^{ëòÔßð‰?êè#Gì�k§ÖÆõl>çç“{?=?üQŠT¹× �Úª8IéÐ> [žñ¦;çpyÏ_?jþÿþ¤‹ÿFÚ±mž�™ú�%M£êüË‚äoG\±BOáÕ*c )OOm�ÑV-ˆf¼Òì�ðö*•ElJÓ“v÷ÓC¶l|^馄ÔÜ8Íw™~®²ˆÓ= θØÿhÏЇ?½Ôd¦øÏ�# w�NŸf…Ìy¶ÚÞã±:*ÐsxByá7Æ?o�‚9•w¢=|# Î(¾wD©L&ê¯çÝVü×Ù鼟lYÿùàqUo»™àh¶¿àœðlÏ F÷¤(æñ©]3­ßça‡®«$¬nÐõ@—hgÊ 3Q_ÛNFC©^H×.¶†‡sTq”´6›öfç”ü×C$ÿºÙ�¤ý›�éѼu¾b‹ÅÎÝ»qXëëYGýgÛƒÿè½Z&CÕ„ o·â�\M¥1¨˜&¡‰ï«þ•ál&�E©×g³�ʇIIböú»eº,_õ=¼ü¯$DO_)Ʀm­“Ï}3Ý êX/Á{œ ,av¯ßç9?Ÿ^€ÿ–-À°¼ dæM¿*wf«2XׂYˆQ|~„{À9‰R`w#Ç@ï�ÀýãgˆB"r8 ð¥| >¦WÊ H€ù©Dí„®ùßå�#µeýLwuúu.öe­!ùYP~ìó™KªL¹Ïxeqµ¡NЯ·[™¹"E;:5*ÁÁžpP=§˜gêÁtFŽý£qÊöú”ÕÏßã }T1£½fªF éHt½êS ‘Ó=£ÆT©5î³öPcZ££’ŸoOÑΉY—Z�½�û•ÂAhÔÖ¯ÚÕy‹†ƒH¦ì­D ”YgÕ|yŸ®+»Ë%gÏh8Ôî¦U²Œº~$Y›kÚ�3òè%šèˆ+Þñ—7ŸµötÈãèèPVɃ֞%©M4ŠÃ�eôýNoô¥îïŽÞò¥;MmÜçðw»�ÑcÝ]�ìùo.îë�uçl±¥MǪÖ�}@·D’ÀIàØ$ÐDÖ�f€¤=¾V^Q0ßšˆÑ_m&eˆ_ÑÄ ÅƒEƒE§éT×wû¥åù2ó7Q#Efó©Ú”Ùükã^mÑž;¾T³=Ö—*'G³®¿¹;ŒÏ>ÃÅùfÐSªhnŒKÞfÚíŽGõ¥eÂ?pà£Âû=ófÚәȠ¯xî=³×ù‘RvgÍaŸÛù­ÏÍíe7"ïá±B<£9ÿBú»§–i³.Á-{§ú!d!g×y& =½Ï¦¢ƒî±8Í³Ü G”˜Å$GÓúÍ?¥]LÞÂ+¿·â¶»·Gã2wÜ®\+*Ôpœ–iÆñ‘ìm-û*-¤nS1 +}Šê‹•GdOê1�›†xŒüŽgœž8 ‡QúðFÜëð¦ŸÚ¬wÃý~Zа½jtײ×Õ>[åª%Ž×!lí}ð_E<†ñ�ບ¿ü•ÔÚ>ùy·òqÝì“3è¯¹ÒÆón;Im£åî­d>K¿ûÔ!ùò+„» šùô„ ã1Ä6û³$ø˜ªõ}½]ëÝçô@+1WaéÊ/ûˆ¾ÛÅ™1|%âCþß„û ††ÿzÇ´Ëoëol”¼0%C±<¬¬ø~”{ƒ)P@î¦@?®B@SK~.:#@ìæ£Ü1×òÔú… „f}ÍÚÙrK vîñм§B<¼Œâ©rgþòžèQ‘®µySÓ¹žóL”¨ì•« êyJ%�g3ÑOF -³Š Ñ!óJN©nŸ’OvÙÙu¯ÒY‡œ4N¥:ƒ4�Šì)À^è,yP¥‹ü:Õ†èZë¬ ;5u®”7VªÂÓIËZk…ˆ]§vB“SSöš/‰+Ò½Gj>2jkÙ©•ZãçCªfdI¨r©Ë+RMè²¥~앆(އÖ5w¡NQjOà \ëÚ–Çß×ßß\_Üã×ÓR0…Ê4 �ÊãeTXÔ‘Ž0káÄùÝdÇ,Uû.µ&šU²qRnü42”)O�Œ²5´`åFGŽâT*¢ùRÍp#“‰)äï*®õÞc> Y>ÿžÛ£>†DeN€ÈFŠß÷ø�¹™×êçÏi®ÇŸÈç5½ �ãÇÜñä½DŒßCàþ�~3©gÒ¥‰p*ªùƒØ÷çQ]•ÃLÞsOöR|î‡ûqØ»ŽŸËÓ»Ú%¶Ž3ô-ùŒxVYh”§ä{ ¯ƒ-À~§æhi`G‹/ÿ.ùÌŒ‡E }6+ª7+½šY¾†Iý³gh©_ êÒ‚Ø+Žc�;ùÛÉëEê{‹uFÉäÏøÄ,c×ÙÇBw;r›tŽ0 F¼í”˜LöÍ]º57Onvi2©³J¸ƒ¨úEhn«‰ÕŸ3}74ÍBex™ óˆô×Nû{q ŠÍë}Ùa°x½\¯ô1VÁï°GžÊO[O6¶çKúîÍYÝiªã$!Ïväýioø7Î�¶ŸúÓžŠ‹U}0ÖrÊhvú\[[Y¯Ž à¯fY©Å$sð‚ûˆß]敺ÿÓ“ŒÃO½_ôä1Tð=[Ð>¸r¿”æƒÜÐñ³Îßs¬ñ–Ò¢1m©>~¡[ÁsµƒçRg/“!;r9²º•+Ê]Æûpa˜ˆ~‹^öp§FbqÂCZvµžNƒ‡8¯Ñ]A¥ñ˜ë·zn¯ÖŠŸ6ÅåSöâlž˜ÜöGcºÆ?8eFÏ >?EXvå¿�ßÎèÎã¹ÎîYîÑ<;/”1Yóa—'mu“YíºŸŠ»Ûº2Ê=¨U»÷q®jøs*kvxðwþg.ÚæìÒš²Òˆ-9tƒß—Õ½ÿûÜìI�ŸNqAW²¶{qA6‹·¼út*ï^ïb~¸œ}±àô§±>lþn¹�¿'ÈÒ ÷»wqJCs ü¶8׈9e°M¿Ë3i=òuâÔµLîÝ>§¸³ª*;ü‹#œØnà+í‹$Éß�lW6oöŽ•dºíÌŽˆÛ± 3\]˜Ÿ½øo…ó«?W‡" ×y/¸W‹Y7ßìÁë%ËtHÈÇ÷sK˜Ë÷ä¬[ápµëSg1³5Ÿ?¿]o6�×a £ÞæoS¼g*�CßCú øïôé};ñzò/¿¯HnRë"©FE‘3ïrnJÆP@&OggSF=ô MEüJ‡_ÿÿÿÿK^„{Ñ)A’dèÁ½@ $ ïÙ“I=Ÿ¿&ñ‚D´§¥㕾¯2Š€CeŸØ5Zq$Gÿü¾çÁºýþ®×QS žï]¥æ:ô늉ìÿ~\¶KGb�È pD{ú¬ûAJ‘]é*8@ÑêHûR7é9žìK…lŸÇ¼$AAd¤Óú‘áTQ©; y_èJ:pºÎd¤ÔfÚ5ëAãxàÏÇbq?Ÿ+ËïÇ…Ê´ NQI@Ÿà�IÝ íHŠã¬ÎÚ¼‚Š(‘Uê\EAÝ5 «è¼äjFŽ[žœY?·=ªCQ»§ò(¾�ÎÐŽD@2$˜ŸÚPÅYS=& GžµÉá‚H €º×Ðþc–JWI‰$²C¥¨41Ÿ8­PçûcÉ +ÚU’Ð&²§“ Ú5¥6ÔÝ5%]ÓÝ·ŒÎm—ã/¯w;µ@ƒ Zƒ ŽGL3AFþ”RIj×®¤«ÒµØ+ó”R˜Ç¦��cì®)×=¿÷\*±ËRÀ EЋˆ™îñN7§™žöwg¨Ì“z€ ¿9=ں针’1Q£)sÝÚ¡@ýÜ]õ=Hy>böÐÎÃ¥¶²¡Ü¿v0”€XûŒk[ÅKaÞ(µ¾Ž�lk¼‘¦ï«ž‰µŒ:2¯ßžõ[ƒs©NœýO�úvÚþy»÷S-+ºß팞�Xù:q¯ «R÷÷Ïkº ¸"ÌMûÐ÷KAÞõ£9Õ ýúl”©îO÷¬Ö‹dÜÞáò%ðÕU9¶C9ƒÓî»9Eг¾ng쌫]~Oׯü(‰·›» }ãզNJ%ÊÞÜ(ú>IG/óý­.èFý9r2,+ñ1ŸÕ`öðijêüÊ�á¥þE»P¸ül*sŠÚKé.$úO¹jûS—¶{ˆÁ¾ï·²Aðq]kó�‚%%œSº‹ï~ÜKö2yÖÐ'¡òÔ“Äéj˜`æþÔs»YWBÍ=œ¯‡8§›!¤Þ¹ì.‘È8[ιîõãy®^5ß�~úEn‹÷•Ÿ¡ £Ù¿ùÏŽžæ0ÅAÿözŽ:5s÷DŒƒõW»?D›©ÉÍ^Ž¿©•áÔiŽ%Yˆi•Âñ÷óDZ—`·bo<áèGlÖºÔòÑ`35†ìªý8yCæeÜ ^¥�»ihJëyNWÈ»ïâú2"ǪÚp‚2îìÞ*DG4†‘»KFü:éRS½¸åÕ�Þ©.Üa+b�5 z7ƒôb*Á%äT{jgrðœùW¥Biõ±˜ÔÝѳ‚ñd?bÏs»âžôû¦_1oáówŒÔ‹Ãb¸J~Öb$]“‰Ýx¥—&2A:<_üáŽ=§ù¶/ukŒ1�cy7?¾ .½×ë°ˆ±ÊÜD%¿Þ»ÖÿKjM y`�Ö—þ§ëltÝUkfŸêý«Ç&[3�[àzó»š š›æ2"Á×d”Ö™7»£¿ú©Ìñ/«Ó±ÆÂkµ nÞS{í (à|S»¯í (à ukui-media/ukui-volume-control-applet-qt/data/sounds/logout.ogg0000664000175000017500000034556115170054730023652 0ustar fengfengOggSì ‚Rÿ-Œ„vorbisD¬m ¸OggSì ‚R“îÚRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSvorbis,Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)ENCODER=libsndfilevorbis+BCV1L Å€Ð�U`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€Ð�U €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNPRT>’ "š™9Ž��‘’“”•@@OggSÀì ‚R&j�zf¬¯¯ÅÃÿÿÿÿ´´±¯¯±¯ÀÅÉÆÿÿÿÿĄئêð‹Ã2Ä6US~ Ža™sê—Ÿ¿¿óã±&"’—@à(€¨Žÿ5Ãõtœ±q£2¾Ï·¦V„Hsûû{zùr"’�ŸO7v2´Uø¹Ï_‰o°ôÜÞÞÞ ¾¿¿¿{i òíçVìÔòÞ¿Œÿk}U ±¡{/XùnI¾vþˆÑ?î¿7µØz>æñ×¥ù#‡Á¼úÌux^sÍêš¾¦€zT}|%2»éûùÛ­ CÙ�.Ý?•oô Ð%·Zl›üS´g付rf —e±2iñ�S~Ý7œå•øóBþõ,×<“TSµ_A4z‹é¥ÖœU�[¸%åR®/£pïìÄä“�·ô”_Ú©±ÃåS6_Cåêߺ°gg/öörß�svÏé]5¾9è—¥?/Q©95[Ëë–?¿qmñÓ�©ÞÜ]%êÙçŠÃk (šš)%èóŸÒ!¼z´ø€ÍWÎò ÔaoÅhHå6:ÂÁÇYf+ŸæÖ~âÏpA„¢7yIJIÒ‡§ŸªW�ç®Wg©øzð;ìh¡Ã=yI§Øž“�Yƒ@<=ø5b¸Né+àŽîìÄÔd’¯§J�È� o:—\þ�iÝPž…z¯ªµ¾yÏ÷²ž=zʨ>¯†—´ôù¾¥ÄLE©Ï»Î-�©õ¤ Ö >ø% òFvÒ‚ßÁ¬¦W&¥pšúú¶«nå9K|ãGòÿñ¨a1jvÁ#k³†É¶Œ3ñ·ô»714HýÖÝ�³JæFwµFKÌú~\÷)~^÷úë}ÓÞ¦ážô‘Ñf73à¶|ѶN¶~¬Á ¾µÛ: û»öm¨rojã'7ø‘?õ_üý‡�4Ü­¿6Þ6½ßÏ�ýÒ»%Þÿm’·Ì�Ü�Åv^yÊYÖZï¸5þá§R?äD俹Ô¾G�yæcÑ#rjÚ›:ŽH0„xÝåãn¿Ê£çÜ¡ÿ2x|¥vHø˜_^m©žË¸hE”»MÞºó?ìíÜYåtž.õ ЇBW0kœÿ‘ÙÑó?/¸zŸ³¸¬ôzÐ"süÕÏÑÿ Í¿Ãí2w�*+ÔÍÚyl^ïÓéÂzwËëZvs?œ>|íÖÍþiuíÓ|«ü\ÆÏ�;¿Ù_¿\_†õk¿‡›‹®eWª%ÿà½*ï;V6¦ƒz+öãÄÐ"ä:ÍíLòü­$„#[2÷éôˆ¾Ÿ,ƃu¢ç¶ø´ø[ ~æÓö‹âø÷È]°Žúþ2³-íPëo Çx¬-Ó”¯˜áeCµô±v¤å¡á4yä�ŽÌô¿°©‰,æý6ì¶g ¯€jÍ¿çü¿ë7åcuïîçcµ¾3r5“á}O¢W¼‘æ ºrZ½ÇÿÌq­÷>>úäô¢>n«]½òòò.À=€+úKÄÄ6ÝYLÿgc.):U¼AkžïÛŠkY¾Y—%Ÿ1m?±Ži5ó2µû|ý5æ7«¾}ê'�÷»ý©5UWϺý|Lñw-FnÇ­èØºltŠRCÝÕ¤>=¸=[à¼ûì߇ßbŠ ´ª†�·ò׳Q/“õë}|¼ÛÓ…XëRD°·ã-A„„C~’ˆËâ ZQPo^r^ˆˆÖÌU%«…Cffçø¿˜å-‡oä¨!|ñc¯á 9Ðzôñ@óF) ’¤ ƒ‰ª$笫3__¿NUYž©šO„öý\õ¨ÝUºÖZ+ 8·hé:9I%¡ˆüþÀ˜]=^¹tA"×Ï»sæ9:ÂÜ:CœNn @>zR!tJ'ðî�™ÄD(4Ö$×aýˆ'âûýW€])4ƒF6M¸¾�BÿÍáÓýrM"“ã,…S  ��™y”pÇÛkQk×Ýkÿù¢)(j¥ H½@éú¶]BðÀPJ8�k*ÿÉÿîç;ìN–ýåC//M_ú! ü—2‘9Þùþ•;s§7Ö~ùit,8¦Æýض•úûqU­þ|fu¤Þë×·Xùòƒ[;Msݘ^_Ç·úÿ 6ô¹|еÕ']8fËF�¹Nç‰Ùè{šeOÆ¡ƒ•ˆ³Ãöâƒê¹A²É#òî…V>|öO*×Cå¢'•�a÷õ`�¼G(Œ’á9Ofñ«ÂÛö,x µ2õï{Ǿn]½Ú’¨.˜ù®Ú§+¦ã›Á¯žítÙšŒ¶vNÓú#ÞC‚38LLÓïKoÇW4˜¦rcþ¨¬w^˜¹ÿ¡»!nÞ‡˜Ÿƒd±wh\(â÷õûÏ#;Aç¼úáQÅìlꜢ�$Ëå/êIGŸ§íe2ýÚÛö€å}e÷¡ú¤3!ןOòkÜwh{y—3�³d¾éò+f ŸÚÕ^5Éã iXwÝÆÁ|#â!LeL€ú»žo�ræw{®•€©ÏWBè˜�/]>É^§^Ù!MIÜ 2ßZ{ÿEŒ_½­h£‹æ´DÈ…÷¢îðq£ ¤|4 »RH|€üÞ9 )ýø™™óÊZëp–ùmÏ/îz;H´Z¿¥aS»6@Àë*äzJ¡½¼ýù @¬÷Æâ Q¸aL´Õ;AñïL�÷öOïÛÝ/>îö7rˆ^>ws{Š»Hîû½ö>>‹·^’ó¬Ç«ËºªAoqèùÀ»S³ÿ¬_ߣ־â¬#óøfœÝGW/‰o UêRw·¥½Ò/“;“ K¨p�r™퓸­/€ ¾ ¼rjç÷�j ¬öx`8 \ÔÃÔŠørÍB1·¹û ¿34¢G„£42ñðù ûâǽJÚú ÛªÉ�ó%Ú–'*7ïc»ñ.^Ý7ËG±Þoù›nϾ·¬›^¿0íy"ÿ2²Q¾×Ø.û÷ŸgÝ�êÖp6»tóí62{H±:òR¼¨Sãn¹ÅÖùl«:=!/@Æ]ò¬ôp@3׬€ƒ7#5½ã2l¯Î3¯×ö³ÙÇ0ìGøÜø9à…¹lîE µ3óÈâ-ïñ›¸-P‰+VK¿«?Lît,„R2­MÙ+‘Ïê–nö²ÿEÀˆ[Ó>3W$ââ Pµ¿H³w†Åå+Ã]Ý~v°<ÍžÚåýýë�Rþãïÿï·zS_™çú¤�8–?Ý|x9¿¼1ßO™Ûš|ýŽû|²EÔWRœ×œ«Dµ¯X�^¯_j^ü¶î ‰ep€nkÉarw Oe"Zíuø�*пÁï´²s¸ŠFâAX`y«fëuœåÜ8i/Ügjíàë5îåè ¸ÔÒüþsz.æÂ¥É‡ú0'wª¹Å¸ì=AY×Ë8²‡µ{C6¾m$ÞÀÖ¹Bƒ«í"ÍÝéèrú W¯q~öáÝ»—^œ¿ðTÁË/¿Ýÿôj{ÿúúš�}Øß¯ãëcox.¥á“çóÍžÙ×\b%OÔéßëúFòx–ïý<ÂñªÎ-ø—u˜¾è³_þ.¥D$²—íÊãÆ»}Y×»!+8[mñ¾|Êlm¾e“ŸwºáÈiÃ¥I‚ÐÞ^i‚ÐÖhÙŽ÷Â9©rgI±Hëj›Áƒ ù~h6o_½°WMõœÞ—Ïcy‘Ì1ĹüŸ�“û¸þxdùµdËü Ù©‹·¨3O!ÿ²£þöG¿ûðøì¶?ým¼}6ÝÔ·¤Œÿ_ü¼Á•ëq{ù|oõþgqâ²[ê·áç£Ì§iÉ?ô“šòú\ðJ¾‚)"Öyè{õ÷Mæî˜I•0Ê“ âÿϳd!u§üH‰ÒÑi ölxM¬æê‹=­¾"4޶«Çûmqw;ÝøFÛØDðì篻¢�³A}o#Ò‡”�ÎÑoUÁg?yx�Æ•† ÄWoš7‹¸äÈš×É(:÷ü;µ‘˜©ÓQîž>G0–b¾ò]€»wî܈¼òçr%ú 7½î~í>šzë­sKgŠÏ\PàV Fü™;€;ÿâöÊÏYt¥ÛþmÀÙ�_× àMCá 7k8�²‰>ppÐ>µë3ùe×p Â{¨ôy®åö¾sÑhP8œ7UÈŒ`ò!Po@ÒňŒ�K#y€€Hò™š}Ý"ƒ ’��‹½Þ%rь̈ĉâqV Á ë\ë&ÈDs @= 2æ  CRÀ1cè·‹ÔæžÀ‚XI€¨$õz¯¡úüò& ‡Šu>>¿gÆø’š×µmÇ/ÇOü1à˜Iînñ÷ø>Éô@î ™‘í“�™&·T …PT$àŽãa‘$(–à`êÉÛüáÇ_üœ‡ù|&äìë/?|�‘F3?Žœý{ÚN8Ö¶N¼œy¾;V6ù¤æ}ÈgEHgß¾~ÝîEŒ{Yå³ü; nPqjÖwNÐ�üo5eþ§��x·.�¼Ùì©øvy’ç'ÿÌ _ÌþÓaÜ$Ððæì l ëŸÿ’‰—.Ú#A9Òœ!7ä‹Ù:€eŸ}~ernûº=ZÂË%µK5 L•·SÜBR€,Ëe}ƒMœ�Ÿù:R¼a±ÖF5Å÷ï»2[Õ ù¡‹éÏ®]7Ðò6,{–êîêÑù½ëï1�nA[¢ÚKVö¶IrP +;5ýfCœ¿jþ”ì…¦àKFÍÜð[©ÓV¬£”u î×#—¥|“u3ÌÁ‡Œò¿y õ:¯¥Â±r­íÊÝr-‰.î6ËiÏÑoîP“ã™elæê$9E‚ÜÜÙýÜèjyŸÌ!È�djT\'v¾HZ$Ä_WН×ríÁ?§Â$Ä)ª¯Ç=ÊÁÞ…Y×:Ù?e³Î[ã.jµ^éX{µOt®.^×ïr hÂÇë*ä­Ý;!­Äì€0öW˜$7ºé¦Ò�ÙíøA2¤Ü¹ˆƒ†Eá¨êŒ7l]We,«zÓ—Õ�Ê)°–}½#ÌzE5—…Áç²¹ŒËG½ó,S²}t“½àâÎzf1ö{2é'¯×ù(OËÛVãå)³Ô©—u9^-A§<-«gsñʱÝúŸÉ¾¢ÿÁý„-mü „r}áþüÜ€@èÒΫŒß!Ͼûã-©NÏÕ{=ý׌»íÔ_Ór;›ô»9½~çÏçU>Žñ.Û®³ÁØýú=¯»²]»O�Ôñðˆ»Mù<=«áð�ç×õí¼¯ºTÎóq¯KrÛ¯³G¿­^�÷ë¿ÿåmº>¿µÎÿ÷yŒ7ãa¸¿VËé°}-ϧ»~÷Ý{êï{ûÛ\·§t*®Ña7çÇüm¦S“ι>æ2ßES¹‹ÛÊïÒÈÏíµÝ•å|ÐËüÜ­�¶ö\.çùÎÿ°;vçëµ?ÍÛÕï}©CìT“´–Ûy~lÙ^–Ÿ~Eï|cǬÉ"WÚ©©«Íþ�šÈñV�ôÎz˜¿ß¡më¥_ÕIzØßïýÑÉçñ¼.»ËÉFû*NWó€Pû.Ö³tŒOggSÀì ‚RÙ5Ž<ÿÿÿÿRÿÿÿÿ¾ÆÂÀÂÿÿÿÿ¯ž¬ê=Ñ`^YÔUî£èíZ%geZ¹ú—Á>Ò�ø:› HKˆ—ç­¿Ü“í }ܸ¥üÓ3@dSÜ"?ÿÏSM�à‚ƒtÚñ+›9¸8Õশaùÿ5hw5ö¯�$'èä¯û(¡pšo¿† ÛõÏ£`:úÛS5ð N¥ž@8ª€ø^H&Ú YÿH‚4sÿ¢R Ј‰q¿t* •{F… H·? ßzŽï³N%�p@?Žþ¬ÔÜ[!|[‰L]p€Aب:žýƒ#l]h’Ó:>s_ÚyEÄ>0  @RÞxQ@C…‰ÏéBC"rÆwä¡¡Ê FËÈóá7ó¯‚888ÜŠH†cG …דã!«µZF%‘¨4³ �õ ï*­WhuP©Zó°=–榚F�›C�JD>=Zé ’‡$ÈL , ¤Ïñúö:ªUÖTg½~&W�à94^#Ív:gßÿ4築×|»¥ËÙz*ñ¼è­ù$ \¯{€&ÿä+ƒP®âH¯3ixÇgÐ^ñáôeÕîqóþÐ�ÀY�.�‡ÎŸË¬vЉ÷ÃÓØ­ï€�[oIàÛÞš!àÍBürzÁnMÙzL£3}†àØ¥�<Ü“%î)Æý†-ƒ?¶\ôÙÖˆ\§ž·ƒÖ&E.õ¼p�KOþ#o©�¹Hcª JÝRñãDi¬¼îŸïyÁp+ƒ£””Èüš ãN½m; ÐÄ€HØ€¶Äù[³ü`Â!¹,ò&ôJ¯‹j\Å9eµè.À­?þÔÚ� NÓéÃûˆ[€[?òËñ=Vïnf-À­ã?ýOßÖšôêÖà.À­¦/W«Ý{'µ p…š:ÿPš¤ã5vŠXþðѬäU§¦¦Æ÷ë½[kýù¡¢`ûÜ;¡)€˜ôë¿ç±°¦§zVc“—d" JAâsQèK@ž^*ëï(T¤ò¸RÑ €ÒI ¸¿MNO¢8Žd:$¹ãj’I+àLùÝN<Þ5"Šp4’úÎÎbQü…ÿz¼”ã¥I4È/A* Ìiz2—èa~p8àndE$OD²:}ò>EN€BJòÞCœ\“áÝ­ÇNþä�Jˆ¦fΉ<ª½#U…R5¡‹Ü©¹;™9çÆLQŠëÙ€F€ Ö³»_ ÀpGDˆ<€zØe#„‘k†”ð7 rË”‰Ã¶ÉDDBŒL›H¢�¶œ@cþ9�ssÓo?çý'MF°7nzôóô£ßmÌ$¾õaSöœŸšëéWdÊ<éœÓpCسóo7¯¢=á;›ûUöBÿ³Šì1€Î§zËvÊn¼G®M’ùoµ9+Äþô«ïMÎä;pé"×dy»/ [¦2ÑàeÆšïÀ€åÍ€!ã5硸âÇVѺ«Éƒ˜„ÑÇ+)ý­'õ û]�É–›ññp=ûÆ{�ø_{Ï;êõ=†c>s]\ÍÆfú™§ðœÏçK®ÁËšÕâY£¡–;Rç‰Uê¬jS ±„Sžê– ^Ò•e0oBävߺÇàs½ýÑ¡’ÇŽs‘tî!£Õå_ Ÿ„õþà\l׋U뫚‹Ë¸^ªK½n *g8³Ùr{¸ˆK‚éL/è±ôîtš™ŸóëÔzJ¾j«¬/÷¶»0ýßhƒÑ-D{þ¥!3õ¥BåøÙ­ˆm½ Z�^÷‘Kiš_Ì(c´ÏØÍ>ÇU#JbŸ;ÅÞ.åÿCè‘£Åoø\¯õ*›³£ÁæßרcpMÄns^NM?ýÛN©HÛ×g×?ôÍõ'dÂd¼µg•z£qÌ×§ƒ,-¯Þt¯N—àÂ!�ë[—�÷.±)ñïÎ%I§Gß…èÆÊsùjÍÒÆó3¿u.ã-ÍDîæøRs¤ì+P+Å�#U¯²X $9�� ÆŒ/¿cÿë‘w‰2xGͺ;¡=¥ ¿ä<>/EÇd«|{q°¶(ÏÉ¡Xº¾$]W¸+*ד½/é·€GãŸûR—G3¿›{qôßì~¿®’pùìîýÒ.éÉdW)†)Y¼Ùºâº¾øÖe�.\òt8Í{KÂcÜl]ûýý«êµÿlóÃø~?ù¼Ñáz›ÕÃï?Ïí¨UÓå¯ûéôÜ]ã£{'Çé[®wßS×q³OÚË<�“éXqò¹®žIR$›KÙÙÝú~Ø|·¼ïß>m›4õ>îmçÍñ¶­ž·ónúܧ_ý›oóë³ Y¨e“�í®ë†¸¼ow§zw¾äs{~l~û4Ù4eVmòÂøO+}¬ Ý7q”| ^.×&n|Ó'ȇ ÷ôO‡óÃL‹áæž^ã¾t¿f�çùM{=}ÿ]ÿç£Ôˆïߟ�k]÷|ôø™ë°±æL/õ·tWhq]ÿÒ�©×ý²¼ïE<åÁáàþعɆqyV|rô ?2qßõLfW=l†'C5JÓDËꤷž~ví{2s<ËwÑ¿½õû*>䟴kÔ�šO‡³‘kE¢Í‹ž>¯f Óô‚á#o¢~6™Á‘¯È™”edÕ !|¦:<¶¿œo¥£ßÝ̼àÖÖˆ»�úý?Ï÷÷ê~¥†å5þõ«÷?:uÇú±Ûç¾Í¼žó¿wkÔ«>{Å¡õyÖxÈU§n‘¬oí4êê²O€žÏ{מҿèúøwI÷bŒ)e¿ôßG鎭%aKmà%ºeª¿P±Ö[ÂáiÁûÀ0Ü£î—áœc1Ní·„P¬ì;gO Ä™Q¯¹õ¬ì_ãm÷‡»§Ã©ùçÑ£x^Þ1o„ÓpL"¬�ýMŸ\€.û£U�fžúþ¢¯¿¾ J÷ý¸}~ÝŸÎ=Ê,oÿ°É—ÿ¹?éÂ0~-›Ì³{5>I¿v:ߪS?u’Òû¹-?Çëó¾N•)!o&eôµê¿�à ü5¡Q—ïßIA÷üWàJ{¶ÃU¾m>Q®‹�+‡Ÿ¤ÄꮌPmÎc„Ư�l åg=­Ø»þUwû›ÿå,Y‹áçO=Ö$úðoYû}Po<£e9„z«½úi�øû\äásWr‡¾e‚#/] ¾ð.ÑǪ;ÆøåTþèk4 ÿ–uF_ªõ½ÜÛË×Äó—¶Q^{ŽÕ “Þ�õ$ÊŒŠSZðW×éàwÙG}9ªýN9ÆôäîáóÇ¥�>« IPiðÖEñ¿×z°xOúá­Ÿ{eJ¦,ª#’¹5Ëœ·†RN#7-¶úüîÅÕ�üÃùd•W|tü½aäÑË_8ïŒ}söätÜÏ?ß×»ï~S8òooVë­ßòIã#¢ñ|KEA�k�‡ÆïÈišªhdYEݼ9µ§{ ÔÓ´vߟøih²Ut"r�½£Ç>Ø)€l¼–Œœæé¢¢²Ù½TÀ @.È®]ìÀ}8‘ËïytÑP°ú1=š2]ÛÉÇ»�€¶äû¤ v‚Ã>u§ãÀ4L3#×Hht>EÇO£�w+ú1ŸÛ^·ÇgtörqöçKîâYîHŽ‹”Ú—T…¨hQ9*-5#�ãâÖWÌQ#+ìÕÍåNq÷†'ûk¨�4]óŠÇÑÎ €Öj|“@Ý«BKµî•Ú• £r‘øÃqÏ�¬€Ü.òïs;öéwúdÈö»tâ‘ñ   yyCüÅŸ[{]} ðé{wâ™%ÚU+`…Èb8üì6BîýdÔNxó«�_ÅÇ©N 6m�•f9)’ï‚ ËÚ4kÑWö>ß™ê¾4ß8êïÖ£ÎW¼™³­WÀ_qoêV^+°°<g)çå½gf�8;1\¸2;%—XQüñºT“äùU¾Å48/_@dõO=å_/cë‘˹+(ýõÃ[8‘/n ^µ‘ò=xûrÓ´…Cé]¢wMRøÙÞ¦�§ß}Ä:à·™Mf8-÷\¼pKåŠf-–ÚÖ×ÁhÁã½”Ðð‡iSø1b¢+‘9à�ý“o/ [QœŒ|ï‹èc.·ä8õú�›™M/`§MŸtN`³‰=ó­êqG-‹Méþ#œµ áck»Õ"z‰9Û%¿Òhn4Ç\Ç:9´Ñëõší8ÆkÊé ê+¿^ýÏdà_‚ùÿW·1zvn�l7ñUZYÍ¥é‘ 7ðF0®þkÜ%K¿á1®$ÝSä- ¾Í²�çô~ØDÀsvŸÚžk¬Ùñ©V¼Adí2–4M«ò—éÞnCK+_–÷°Ž]^«¥òõ±¦ÿ’UÖŸ_\õ®ÕçÃd×v5Ú`O3òØZQ×q]ž!E yðmt’#‰du‚Ò›¡´9> qÃ>úë¥-²Ÿ7P�=ˆ f?ãTp±¹`Æyý¯—Žny³ØÎS¬ßÂ?ͦF¾»PÞ=ïÔõé¯÷•™Ü\ãñý‘õ_ö ¯¿Ä&ÙGdª=´ÉûWé±ØË¯ëü–æó×#†¶ðu ›TëXâ»öë©8ä–R–uT>†Íx0.òþvšò×î(mؽ^»¢8�îùÙLÝãqJìkzÿÎ}úö¯÷ëÅ�-ªß~;•Uå�&2Ž­K‡)ÝäßÝ­_êÏj»Ë†}ÿnO›áÿ«¼ÿÿû·ªÊõótŒÎAºÏþý»Ü~éö´:Tñêw¼^§µuUýE�œžívÙÇU”8Ÿ•é�÷q³3%׿áiµÍe@‘™ÝL½îg[mù¾(2•¹ [‘÷ OggSÀ,ì ‚R‘öoÿÿÿÿ5ÿÿÿÿ*ÿÿÿÿÿÿÿÿ>Lê½Ü׈(�­Y5!•BÇßóô$o«6Ù€ìáÖòK„( /EŠÐ¶ß’¼ÞçÂŒ?Æ¥§7][܈¿L'^ž)8è­8pd` àÂT‘  €;«4 S(<Ð;¾Fß® LŽ-U»ï§£8 ÄÆŸ]k@Q¡õ(“ÇâöX3àÊSø› P@}¶Q�Y¾Tæb@8NÕŸ @e€á ÝI@úðåI‡Ï‡çý±¡ —*ªST„fQ|£ºLn­è†¢+ îü›Ì…6sS*Nh7=l$Q×>§fÊ¿M~n×�—Õ‚ sdÖý”K�Ëi¤Ud>t!ŽÅ%G÷ùž¸ •øÆ«» ¢�÷Eþû‰rÌ9 NOÚIÆ3ú­yzà¢c?<”¾§]:À1�CÑK†ˆ\²wÜ“Ü÷Àž(¶ pª±ÅF4f7B/îõ¨ÕÖ¼™ˆÞd²ý×íuHN)Áï¾l혲aMß4Lh9ý/L‡•´Õ–¸vÏ?!®[Æx{sØ÷›ˆÐ¿E¼n_|›ž§ÌÒ˜'L>ä·´Œê½bâwŠ¢ÛÙÇ€‹Ï´p¨~í}Ü ƒâù#�ëûÃ)€ãiÌuònÇ¿Æ.å®~If5üMºë�Ájú@j‚Ý$xûÿ-†fn¾)¿ëã]gÀ�½ð{ ©­�ZjgÓÒþÙËÐÙ@!X­Çf£AúÖK=Ęé0ܾ«ŽBÅvXƒž_ 4€cÀÀ”˜ÑúF¦ªÊü!«®nZBkÉ ¬hµïÞÅ� ãEÇ6ô0€Ã5 ;ãßYŠ`ñã49*Jñåo<öf³u@דº)Rvå³Ä¿¿:à÷â¯eýé+}ñ=Ii®‰ë]¦Ñ¿. Ùeu޵ÉîÀS®ž�{^3ä( [Lô©½xø…}4FÄhL0/s± å*ÊoÏz_<½ö*ýÇøŸÅùü«�}™æ‚_BC «‹q’÷Ð$û)6†Ä�pìëU9dÁ÷~lìϽYÔ ®òˆ4.Éžùc…-åeêêMçV߇ºÜ×µEšÏÐô#âä Îæ4kÚ|Éošƒ¤O[~“å7~¾šx‡ßôÙ7„Ú»\ªÈ’ø$@×sU 2]×ÁWLA¸¬‹xðy‘Åb”¿¬qGçE¢AšÌÿÚôóÀyÒŠßÓú³­“0Þ‹¸Î_Sù1Ï?]“f§^];ë߯MGéÕHbrÙÖ>ËOþ›.Ž~©y¼N©~þÇÅ\`$ŽãØëbóýZu"â(¤zì#g�×õn0U-çãÎ%ý®j£"ºkŸ$±”]Ò´³·YRTõ²½ýìùd;¦ÙË»[66l2søöÊã§ÉóûZ.OÄ4$?Á8HŒþìÙ¥ÜûVùþ#¥ÄbÐdoùêaÂO@K9N<ô\�eü_«cøbð0KTéŸ]ÎòÀS¼k T¬&\§å©î}»:e_bk…²SÑ*À­ÛÑϘÄ € Û ; 8À€Hdj(¨p%À“ŠP´]ª·ôlõ“ëW‡IâðæÞhÅqê4Üš»€µn@!÷/‚Š áZ®‘™G“¿nv>ò`>!pÒx0Õ@ &yıâp䓈¼iãÐÇ-_w¾Î:‚�'ÛGã é®{G]çtre�§¢0éá•èJj½«“N’p:§’¨T´I•W®�ÛXé:ÜO÷dy}"œKûÁ!yì5$œZe>·ÛK{ýŒìǧþ1Ý-¾eÉ”ÞïN•JNW?'#NÿG K¨:�Ðû§o•  °’P&Ì—0$`層&×½høã4Ø¡nzÌÁsr2Os(Š<ÏÚÎ Ú·‘§O½|\¯™ÌM%I¡j=ÊÖ®gœ‹7¬±òW ¼/׋Ϳ½yií´bg}êP,¯ï±%S^^ÍÆ0c&úU¾�ìäU{Îâk&ÔëA´µ{¬9ì++"^ßÞuÁ¸6Ö3µ—©«JêÃFÇüŸOÿË{¼4 4é|ŒÏS‡�‚0¡h—n:<Ú2à€"/ èK&È7úsœè®jÂõàý9c^¯}…33oŒGâhŒšÿoƒ>1†[2@hKV `9�h�¯tN-—ËŸ.šj‚12öêÒÉ£ˆ¥$º:í.8„×K¦òŒÑîôß7æ÷ÁÆJÚ¸à3–ZDŒ«•eÎ"ú‘ßBN–Ê=Õø¥<5ÿãÝåÀ®_RÅ<Ó7U—[Ëeo÷¥ Õ"b EöªMÿC?¥»uÍçûß9Ä{hPÄ­ç~I7€¾9�%Z~Ûÿ–ŽÉñ¹Ë†j„âÓú"2fHÍ]Išt”|¾ÄÄʼn/GÞÙÕ¸8kð“™”O§7+/ûßO“ößtÏ0�·Š´ó¸ cµðA¢”Ú—¶û}¿â­VÓVЄN¡màúÔµsæï.CþÉ-Æn,×CYºÿœ\Ÿ[X�hM]·M4’3¼öóúmųò~ úø®EÒª}œƒï1æÒÖÇÇisÜæ!¸ør¸®~ûùñXªqÊÒqì®—GõúfbT•<÷. Ç1M­´}_¯FÙ÷i¬ˆ†WŸ×îôI›ØvÓmôT‡×µ¨ëâ¸_ßã6oœuÆš*öþþÉàPº�ö"¯^œì#k�¨òý§X5RobPZ—¦¯¤ùGýå� ófÅÙæb䈛đB Ó×ÎQ Õa³¯€~.&îèøãí*�7yÅg¸k ¬;øÕýéåê⤕à@:$‘‡Páj[Ô^?tëARûŠŸž™l{鳂 _~½¨(ªŠ#t­Ý÷F¹©h `O~ú¸ÿ ^8xDv DÿüD¤X€¼ì$<œø,Îb*¯Ú{W´üQLFF~9|D¦¨V2ͪšëîm>æxøòûóå©ý@Br.%è”Z9Ë_ ÝM‡"Ú2�ÈŸÇ:ï¢Þäô«ìYg!¨Ns9UÊÜ›ªÔwÂ9cp@UjtÝ5ö ¡Rw²Æ,HRTëK‘8z_Ã%�Ià`‰‚š è|ºb}ÈâÛgÖëjr â©aÊ©þûz«^!³ÛƒK+þ bº¹'òe1 ‘;x뛘Ó\i[@j½S�Œ¸çÁ"ù9ÃAðγޒ ÁA˜À~}þU¨[G‰)«¢vOÁ³+ß�Ü$ÜIÛg�YÃø�ÔÂMåi| cö.%N“Ê!?3Ðñ5æÿmÛq†tJý?¼ &|kgbÞì·ë5ƒ$ÁG¨5ˆåEöZýŠè?*PÒ°kÞ½1Úk csö²|q­Ê Êî×m/{tq'æá¡ù~ŠyÎ}Î6Y:!S~:j³÷´Þ÷t&ês+Aÿ§²rƒ0z¡f�õa13·*ëæ:KJ4#½Ê@CÁ¸oRM -J¦ë7zh®¶åaHÈ6vÄàçžÑ”I…²ûãö­°Ú?²’é"´]/Ås¤mc–ìúý–Lbóó`ç7~FïŸ��>‹¹o~#IÔ-“/ªSlÇ5ÕžæT{þS�•”EåùÑîfãø>TßøKÿû›óWr/WJ¿FÔï`‘Sù›7.6OF/^ô΄ÏÙöH,­MB)¿{bLºã]¨êS¿L5Û“°«ª=n‰i±$sÌÆG^¦w¸q0(-EçY¤õmEÿÒéÞõëÿU=b¦ö²¾Þüzæå]1§{Ò ·|‘IAìi9ÅKg2M+Ðcrñ)¹Ù1ž"v–ùiº�Ïb?CQ%3ªÒ:ÅJB´¤ßâGWî*ýÑç©‘‘1¡U§ú3ÏÛ>œžÇƒ°'踒°oÕ7¯6¼-弎eWS+Ýx�?n6¯þ¼¸pZÊ„¸ÝonîWv]Óy¢Ø¹¸pV5ʽùýO'ïŒd¹qFªÔG.“ùB‹pÜ}?fÙ[ÿ”¿YêË×)Ñœ<×ñ>†{ÚenpôúuXƒüû¬ì�ª�ç7ìΰ€’É^¬Ê=ëA¾¿–ª¼;U{xög}¤Ï'µølÐÊw¯ür56]³È ù �Ûj¨‹é30|#M¸®U¿èøA»ÇF'A—�¸µ?ä`Ý›6ÛS ¡ T°ûíŸý#@ô+±œ¿ýEp$•zZ¸ú«vƒ6ò}Ð2Pë :{ÝÁÝB|Û¡yô=Èõ”v;AÓqÀy à!p‘öõ `�[»8 `§€p¿Uì5èu¿À® Ù‡ƒ:€3ê`é‡D­Be©¶;”Õ¡D�›Ïý åê]� m•fmwÝÏ+[ó©Wñì”z—#(¨ÌÎþé½Zµk½.í¨]kÖŽ® JŸÎ|SæÃyôŽt”5뽪ÔVÙ æõïLo E}}•€³kC…I¤3äºæÕÍÏÉc‘CÏn¶J£I$pPH€vš'àIå° ð‰&b寀û¥Ó¼‡›hMLžr1(<¶¿Ö/kÉEñ3TÑb+G‡Fê�FÏ´ j‹‚§‚©*·•Áö‹ßbt’ñаgÇ×L4Bwé­ ü ^CÜ8?—µLàèÕè‰<ƒÚ—RkyÉ;nõ_+ ¸Ø˜bËýO.tûÈ•¸ÆžùFz=ñ\´˜a—„!›‡¶7Dâ³u;g¬�ÍwžS•³×zåç Ðr6b}ÆÏl•[ïLgÿpù؆¸{Ø�«·=}¬;Y&¢='¶ªV–µ>·‰ <–Õÿ4Æû¿úœÇÒK5y¡­«±IqÓ6vÆÃ4‹!8ž!°±Óû¯½,wªë÷Ùz«G Ñ�¯�@Wfc4à°§®¾¥µmÐ̶¶ÖXŒŽë¨7§L{œsþåFƒ¹û0…& @3l A†‹£5~׌yþ&ª„`ág”f“%&' 唀m†ÊÃf½Ô–Ú{¸øS‚ ³"CÕû´ÛqÚfôP™åDúÅ3Kž™94¡¶Æ×ð„„×@/­7fýš5Á´¦Fé�õÞ•öV4=@C¡ñ5 ã·é|ÆñØ?¹½‹†­I猿‹¬E¢=Öøe¿7þ»a}eãú½~½ÈÝ7·4‰Ì/¹�(“Ójâ©Å¤d­üó‰i�0ïöâ¦âjüéºÆa²ïìø ¿ìð󯺵ÃÒ«ws™×ÍBÿm3O’cɸVÅ•Ìà›A(>Üó¢¼*§½ÒàIéów2@¹Ö5gŦ©vapû[ë–bÓ·î›áç¹#I„ ˆ&qK>©9¦†E‡¯Q”‡fª÷Ïq)ûÙçö�8pz,·Åw3/ü÷B¾çŸls/¨ðžð\æ7æoOjôp$Ó×�dÀÌOggSÀ<ì ‚R`4MÓÿÿÿÿ$ÿÿÿÿÿÿÿÿ0ÿÿÿÿv~ÜëÖÁ¥žC_a� FëZ>çáý5Õ-_‚mT‰û•Ÿ>®1.幈‘IlMÐïâg§JT ý…6àUÐíØ²Üšýâ¹2Á쥭�r%�KºæO`qcÒÿ½u´a}‰Èíñ£{HÙ:¦ÖaTª¹šì…ü�28€Ö çûS-ëÛ{·«öÑ4è¿þq£!H4I‡Œ “®à!qU¯¿Ú€S°þ Ô["4ÀR 'ž 04tÿñ¹Ðk”Ñf²Uïœø1H@±bˆGÕ|&R¡xîTšxTóøÓCÎüzDšü‘ÈyÌï*ôçÆ@>æâ&BTp"êìÅŠª]%thÿåÖDµFd84GN¼¶Pq$îJ‹"hC> ùç)¯£¯PPZi¦‰P®¹^D~ÖZ@ÖØk* ŽN•*Brpˆ©ÐJŠSQ’ IBÔsØ�„`Â!_”B,€ÞGÓæ>�cÄKyÞ^�ÔG[NçñG!«¾48"À ÅÒly�Ø¿ö>ß’‚±±60ຸå=Šsûì Èk Ü=èÏøgrš%~ ¢Øç—i¶Ó»Ù`¢½¦HÄ>XË€~ypØ'¦ß@/T :úÞ�òþ—úîÏ^òa€[/÷Î8ÜÃcéÞ˜ˆÃ©ˆv Ó®Ú#/>Oÿý ñßëÒnßo¤ÔXËásÚv¡{Šù¼�– ¨~_ÙïÉOÏè\ë^Zø]éO¿ÈßþYDgYgà;ÉÓ¸ÆZòf‹½ÿ’Ñç´Õ™77ákøÐ×âƒJqÕ”|Ù,§B¦ÆZØû�€¿0pÀ”�f&’i‘¨"®ž±‘LKÎ`�(¢€Ä0|ÅI_î°UK9ü ô y, zUò�.Š|’ ÷Ó ˆu°A—†XèÎÆ¼[Ò{¿nƒ"uÊÇÑ3A ±!\9±/Zuºµw®®šnßw\Ô¸ÆÐøšÝ|™žþgWX~÷Ë·=*gTâ�¯ÕûÑj{÷ýœèT‰›íŸˆ¾·SŸŸh‘`o~¹´PæÜ|ÃoIøˆaq¿éj´ú®˜[â·kï«bÁ5_⢅R|ò'L7ÛZu.‘´Ã…Œ^uù¡½-bbËVº_–t|;ö„$~%sÃ;ncôv¸žoeƒö›ëýTµ ßûM¤q¡ñOíe|v©©YÜÆ¢çièX‘ õË"—q.[fHý8¿~H¾° GëS‰ %n:RW«5÷§›�H¶þ ¸X¤€¸G¸Á*¨9?ëéðÛ^~&˜.Üú—¿«ï¾îÎnÿ7âÝzê›ó)*Nß,@Æz3oO_kéëôS]ÏnøÏ±Ð’Áð³¼ûœÖ ²á¹½À`]厸ؼ%!>)\ÃGN›èuó-QîJa uî#°ŸÔ‹€¾/÷z< ¼Mÿÿ@G‡Tt½g/?­kž ¯//Æ „þÅîÁµOõÙ<8tU}ÛP8Å<Ê}h“ä¦_ù«£Ãº›-¨[Íôé_/šæÛ©‚ t Ð@ï×où³Pƒ;;´SE”¦�äZ§Îþ}N€2e€Â><`~\äéýòÏ €ñ.P‚üòRéS erXA")*ô”Ûø0.9>{ðÕÔÏ9Pa—°YùÏEöXø> @CA�¯pÔ®¾t@—� À<™ìFˆ©+Ïß¹�úÖGoÌ\O�{o|fõ¾ÄSb&—ƒª;[kñ˜mûÊ(ùû¼®È=…§,gz;3�¼™ø½ ”Vª ã<2‚€ˆ£ßª* ;]³êáCgž<ßþ¦þŒÒIíÞ÷\&hA›ÈÞ=€BNÆ µA:ÔÅãñ×Çç}…ΞENŽC�Tðùèì|FœFdàaU«TNIÀh,RTáö6ýpzWù—ë© ¦..…ˆP3_-ŽÅÏ'Ñ„ç%ˆ @ýß›yï1ôÈâÔ¼�WUœa)·€")nÛ^ŒL·Ó‡Ÿ˜Î…på+¾ŸŽ¶>éÍÚáçõ¹|¦«>lô9ïk�¼ŸüwŸpò«’ÛmkîÑf™?®jùU¤wÎ|‚×=¥Î¤‡l¦†µûM8»'ðN? Àìw8ÇŸ+¡ðd¶¤~�ûå<Ì›ï@³IWÝ k|D÷:Þ–²°µ µÊè²–]~OÄî–ä·ö·æD&Õ¸vöÇäbDv�Óîå#xôv7Í&ÀÅUæ°”)=jø¾ùe5�Ù@”‚—¿«ß¸zŒz Ðú 5ˆ¬ÆÿÚ’K9nD¦WÇ.TaBYDÿ³íÑ6Îa1S·� ÛÈHãɯ¾lræg�×oIÖò»,¼UŸ ˜˜ÏÆ“3ºå7s¦ü£$Žc8_>ßú%oZ”ã‰Ü‰$Æî2î½�|¥ß¹SýíVÔ;€‹ŠÓ;ìÝorÅ Öù•‹IôâÜñ¢¬ú‰ �—KºyhJ*½€¶U´÷]euäeZÈÜáíkö}c{^ÿ ª©�š‡ï�–x‚4íþkÿ¤ï ¡J–¿ªÎ÷\—2Aϳ"�kS‰Æ<îýf™Ü®â7¢¯v¥üoúJsaˆû¢2UÒw¹Æœü§Å—]+Wfa$z9�Šò`nèõ7'kbÄ÷¢ò˜ùuvÍÒÍöVÏz©ç|^÷²ë,øØGÕ ÷�ÂÏžèÛ:Õ/g¯Ÿ»ßòn¶î¾,üÆp¼I`…àÂ{‡O«*JJ’Y_D>í’ãªë›qk4-l›Xæ§¶è¢è@•×6r6~9\•gî¹xˆãÇRG½‹Â8ðÊ·.0¿ôÓi+âÜŸøwðÝ£ÿ™`Þ‚)L× úžx(cÑT-?£·àÚÔo?}ÄaCn�–Çö=¥·î�ý¤Á$ÿ4L.l7P$ À é§´*×Úÿò4¡èÒ:]{¥ï«;×Kÿ+‚ÁGþ¨’ ÜþØÿ!“”¬$ÔT …â€gèÈðWúo�½ºëÎcg ðúý�¦¥�5Hñ‰™ŠJUÍÔŒX€^:ÀþÛš8=*Ä!TAÖL\šûS˜ýûª'À(¸ÀCN=— #Å)Q€Úìk3DîhJÞl#©ÎBj=šÚ-³<4S§S›¢CS牜fe®¯ýÜw‡KµËtpªÓFÄkÑ¢�8q´”<R$ACmª2ÇK¥µõ’žk88ŽTpœ£€ w�­eJj„9jt$ÂOw#2P…À© '€Ý�¢Þîôh˜ÐnĬüÕN¥»n_ÌT)ÕRʾâ©Ù«‰Þ×î”ðTìr–[ü™åþ•MïE¦Õ*…‡>=Š:øÎóÞµ»ºgê™4Œ8º¦žòÌfú3&ñ*_—rü~æãì”’âÓª]F“®Ñ”ðì³ C\9bUgËu­†ho›oTÖ¸%¬WnÐ<Ú‡- 2ñ÷Lé>3Úßg·7|ËÒ>„XÕÓ%I}¼ÜåÁ³ÂÐ ç7ÿ�æ?פϷ¡öG„ÄæËùq¨/5pr�6ÖûÔ�ÉØüoúœ^¥m ÁËH17vH{ÐrÁô\ GZ¿… X52K Þ?Æ×ýáký÷8ˆ»ÎY]‡, –2‡€. GQ«yØVŒ"5d®Ø€¡RÂ[ö×õ|ïn7bÊ+®4¬Ÿ”츹֒÷¶nPL´x‚²è«S2à(­EÉc4+}–ÓŠÙ¯¾™roùQNŽþ|œkгªaŸãçñoÍÕï@-¥ä}*b³Ì5PK×aø›²¯‰³š¹˜O�XãnÎ{þâh¥Ì{“!÷{öUᡯQÛTõÊmðÓR’î²ÀÇë©Bݲ˜øà—§÷‰;ö6qß\¹¼¿-ÿå×óøàw@b^=NÎ*µ3%Àyö@ÊØ‰~IÕ>Ίîz£-à}îOœñVûm\¼·F Ï{Nÿ½~"ë_j¨Â¯ÿlÙq¾?„O“³‚KöúÍ$rË*VþÕ]è»éyjëy�‡{üýgyÒÆ×·¦³Dí{#ü† ¿bol:¶÷wÞŠxN¤©.óm߾ϧ‡KÏ}]_ÃóQF.ŽÔIð.X·üœ±Y%ib$“4˜P7›ifõû®³±|ìÛÛÛšåÓ€;„ÎSÅúiå˜ð‡@6(œ‚GNL¬¤?j ;w-zØ?Ôèé¾e“ʾ�†_¶J€›ëóºßµ#¯—0âà˜¸|êD <™â÷ÁÚ_žZ¦óÝD¿ pÁÔ>¥QyhC7À€]·ë¿öž¹£g:©Uáj¯†ú§×NÔ½æðNppÛM[«[ÎÅöù_�GôÁ4´O<$$¤Ð×Y$8„t±�æ–ùhࡹêû?ÐÀ–yTXÓ/ÑK1Žñ[¹wSäîà¬fæ÷‘]1¿ .™À¡Y©ëw¯”>v‰Åí„>½ @ x§$Š.ˆ ÈGö#hç¥öY!Ýî “ ŽS³çÎ]â%»E¡3@2ò:‘™òêÚŸÙÔ~ïJWghÖý€<Zƒ›Þó÷�ºÇyÕ«®’ÚÆå N˜²‰äãKõ�z^’±Vg]’Ì EŠfj�7§¤xǃKæ^r²?�ê†Î¶B¿néIr‚�]÷80êf PHJ0`U.ëuª+ã¯x«µ³v1H¢¿l5ÉyDaýñú?N!+í«µÐ~.ë Î1X WÔ¦zRå®–"ú²w1ÔI.êf�¯�ýæ¦úÉÍyIµÉ’ú9”°Ô¶]L|%þÝk¡æqï`r‡ƒÑõ˜}UK7‰ý|:GXÝx„ÝÇg-ÌMþÜnY.gÉÐðz}5i-?Í|³¨‰ÙûYÓØÍ¢˜TýN^„{GÔŸ¡^§ŽÈàÂHs°¿b8‰ÎÏǸŸuKÖ?=BT…‰Ç`c ,|Õ¢=®k¤±Aœÿá«°�Ï^nébvÏuPäV¬s³©‹#AWò~ ¾ÓùSóc˳=.€¹Öùççú£àRÉøÛíÙŇ‹«Ý–#e 輂ðâ ×6„©[(ª¹÷—Nàtl¾~¼M´ ¥§—½]{ß6â:[*“ØF¥Uwòl-EÓü@+tgMtíe²Éo5)84‡ÒÔb¢=eŽ£Ÿ] ³&wåëUª®ˆúÙÅ›Ød¼ÔbœxÞrN‹f–Í1“E,øÉþ÷YD“ë´gbk±Ã·œG§r�â…¤ø¤wÅ�ó9in•÷ÙP?i©÷»ó±'ér.Ó¬ë¶Ipx— )>;7nû‚­êqBü‡Š!¼Õ1†¯Ý-Vgÿ¹Î±­Â$®O…Ùʉ'—vÎ«š¤ø ã¸-À€=dM†èQf6ÁG\{³¡w›²½èt�§\$ Ÿç™nKÄ%ºmSD奿Y¨âòÿ_ѹ!�]}½ ÷”ÎÈAðd]û¤Úd%³æýæqYî�b)¦ÍIúÏvÞÎÙòÉŠ2>ÏBq|/ó÷¼»Ýï7ošŸû^Ï»øê8šîŸC~¼·»ïs,ç[�·I³\e ÷Ü]Òûqé.—>¹ÚLµÚ?W«ûû=mÓ�]6û}U…ÿnÉ‹åréxnëÃ}WÏßתˆó:�î=›/Ó¯ËrœóÇœùÓyç®{l§Ì“Ë�];àR¼.þü{çñ=ž^0WOggSÀLì ‚R¢;úJ«¯¥´±ÀÀÁÿÿÿÿ¤ÿÿÿÿÿÿÿùŒëo½ëw¦VŸÂü,cžóÐJ8Õ`³õÝéîöû9“Ç_Žnåñ¬%ñð¿×Š|}_5m�‘k§®äúäÈE]âSB/È=ä åÃ2ü`ë™Ox¾F»ÅXá¶_ÓüÇÂïм·?ÿЬ¤´�›´õ<�1K#· =ø7Êc T_Tú5�¦y3L�Ð!SìÒÆJÊt©uv÷lëÇpXu^ºv­ýQ”ûOÝpg+wyzÜüçø’ ¡lŒép£/¢î…×ýx‹O�^¯ø×�|žgx—¦¿Ö:ìÕ‘̈¥Åޏ-õˆˆ®õ$Nq4VÈW÷œŠó¦éþ%;À ø«cš§z ŸHÕö¯»‹W“³h„û'E<õ ‹ÒcSáÞ¿l!œ}øÒ/Þ&JËÜ\=òªIÿV¯ù¾rÌù.ëù¾` kê%Í^–$™ös4:¶+¨ ù¡Ê{½õ ﻲ´š°›~ócÇÓ³®R߸L�¾ôø-¥z°úCb`7Î[t_‹LúÌàK,iQì/¦”Ïüš-„¢à·Õ¯­ã—"o¾ÜO~ÄþišÒŸËê/RÔ�k¯�5<(æºÇÜ/íbÇq¯¦ÆîjDPxû»(™pÀ�ogm ù<è�plApÜ2‰qJ8�ìIñÿkÒ*õŽÞªÝX­�Ëwl|½Íc§™y6�0™½Z“ËÃx±ž¾ûGÛÙøËáíÁGuN·ÿÃÞKšúô9O÷v-¯#>¦%ä\lû‹Úìw}]ÒTŦÏ|êÄÞ“-„£qxï#o‡«Ž7¢ë¹[îÄý’ÿkJ]òG+òxÝz¦‰Ô—a—fȤj_ÙîT/óȾñ¨K¡d*»hÿ™´ZZU3(z™ÔÛNæU�ñåt-ãü§qù0­ô£ÏÍÁWõou _#ŠûXzëmƒ®ÃT ¡F¡¹ªmö äªæˆñ#â§ q_õ´²ÚYð|¡?UöãØtç'wÿí$N‹Û)'>þ�¸íOXÿñÕÿÆrí/úo·}=ž�ÿâõïcÀÿú+†/˸”{]ßÝÜmb}nÙG„4︴Ÿ]—Ã2úègLË ±iùÕ–ƒ;GD€�¼?ÙB, ç�_3Õ—àP†ÑHªå�æï_~Üb�ÀúVøRR½š×ù›¤XØœ®�MAùá*/ÿý÷r¶?ù!ñéEOèh·¶q†•e,@sÿŠèn•Ýép\â&ý|ÎGïžûg’­œãÃ%ï«ü´h•ûa¦¹Ð®¯£:hylSÿËëUü¿nmzëéó?>ÅzÄ…ëÛ¿ï[â~~­7þ|þuïZ׺¿W/µÁ‘yß�ó,çb X2ܼœ—Gîk]ÈÀ@íú v^o¤nÌõ.·Ãîçò¤Š´\8u¾¦m°‡†ZÌÀ-|/Ì3·é‘áÓA4Ò‡uüDš±ü~¬Ù¤XRï­7eœ9ô"â,Qæ=ùÍ{œ¾KH­Í謹�… dÕ è·ÿ–6JÑ|*Ó¨Çð«v€[ïrë_×ÑxüOóëúw¬wwOMÿ°_w?âØzfï³îµÃ]æYǹÔ*|zÏÁZ3®<Öoí‡TëÉþ"‡›/É ÅØ@>ÿ®ÁiÒçy¶”ê~wê¤/vx®â±OXÝå‰]Üf›„¯(öêDí\ÄB)qM#/Þˆº£p‘0<¯®±Ú~,4ùQºì.êÓ8=Æòr©µ™žãÖ™wº—;ÿ®~Ó\LÉZÄ™Þîç“ìK݉½?n é‹·�̭ו{kûÂ¥'?ÿ™³> pà ÿèÿ‹ÁÚ¡ÎÓ]€[±×Có§Ðú`Ø nP·VÍU«Ö|ØÐ¶þïÏ€måh¤öõìÿÓ† N˜¦Ÿ~¥çºðõ½]·0 ¶òo @(Іƒ‹"%x ñ_Ó)€ 0Þ^åE—ÿû˜ƒC´˜_�ã4dœÌ) }ýølý†àr¾Àc™b™A8éH‚NGÒ¨Vž< Lû¿üÊS­ó”N+ €*ÑLéªÖŽÙÉ|^l™¡°]Ãuæ´8� œ 4PÛ»úˆôRAü¶—f;éD¢µØÑ>èË÷ÓÐ[‹|>ïÕßy®|êç&l�ÌCJ#I€£ûO­OCà @±#P‰…*ô؃c@†ªP•Â’€§y$,S‚,óœN9�›+¤È*�s¦Ù&ÇaçÉ‚•÷zƒ.ÆŸù«Ö¶±‡ˆãõîž[«Y÷ûœ³àÿrKŽòwAÅÙ°÷~Ms1�z«€ùêõ³Ï"ž2¸ÿ|‘»Ö¿RðÌé,ÈÚçÖüå�…׿¸wdXwOòp6�|ç+NǤZ¿-Æ1ûTqYE1ݱó E×RùËaïH¸5·™záöìà²ý:ÛßÚç9=o:À§ràp‹ƒ­ËÍ-vv’`Dÿ(±VÐ�Ë.^3Þü’‹Í=/zÈ—YcYìú»pï5ê®;ëñÛú7kº*–„yxsÍb‡`ú¹þʶöÒ�ç ,Áú­/bÜK`ÂHuú5Êh·R5Ìû¤e}IÐåUå›ô×�¦,Æ¢D ªUÑÒ/ðs^pß¡CCT3E ©ºðwrÙn˜aE`9˜ïˆc.ùQ•¾ŸE*3¿!4­ÈÄ!»�Ø}jk²=%­Úר‡·“k0Uu:¾æxOOëÁ™­3f“T{ßGùê3¢O¦æõÖ›„Î¥dˆØ%ëÌ}©u>-‘:ƒpsSAäA;¡ì‘[K®XÃ�gÆžÕLOÙýÒËLÞˆ=Ê癿Î_•½î¡ƒ¿fy)S¢ë¸ÿB95ìîQq¼$r[çãþù½l«áPÎý÷|÷]±¼ö·çð}T«ýñûÍêß ù힇»®ÎasìŽsÝ»óÿÝôf˜ÿå=ê¾§ïùú_þÛnsÛ¼Nýe·¿¯âíÔý¾Cz?öùºÞÕ÷]³ŸªÉ\ÞË3φiÿ\}(ã$K“¦K›Ó/i½wqw6šB¹«v]›¦íy8¾Ç×ÍíоxÍ3øøcÛˆñ¶-ƒ9€àÔónóèàÍä >lá’ûü�åüG•Ùéñ•{s׈Åè¶dècX?ä�?l–ÏÍö�7�FLÛ±ŸAëøž€7>ÞÿþOô@çfð§™7ê:Î6³Úñ¥ïµîø·ã_D�³‹½q%Þ±&ÚV?W(€‰[�…Gê'On̾¨Ï6¼þu[®˜€Ýöžî¿ úmˆmÿá ¢ƒšÀ È×Ú@Ã4B功`ú÷è`&‚R' x>¾T„?—œ¯/€¼püâ‘I†|ÕCÅ×ù�¤ŸH‚*<ÌQÀžxØWpÀX 5ì%ž÷ËÛgn9¹¥=„æà7²tétÝC"Ão�—ß+*Nå_`j.-N�E€ @”Rà+I\6ܺe³‰ÔB g&ì´Å47§Øãàxôù{ÿOò„× ÇÙb¶roÙ4¿áÿoq= ˆ›~&­lè-[ô;üÔi—ù硟‚Æùj{ƒen«‹¹x_Ez”3qY؃î|1üª‡¹>EÙ?žÁóÕOaý‹ÈŠëûoJ.2|Íp�„)ú'SXßSMØMƒ1ã\�O6ʸVކ61§¥Û<øÔ4œ·@ÏÙs¡a°µèÒ£1ïp×k{éÐ5ïߦJ µo5WÝâ!Rˆ8ªO÷ÕÕüÛ”Gíêg~ôõC7C¤ëáž°ú–Ħ=Xóã¢ó4#Ò¬\ƒ›�ËšÎä}Ÿ/ët`ÖáO­¦TÌ­|yDþ\Õ–k”x`Õ^‡ù}E×þ€FÚbXÝy¤%»¥”}�‡ô°¹£J€Îæuòþ±B¢*Ë—‰ åÏYŸ×­ªŽ –…‹°xÕiöM‹<¹ÀMIŽ”gì1ôêà¡OMóvÎ(Q€¦,éÓoª§±\q$-Ú²–ìfH„xÊmÎ�&<¶î�eÓ}˜â÷hs²ä+iŒ¨Eõl"’fÔ2Ù¥Gåë‹ ®¯æ™þÿÏ ªq$âuœŽe™Ä!K��k6îQd¦Ùï–¸ÿ‡ŸU|d5EZP^vôŽ3‚Å€òÍw~ûÈÞøK™#}ý�Äú•”ø©üUëZŸÑ™ŽYä~ZóÛÝ<ÿµÇ÷�ËgWð¶] éí·�Â5ΔžLêÇÏ�4nžü½ûv«õ«�Û°þöÍD�·¢ü3°¨ÜÐï]q¡pö‰! Ü€òͱ®×c´ÍOƒ'À ,øüÅÐWƒö¡ž<S*¨s¯ÿâTÌÍØÎç ôg¡h2¿_m/ã¢z:>”‡›nþ4€8ǵ“À™T`6ýðp(à@O©õ4€xÙ½ô¿ýPv>/õ4—ûYôáÄM¿å"4™Ð»ÿ²`äào #Ƀ¦ 8EÑC�J>$ѺìÉÔ?è‘[Ǽÿñ(|•´›KÉ# #¼§ ¹ö½ížÔ¦ÎPG¡{iª#J(Àp ˆI¡R-î-í…ím³:Ç|ÏSú*Lµ=ÐþDrU\0KËÇž}•TyFùªÏ�îƒ3þï¬hé´]©“Ÿ¬70CÝÛ¬šªªž†ŠJï.ˆN´9àš †•ËKÈèì«Ú;o­6gÖ»–hÑöÿXæ_Y £C§Lé÷¥uhVá½öšœ‰÷²ä®DzÏößL’‘‡6‹-–¸Ë�`SÂ^šÂ²¨áLº—¿øS”…ZO Û[­ã—¼2&T0áá<29úÀœÊIÞ¦ËÆÍÈpmmâ§ 8‚+5¼úO:ç`�×u�×ïaò`ó:ØyãŠs«iTHG%Öè+zωP_bœ™ 3UX4Q/"O�EÓž¾éWº·,.:Sa×ͪ¤þÕù8ÂwÓ�†ZÿGeyX˜¨6o3þ9È9Z2N³.[°eëbjèJ†6 )ˆ)ó« sO/_‘±)…R:(˜Nš“×øâH²AÀˆ´‚R E�/››+’E9’¹„Û`€9årdbÍ$Ù)I¢ÌI—óyJž¥ÑôÆ÷“b¦¾�ið �ÿ¬ùî£ù’u꺧½éH¾sfŒÑÊH4äºø3r9Jäa¢-{c¨9«ë G5_:©ã¯¤_Ãé3Y7¾Ü™kñߊϵö}î<;´ãU¿ì6«è ßúìc�·œ[ö–HFÕ#.V¸~<¾¯Û0JG¯Êòp9œ¯Ì¨Bרµu\&µ´·Gw9o§:¥¤ˆŸJhÄOm<Ÿ1KÚ7~Õ[šïH.Ô©Ufe׎83T Ö‰x&" sßqã/ûëà›&vagžÌó1ÇÞˆ$-ªòùYÂó0>œ÷ÁKpî{MN© ±[E?Õx/Þ=—^nÜÉ—ç—•w¡W£ ñ5%Ž é¢âOggSÀ`ì ‚R[.™Jÿÿÿïÿÿÿñÿÿÿÿ ÿÿÿÿ ÿÿÿÿ >ùƒK�õYE¹;$=.•Ôå£ Û‰@už�ê~ êWYÿ ó‹½ýåDì¹]�4QøS ë`qóÙ§nÏÑ÷…E_Sü÷1²GGƒ[ë3Ÿ3°k¸ Ú­š0åð3À=ÞýC¶(@üwYÀyP{ôÉ1êTàÿ~@Pzæ›þ±ĈËPë€ÂìU˜êî·ß­“+ýÅc¨Á鯇5³€L›Å®D~Œ¢¤”g‹œãUP£à y€5…ñعøB£µ€à€‚Obª`ç{ü€è°Ÿ $ž%€ÃhBæ°õkéO@º©èæ¨ÙÓ¹Uãe!ð ¢TGŸ~üø _5Þ@ú½~vy­ þì÷~'%ð T¸€¤$ ^¥¥õí „9~ää˜ùùÇæÿ¶ÓåØ3ÝZĆEss<�þþ>|üÝÊß“¬MÌE³#´lɽ ¶ß ~ï«ñ4µaŒdÿk ž¤Ÿx¦VGâ¼l‘ã½u0�÷X7%/*Õ�§wëîbSâß´ÀOóãŽÑ÷úk»ôOG´Þ>›L�,a†é.{ ±f-*L€fâæšÖ€Zö®½/øØÒ8Æ€‡Kß5ëÈPZç�¬¨ °ˆ¨ž©6}ÊV/Ï?Y{,8zßW†[ø^Vña³T]µž –êm?¼ù3‡Êd-ïüŸBÇ¿„eÚ{à1¼:އ‘¯s‚žÅQZXÎëà è%ɪåc-ÑÃ…$³¶ì¿à¨š œh÷úEçöÙNûªgt¸ÔkBŠúÓ­Ý9;Ló—f-|g!Ko$m¤Ö'ö›••ò£Öj@é>54ªŒÑÒ«ÌÞ]ÔŽ”¡AŸ•  Ýö]§•#2ø¯ÄJ¢‚ÍæÉ…ù+¾UÅÕ«ÄÛ�(ˆÇìxíï,¯NCð±çrûz¦ņOŸ[�NÈZf~ºÌ¨W2Aq:y<·íø=†\¤DñO¸Ôã mív.¥X„ð¯7µ5²!BixY\ÿ¾ ×Áùö¯ŠåüôÇ=è±Yv�UÚ91$_ §‚XRs«—Sìü㯹œ,¡+~±U³¼YÃþâó}÷{É×ÑúEVirÚú�î7öÏ@,î¶²Vlµµ#ÎÍ}So�eÐM D*M�ó?Où/ùçŒ)?BËnëw8ÂuS¦áÖ¼ÆssÑ`çn´Þ˜$ÛÅ¿Þ'íѳËÊ"øH\ÚûÏ÷#y“º$ø$²ŽX³÷�âßöùd×Ï_û\~=¬«ô—@h×^„ïùϦRà~øóƒ�Ìz@¿$] }Vû9k~A[ô¡v}Z>úO°ñ> 3Ô±- ÔíýÄñª– „Eã‡/B6nnÿwwZË®íålÜOÑ¡'ê ÃÓ~2EA€̪±{?nAΞç6?ØV§åV€ºwäÛïó@<@«8Pÿº.Øàëc¨£û’½П“Œ@ë“·»Ë\ñq°Æ€W­XHö½V s N © <ÐÀ�»ÓÝ Øú]�üX…Fü>Ñ�&ÿ�à°û ß­8 ø:WN_QºÓG2xˆù'¿Ñ‚ÿ¶¯ôñ\hˆÙƒˆ„§ÞÔt…ÚŠª|0B\tIJ3Ò Mï¡¿Ût?ªÄ 13@xÏ@þÆ}A§}“�ù›‚d¨5 2�AîR½ÅêDž;ß—°úqõU˜…ùh0·Ìsq¦è£›¤¶×¡™hK˜i™ó]a€à�Ë®’ñô5 r`¿ó·&¦¸üöÿvÇäQ’¸ð·²f?{Û—°�€¥•’¢ºýr»ßçÓÁËÃéœ;šçÎ÷ÝA€³‰ƒ ÛU¥è¢­ç0¬ªVÃR¶4±llpÇf»Økå��ìò¾;ÚÇ Ÿ='Ž}‡Ø{¾è:‹¼˜68ž™ mjíÿÒüVqE�Åïô­Ù@n&šÕJÂþÉX±È‰l½×�uòf´óœœ¦.­«i Ô>Ær- b`Y¦³ SúÓzµr�dÛ CÑ¢dÁb4ºÿª+µ /_SI|¶±L8ã~ mˆEåxž–ëÔœ_ˆÁ:>9P`ÊÈhÿeÞñ-çÃÅû–Ì�Iá)•0f¤89J=ãB. 2”ø¬|lJ¡Å8}ºšÌIò´8ËõUï¡å¨,Z‚~FXcÅ6F>v©¼ »VÙxaùަC~¨³ÄKKo.¢ Zaã½�½²ó“ÞcrÊÉúZ$÷�Í.vxJ»Šþõq!‰Y[2—›�C¶íþºj~+Nz<ŸÏ–+ï'üϾ¬Wæ£ðNVFò*’ÙþüÛš|q_ñÒ�ÏsÿRv÷‹®Wó^eKïMµuLÒÿ�PL/BðÙrnÉ H¬ÓÊLânASA3û¾¬1Òý¤ÄÝ‘â×"� œÜé*�ÆY@§í=_þš£]Œ-sS£ém:Ñ:HŠõ*ë|œdÔ4Y–Кõ¼•�ªøØÈ¼ÊÆÿ)* j¼zxM±%qQú¢dxï�Çð¾KK^MY¯3p{›�/Ðmeøý¬õ‘Ê|§Í4žµáàì^\¾øKö3«® –c�¨�ýø«á½™ñ@êÉ ø]ô|eùËòú­‚ñ/³�>n½´d‹—@Æpà.À5Ãý*Ùèè̃ÿö ÀÄ êéÒgŸ{£¾~ô1tññoOÀ Àþr ÞýñȾ]¡Lûj¢¶â§c@6·4;À®ñv`é¶¾t÷ÃÝû*P×߯¡ØÀÉ`ª£ @±Q1ôßû¤[’@ãUþ>ÐÎ/&€¨ù·KQÁ�òŽ@T¨PCfšuwET<ü#Š„Ês�J*ãå�¶6ÖÓ­óå·yލô Ùk¸†”›è¡çUNÕÉb[’¤&'úΠfÁuÖù9I"$ƒ’ Ð+™éHù”ÜÝ%“TÉ€N›kñÝ“4›g� ±plT.ëx UÁ0“Ï^ïø@ÌSš&'¸9)koSeŠ{ÏÀ@Có­¾ÌÆa=½€¼øðÂi`,¸d‰Ñtx©iú�oÙŒÆßRû×XÍähÙh¯Ì!Td>áí©†3<»æ€N¾=¥Mm¶Fû‹ãnÈ¿é]\k0yÐ�)ýu5ÎDº‹¯ÐEJVÒ áðÏèQìs=عéÖn3â¡Ä°ÿ³…VuEÁ²z�Ú Ã¤TÖE± ›î�À�•D÷µ~}áq(£Š´Vq~°’MÁ*n×âMrù^u-n™×MZ �ªÉIàªÉ ˜Šˆù¬ËþG…¢r%óÐjå >ëÌ?¥ãÿ„>©®.M¥}€s•%Yã…�Šê3S~†‰ _ò?yÅ‘|Í#Ÿ=òÌ:›•÷&‚Qð¶©ÍÜbh·Û·xþ×j"ç³æ2 …ïÇF‰Ó2éé7Æ�Yµ@àÿë'ÃQì¹9[¿L{uQØM±“Öd+YçN;cXOw·D>¾¯µcÇ�²×3tôWÖ}¼.ím¹^ë0¯ûÃåäß.Ü�ÉúäKx¼Á0Æ‡ó”— êÏþLG1~ï�ûP„j[™ºlVÚ ìÙ�áA ÄÑ¢[ž)T¼,ø+i@½êE”¦ëXXÜÓ¤4K§ÜÙ1DE˜ó. q¨FY¡Oj3A¾.‘‰ÖŒ ‰Ô% p`}ÝÕP­Òg(’ Ž€†r.íØa²P *ÈÝ`–ŒØð’“´@Þ6H«ãõ<>_¹ÊÃñ={p�ay°¬6·Çb0X ÇmÞBö+?Õ¬Þn/D]ß@­u’EyâH²z| Šj;V»ãÊ[ûÃ>Ì:a�Œ .²5h&ÀÈÖÊèŽ~öÛÒD¬† G/ëhr=ù‘?±Çû}èÑp=‘a›éug~ðßÕ¦(:°9B]Ò¾{Ì" �Š�o·1¢£—Dc̾n6=O*sl@;‚è&àØÐþž}R�Én±ì Jâ­¯÷¤`'K¢TÿK(ºŽ“{ëçüx¿�íi6û‹¢ QnÄÓŠûe3q%#†2ô�Åë$N³2ÏþFVò Œ¼{^TΆ…œ)ÇÊΙ&ü Åÿ,ƒZÌ(€C¿ÖÈ­~µ~.f8X±ðHmùœ"¥Eöæ¾#ü5E¯>ûýnMÌy×-±g|Xùƒ–çÎòCyãdîãê>)±õxž¥^�.Yïý´�w;®c¸•šÕ|ç•ÀÜŠc©PÞßî¹»ú�ÃÕÆ•¥pKÇ_oòfd‚àê'U«ÕuÌÙOºì4lƒd6gÕ*×ùøKûÞà9cóaò›n7_6¨zwÈùÿ•ÖÀ{|«G®W¤ø¸§¯o!C³Œ;ý«hõž)zgø+”¨EPT‡Æ·è\(·x-Þd0k9ín}Üì{W—;D—‚4§j2òR†|ñ�ÒµáÀãP×f·~çåÐlQiLˆ—ùö½]*›¥}<æAcËê1½î‡‡§ÊbQã¤Q¶K72¿ø]mÛ'å!U¼ž¨ÙC`¬FÏSÚ<„‚˜Cž¾øëÁ½mq@vòaÐX�Ãé _D!|Õ€¸É»_)(ü›ùÕðº'!ٯߛè{~ J{s?Pôkpóêpóo¾¾|v«MíÒª}†¿?[Û«[=á.À ®<Ûõ2Õ¸~d �nвð¶$¬''èÿ{Àkm¼ÿýg@ÁÚ Àõ[”}Å:‡ 7ß?;'õã#8€~ÞúI€" Žö;E;t�ßÕ*äÙze=z@»­€" �­ð ê�Gáf˜ ùMzfnêñ—�yyýV@àCrû  uOïP!l5S 1Oñ ˆ2á…Dåb·s#2IÉPh ÐmÅ®z–¬’QÎÒŽ@¦“‡=R' 8õz>X~ü÷ºâ[ÉžÙ3t£ÒHahžŸ®J‘!™>&î�ÓyF^ÏKâÚÞu˜ÊÂéz³ð£í™}”ĸº’¿/"ÒuŽþ£è¹–™É¥ÁhÃ-ègî÷,‰ "9•[‹·³}d̃„Öš¥s÷h¨awðOšÐ¸=éŽ!¹ŠØalÑR=fvºò7æ$Wm¨F5¶Î•¹­Š÷ûKGc“;�_—›ïJÉL âñ“_¸cz×!²h’!t?Ìï— $¢ívLqÚZ?qHß<ó[†x@’…| ùŸ£30*Q=ûØÿû¦ÃcŒa¿YÔl$pÖu8ä‚Zë$ÚtL0^¢»Ì§¬;mó‚ê”@`¾·–gVOëóŽoã7£:å˜côµá°Êx.¡gÛ~^ÒÍš-8‡5ñ¾)¯t"Ú�˜Ûl¡é|Æ;YVE\G*’ðù}i)_û±i×u‘ñÚÙFţÅ_µO6¦¬5 À¨ŸÝޱtH¾N=¯Ä’:œ@ݧü/y�]·“¬×dL„j©0Ý/ÆÁ Z-ðy)>Ê|oa꯳ÜþJªy×YrÒHùK»°8Ƽ�m­ÕcÐC.ZAñÒ>óÐjñ€–Y“E]ho§•Ã`�ñÞûøvu® Š�‹«î|9ÞžŸë³LrŸd’´iøF…±ÆšOŠB>nY¯uþ-{?1.¾gá‘lú2rËŸß’õ4Ý~©8^®K�m¦fOggSÀpì ‚R¯O½ÿÿÿÿÿÿÿÿ=ÿÿÿÿGÿÿÿÿKþø›ígˆ úx“Ì�ÝØ‹Ö½]ó�íi!„~M€Yß iÿktk©`þ+IT8þù'�—�ör$ˆ† nîþÛÕÂÔÖ»´×Ìù¡OZ&˜°oµ¿ùñgX&\[¨xM@¢5��†ç…ª£7j”ŸÅæ+ô%ö¿_l¥:T‚[_žK­(ä9xüWêýÀà ºVèc‹*d­Ãv@þüû'ènÚü˜µÒÀÈf÷ xÍ4š4ýoãÀç_ü€ä×/J²™Ê¨tWö?|8 ô*p *Šû/³<‡ž�džòPo?C¨RÁ¡ Î�þ-Ðh¸Ú(õ 7ʵÈù§yIx‰…g%Ef¼ì d(…¬NÚÝò#Q8»7 µ!^5•ŒŠ G’$ȬP¶à˜óƒP/½PÀ¿o?èÙ Tz ýÔ F¢x2~×�DáÝô�›žV¯djüUPJù|Y®d¸� �º)ZÂÞóí³ç!í½´öè¨ËŒB˜fÖ]3øR¢ñ_l?]d@_\ ½ÐÌ¿‡@bÓ+´ÑE ÓÐk®ѵè_£Ÿ æŽtEßÊ{WÐ*áTWvY[NJbÍ\èp4q™£¨‘n¬ázßn_[: ~¾ê~!Mð—%ü”Taµ'ø·™%0§ìÇ;}âïšFŒÑw|¤ƒþÇþÑQ·aƒÚ¹™ÀÃ&« {¿oºú²Åê¡¢j»·š˜ò‡žžçV…ÊöÇ�Þz�ü£OdŸ$Kæ5˜dCϬL zÔvïråæŒTvõ”y š>Ů˅PéG‘7„Ò®|MžŒuÉ–úÈ Â?æñM&ØTé²õiƳS�³�wh37ÞQ«gÍåÆŒ,ë(TW!ñéÝ]ß÷ Ç,|ˆõY'�áé[¥~~·>7„€ÖuÅ's@¼ÀŠ1f^~òöý`aM)²” ìá�È…í(r*}Õ�’3Âìoyë s•ÿÇT¯ZûJAµjÃq;l8ÏÎþŒÞ=›ýü8µ"WC¥iÆç,’“œÚ¨WÖ³­Gz©1ùÙmRÏW]œ ÒdÆJn“�óªUÞË �Ïß×nEF—v«Êû)öÉ�§Pý¢PÑ.$]ú:eg‹ŠrÛ^UE3·`O™ä?ÿú�NÀ$œ¥Âó©‡cyXR‰ÚêEXYžÙ[>Š`�_î,£ëØÒ�ËßþIâ¢�”¯8ý׫,.QºxAª&“õ.ûí²lI˜�LòöMñDýüØÇAž–-özþ¾øf+û]­%¿6íÔÒÇ…1_Y@¼õƧͧ¼%Ëæõg‹óu³Ž·×\§õ¹^·¼¼q:qႤ3ìwnC¡�$»Dïâ½^¼U¶ÄÒ,øÞøsùŸìó`•I2…Bšyµs¿(¶¯¼×«]zjÐN~¤yºˆˆþg€�7e¶â ¢PïU×q…mýeqHä·ý–L^ký©3²¯ Á�G?u® Àëÿ®ÛÛ…D¿2ÍÆü²Oy8ü璉ÝÚ}�Ã�ƒÖ¯ ­ª…þÇGÑlÙ%øØM ÚîÅ.wïð�ûöu]+\Õ6ŒÍÞÒúëW¤+uù¢Ñ @¾€Bh�Ùú8£WµŸQj+G]S¡¼ͳ“šŠ@ífw*ÀW*ÎQ«P{ÀÁ©Í£|ì‡Cœ¬µºï:•_»®¹C$4÷ôNƒ£×Ñ G|‹ƒÐµªÞ?A%¡R24�sýoÝ+5ˆ�Š8 TÁŸXx4�HjëvuDÞ™��¹ò㡇ûš©Uì�0MNè*B�ÛQ¶9Ù2b?8Yu]©ªáÌ©¬¯|%åÀ×B�Çýx ÕÐX2gŽ8@Ÿ�@&ì Ó¿9£{Å[>$jHs)!žjH�cH@ƒçY“©´K&¨E­ñ£ÙËlû† ‡êøƒ¦™âc­æ¨\`QÓ÷0U[ÖeÝ[êsÁW5^…TVTé«ü]¬SÚï±�/Ic)¨�÷cÛŒ¹?Æ~Ö€S;ò™»…�û`ȇâF1Õ`ö©†Å½™/Ìl+F_.a‡öu÷¾z™œã9݃¨¢´\þ�aM—ªÝ,ÏŠ&…Æ=ñ|¼7��ÞUS²„.ÔÁâ.Fƒ�åÞxTä;m'|ñV‘’í¯83ÚŽÇ�Y‰—{ª¿óEuJA-£owx®š]yFWGcš«á¢Ý“å¡Pë9ê³.Ç î@ûÐlH¸Á×R7'•òü¾§±�¯÷ú2­·wï\gGlæ&�zn¿-NzÃÛ·ÝžE Ù-òFÛÕÝG·U©(Qê|–ãO[>…þî¡áG›ó’³¬~/ê¢ËÔ�r«aÎ��îèpПÃåà%=ýæ´kŽR�ïä>~¤ù–½}ÃRSZ/¿¦7 Àî@ñ³é¢-±ìkõ™`~ø+ÙW\L,òž §"×H¡·Þ9s‚ãÏ÷uÚ‹¸pů-meúU ~Hšu„ù�Ú+õôŸ¦á¡|ùwn Ü\¯­fÝ/ƒÝùT™ú4¸à¿¿þÿkëBpíÜŽýWÙ@BÍôù0Št�*ÎU:ëqÙÔEyT‡Oßp`[Ã�n©PÝæ§Îä/Î�ÙÞPÝMQÿϬékÊ7€iÔ¤ ópøÇ­NUjP­K;€èj€Žû3ýÊû×ÿw*(q¨@Q¥(€‚W¯-'êzÔ?hjS›ù™îãËêГËýt¡=“›j|ñ8+íà4ÔtöÖý÷·Ëç‡� é�©'öH}h¥ŠôH¦‡þÈÂ<~QéAÉãG UD¢ýµ{8 K&œš$ÑÌ|w�èÆÑÍÃñpŒ£|¨S8©JÀ²“hxÌä1#D±¿¯û—ƒæ�Ñ)>ré~vŽ»Ÿ€ QH77 ˆî€â8OîÖ‘~öOÍ{PTtOæNþiï•8Š"ü) @R`Nfôbo yçu꫎6•ñöì#3ç´4Ç—¯Â}ªDþ�ÇcÿôïE>|:ͦ8º­wøfs¹€V÷;ç×1’ŸÒzËïÁ¥‚5™Ø½¾ê‰þù®TìÏR•óOFhf®ÂËgÈŸ½ö�¤—5yH’üª–N4]5²º<¦Ô«]¤FAŸVXËÌÜ"z9(mAÚ~kYÔ5ú7¥ÔŸáêçOä9¡æ6÷”v9±çM0*rwuE7ÇÆÒÏ/Ê„ ìž�C1Ö[q¤ÿ,—_ÿ�ðÎk¾“ø·“~pš¼ÛŒ¿¡sí’CæÏ~Á›*Á[…·!xix0�ëwdÛ«:Ë/šo•øÖúÒU2ŸÐ.O%t ‘Å¿¹U{ò‰[#V-×s9ÎÏåVŒydMIn´lI)¿W¬ójÜKÑË¥ÌK�™o‡¾ÝÚëáž|[en£M-ˆO0¨Éócás]ÖÃqþ„ë®,cÕaúÏO›¹OôóÏyJ´ö^ªðKˆÛ\¾÷«}ü~¾ÏÿÕmÚßWû~ýÁ¶páoΞ•ô_.·vk‹Kõý(€<ó»œ3¥+uX›aê,·?�B…£ÆêË• á­ÅƳ�œ¹#êÆhb�V!`r·Òh·ÅáT_þ~N?%‹j»Znn®áݽ'êð×¹œÆÙ�Ø®¡Û׃l@¢GA¾:?ÜýŽå1>c~D�{JÃ|Ðe3Ø„^û�9½5è%Òí“rHöMÑ›ÍÃÉbx¿7åÉe‰¥U;“àZê­¡+œïS ¿Ež4Øâæ°ö"LÄçûÐ> PžÀ²Ê³ÛwS\7ÙuùGmˆlã÷ëM•ä>$ùë¾æ}7Uá‹ûêÚsžµžËØ‘Ãò.Êyô”æJ4C_éµè$[+.ä7 tÖGîu­8¾ÖN®ßе™bnoéÿ:¤¼Œ ²¥ÜœÁt½xróx‡a|Ó6׻㕵Ýþÿy§ÞÜßý( ­N×h@oö¥§“ñIÈñâswÔ=w²Æðô3À™¶°Æâó�ÝÀyïämÐÞÃĶNÞݾ@ÛéÀKÚ„õõ¯û䊾±ÀK¯5›®ç]œú2U€B~­µJƒ:ÀɆ�7�Fš i9®´ïO¹�J×þ§PÔ ÒgAYa¦¾S�§ eE¸R©GS*[ÈÏÝ ­¨o:ï‚•›²ÉϨç ![Å¡ÖC8*P8=í …ˆ¡úu’;oî;¿>/"h²ª’‰^�€… Pß­Ro�ãA&Ðæ0ó¸û(î#Gº÷Éßb>OìÄuëW!ƒDÄ9 àvÍ(»BMž¢�*3H:Ú pZ¨3*ÒÓ7 ÉçããòÓT*LTÇÉîÊ7~BU7!}¾HNú.öžÓ${ÝDI9 ¬Fd±Š„°¢ŠµajºžÏbˆÈͧ_Öö SO�õ«ôôgH¬Äz[ó—&ïýbÏbg²8©WØ-BÒ³ýrÏ6ùϲ.úv¹�ì]0nñ\A8m¹³Æ“_ðwÑÚ�"Ï¡º<21Ð: Ô?Ö§£èൈ_˜ú5ê€׿EÝ«ˆ®Ä0öÉw¨øn>„éU·0afUv*J†÷xiȹýÈÏ:‹–¤—Kλç‹2Jšù{Å Ë’žHÙ¤3½œiöì.kg~�Îñ·øZ{ßÖ*2Å©‹¢ãK9±ÍFí;ôQÈ´< úxâ«%Âë,‘[¼ãyRdGÓÒƒßÅçŽßÂ?DÛfÈLjðûmXzßVjù¢ß5™2†|çå[JóÞ æÿ»®­TõdMãëU ùcÎHCÕ¡ú ñ�§ÛJ©ã}¨¹’b^Ã7»qù7\'U=[‹Šòv‹‰Î­qÿë\kÅÕeÍÃNKâ×?erÈgíþÇw0¢ÿþdN”ª}’æTîS·“É×üHI|GÃ5öôÞþT]ô;Û�ZwO°•‘uµxYk�¶§Èái}qìhi�îò/¼=Œ–�5ùZ´¤B”¬Œ½D}wc„XâÊUOæÏÏ»^ŠPø4%ã„¥óo¢cò¼mÅ% ëË¿.ŒÅ‰35]Ù�íÙä›W((�äG ü&ÿØ–uÏš#ý¿Qd’G!?ëö¤Ì þU×mëXÞŒ` L`c*?ÝèzZ}ÆËìËF_kÅ[¿ü”ë\˜|f¸æøÐ¤ŠódYóüí2™­³Ì-‚;—(-û‡¬îýýâ(w± !Q\ä’*킱í�X�í�sö»Û¢aûÄuÝ�á£,4¥â§©¿8‡ŠŸj@µlOggSÀ€ì ‚R »uÿÿÿÿ<ÿÿÿÿ>ÿÿÿÿ,ÿÿÿÿ+¾ŒÙïìm±ž’žÇaR>S}AÊ?æC„ݨ![ìÞŸÛʰ?"†I�Ú�Žu{§^ÿ¡ÜÙ6`ý¦/nÖW9Yù÷‹¨×¤ž1qgÒàV{ä§�Eá8pÅ_Œý1�Ehº Î Zû†F]1 pLÝæÄúX×`K”3À—o~S@µÙݤ¡õ_6œ§ü¤pFŠ÷¯T‘éù×S+ä;qP`¸½Õàè ìu†a [ûçärUû‹ €hÎiý»Í‚ÿ¡¢-q/r�$,×£�D÷ΨHÀY*µ6t§Ö]š¦hhô`ÙzÀª�yÀ4Âp7�4M¥&} #‹öÁxÂuÄOvSw s÷qt~¯5‘p‰ê´tuª¦7J+ð!´& èw*ŽÌN8íd‚ä'Ð$B•–Y'ˆš§fðPGÖ½�b‰Î€T�.èwúÌPܳ¶ŠUgB¡èDÌcd©ÉP$àO ð±À¶ `( P·ÏÆæ°./Ý$nÆL¾gNÚ†w”ãâŒãîæï@*ú£än=QÊÓµ)�Å&(ƒßPé‹ 6¨—¤—,½xê&·èÄ «Œi�ü²Aà‰Ò�ºŸÿ"5SqÆ#ù+÷¾õá–¾?ŒhëŽî$𺈛ï/ ‰W'ᎎ2ûÐf¿tGö3_·æ–99�bEú©üèÞ<—å|Œ�6v˜h¦ìñKwø¤‹C5nR• KÝxŸf×ý¤>óÌÃ_™bù�(ž¿ÚºÛüë\ôCã~ÊŽÂÏ|ÃBLW"m˜Ñh"÷žNÌCj5¾c4¸lø’ô®MÓÆ Ä4ÿË'ÇX9p¨Š¤D4¥ùöñØZª‹P~Ë;! M} ÝÔÃêf@‘R©׺ɛ–ÈtHi�s“Jù2Þ|h¾¿d¾ƒ;Gi™“0+{RvtÖÉJ½.Xû/%óÿ­«È— »LÏä µômŠÌN»V¤ÐË“‘ÜLÆ×�cÞfÑ ÏÙ xóRÍïŸÛÈÅ›Þk’9o?g{ê±fZÌŠ—–Q\Žt™²õWä`)ê0Ù¹½Œ}niy�”Úo~hœäX±ç_ý “ßI{wI}mwi­V¼Ã-—æÏnÕzQý\þYíXvÂ]Q¤|l mbéH.ûN³š¡îè¿uÞ£ýù3§ì0ÑÔÙÑ& ¬¦pr³!&„Ç8yi•&Õñã:ÜΧÁÊJ¼7È™­ìÎÿb¥P=ý_X+uK¶Ô7;ðd6•)÷Nd½÷°äsNŸÌzñ«Öy‰ |„ ¥Ó˜hû—ëãý Ä<þ³aü6N:ã=Í4OþÇpøÈ¾ü‡œè áWl‚6~µ ršVV|·Û?¿{mÝf�¸ÄÍ笊\m wIg΢Þÿ?¿Dë¿¿ÿTœ�ïo—…cÅ-ò…7(Þtö¯T_0=Á¯p(3_ÓœËdøáa7j0X;ÿiø.›ö½3�ê×�Á®_k_GÊâõRçæø‹µµÛ»—‹vñ‚ ÜŠø5Ýt`Àµñò§?º©dööMU@%�âÊ@�gJ`OÐ.Èïë8Q\™úÅ„³üÌzÀø/�¥ÙûwG×*ë.ÖÏa¨?_ +¾*J[�/¸Í:^îÿ4€ƒ@}}ç] �B¹]¡DIá Ó‹'Ì(y3϶P?izWɾŽ_›Zß«ÐNí‚ µëýû«Å³<{šžŸqV kéZ›u Šú®• Btµ»ÏÓ¯ EƒA*O}=MCû˜ÐP‘gªgh¤ÊJå…èC¥’•˜Cg2…ª¤ÙK]-«@„«»~ÒAUÉÝ+ŽÊQÉ­ g·î÷óy§ÔO‡™�˜( ¶Uó�>M5/ÉH <‘ “îëÂe²ß—Òħ‡8#@ÁµÎ’½èWÓ~…™Ë æ\v\Æ•/®g7~ÙÆáÜŒqŽT:!ÀAG´$·´ˆñâäpCÿ㺬³wªÝ�Þi×’åý4HîoMÖnWõ׌vSgϦ÷ï¨îYÅ�EÖÍ8�ÎñŒ§¾2ÿò÷0Ìk7ÑÛöò&wÄÁ(ó²—,²? ®î&Pç&„áQ6–£FU8¹ø´QöÈ\0œLô2½}Ô‚ÊK* Ú¹ŸyïiîI6Ê ßÇW—䨉:æ>ùöÉ„fÃ�dfgÝݧ³‡T÷…¯Ù£?}ìD<êñ»Ëzç©�Zo#jÁom¹äæNµŽ´ZìÛ‚E2lB(ô ‡BK‹€uxOÁ–’v=œDº/ã©:¼¼>Çê^n�lÎ2<-μÃ×Ïêò…宿-‡K½bÖ/stÏñ#»�i'ö,l>"¨ÂEÏi5pHVÂW"Wj†ÕqcMý¹é‹3¼•k믟2ñ#wÆ«uõe"X ¶k•3¼âS8^d^TOÝc¢XŠnÔß5Á@. »sñ'ß‹Þð¥Áý¶°ÜiÕÛ_˰Á�ËÝÞeæa/¯²7õ¦Øð¥';Ãÿ„¾�·VW ]Ò©� –½ª[i$§/oLöâ#Åà?,ù æp¿{ÊÆ5å=¼ö½ÆñàÕ`7g®xŒí“­»u¬‰®•ûþA7ãäôv_»¸¥=°~«ÁÏ>{×Ç!ü¿_YHã?Ù;Gè­\î¦ø:3›½¡(,ôâ¥ãt%óœŸ:A´¨ï›Ë¿z§�HåÅ,c”l:㣴2[lbf/¬Ï»ï°úkÔZÓªÖUÖÕm,JI\å‚n^® žøÓ¹Ÿ¬¹ y#{'ƒcð(×: øáè÷´¬QÇh‰ûÃå4*èUBa2_£bá¯z£\ïÛ³B]¸y­×Â#îýç^ï¾¢ÿª¬ØzÊýÓø<7 DYÞýëöO7ôGã#~)�à@¹jìZÿ|­ ¹Sá«+7ã}pƒ*T´ØaÈHþË{AÅ�mVI€úçã õXmÍôŽöñ¬ñà<å®5Ûøò³äãÖ—:Ÿ_pp¤‡ ÕG ‹©uoRA«é€ÚWÃ%ý·^h ÿVÝWj7è<ëú}A.¤+¯àPAŽÚ@­Ð¿rü±›£þy¼þñ 8ÇÚJ%”ŠÈkŠüm¡8ÝTMHH�Z¥·Èù—S¾4]ŸPªM·IžÈdnî­#y?„¿ö^ M:¨á0§(œ–�H§6Ž¢oÙC>êü¢ú›Ú1÷ègßu|U K…~Q] 9&],î|ý|IdÐ,¤ŠNšSuœD!Ï S¾©$g+‘½º7�cÜyè¹>$çŸÞ‚ýDªÏFzgžÝ€À1XïÈ ‡| ãç’ôlÌ„ÿf„ ;W’#ŒÐ‚LÍe™„T¥þõÜôFkhܪ:ƒÎÀUrjêµûá’%j°û7áÑg�{÷÷Û5V{·CÇqoßô²è ãZmÖëDêÚÑX_uÌ»2»ë%½ßâLD33¯ö—å†/£]ë×]êw†qŸtú0Ç8ýgÒÝžÈåöžÞˆÆv®GN¹ô�gÜ!w‚iPS¢Kñ`Go¯ 3Ün®½áÆ^Ï�†¤9Ü`yœOf¶ãâýìWD˜mågç¸Ç™y\mÜŸ«žÆï”‹~×s©­ /™Ö)®bš,Ì•÷N…V˜`ãQv沓M¢_œþg¢fï—¼¥ ×=L�q¾vIë_:³ º4æ1>×….qýwr�arñÏr)œÑž�¯7Ð7Ð+\G,�T¥Þø‹Ù¯Ì¾è$Èî¡_Íií�Œ²÷ paµ_õÓ~R�3|ÆKÀ¹>î,k󤽽æX ~7Q¸®=uVÿüq²Yo}$×Úäp#>•öˆ…0MømoÜ„ Â5yðóuð®¿útIúY�Â.k@ã¤B) ëoTnÔ•Ä7s-‰vû�CFAwbß+*ÿ¶Š*�¨ü”™$$ÈÒ8›‹¬¢0J�Å“|Ì@¿À3è¿íÁ%ûçk0’ž—n/TJÿ®èF^ï«'½º@ED…^5�GkôY^ÝEÙÈ•hE’¬èð}¸õT‡®hÕã[Çò€Éü÷”%gh¹·c¿ûï)O­Ož¦ì/“6Ôtȸà" §TöDC÷®'/ŠÅQ�®YÉËK}õ¼N}p…•v‚KwNÒ�¤*ëÖocŸ[Äx8!ˆ´8Š:”SU^h”ֹȉݩ‰"8ëÚ�¼ïÏ߯Khÿ&AQ!ØU¡=èÌödi|ÏHúÖëj’¼'È"|ÔµxA†ÔÈÃÈñ*õn¾Û8ê]œmÿâÆ™ŒÊ_Fw$Óþ=«gN‡Jß·T3#hµÊ±ŒSó Ñ÷Xb®•òüšäJ„Ï�¦;Nz©Gi_ÜãAâóŽuWq‰&–±M¦C@uC;èU¼Ì+JîYûÌ´â>e¾Œüh�ÉnÞ¤?æX–ëäæˆF9bh_½Òz½�ÇIÅ k®iã#³x±¤ñü»ÙÉb 4Äó›ÿ£"£z0,Ubá{”ûoUü=tˆ¨ù¢G{·ßµÀ÷tE5Ró~­éš~sÇ}î Qc¯’]¼@�ñàÄïgƒIì,ܯC‘â+ç½?×O¢½¥h[î$Ÿ T#›Ñ|c�Û;*ü3XÉ/Ÿøÿ©£Ú$³¡ØÿW +PŠ¢/‰ÖÖ`_H¿bäˆÞš^˜ïT—“Ù.b‘:÷ËÊßÙ„uZÕæÁgÅ6A‡5ñ¦Z­6¦–®/x–¬†D UãÒR¾ÞÇrc¹¯¼‰¯;ÞùëϘ/­ÖQª>êD>}�:r¶ŽU ÕœÁüaÓ-�svc¹º¢Þ�þx:h ³ý×ÜrÆÛÞÝvésÚLbË®ÛýcßTÑA,صóªNŒ»ñ‹öçeïך²ÌPÛ‘pò$û kÓ *г¢•lï®wuK *ÂÈÝ»„ëÞäKVf׆ð׺–ä©—\ò^Ê“D‹ß­.ßý‚fS¨¯�†ý�¿½Ôª.=ír°.s×:ÚPŸm\_ŒÕ²“÷>O㺠ЗÎ}]]°õ¸ñÂ)¥ÏþŽºxX)6è>>‚õœ[T¤Áô¹“ƒ‘„(¾ÈÁ¹ü“ü‹ÇÂ…ég»-ÔÎŽ¾ð÷ö><^$�ï„ã H¨OggS‘ì ‚R $?}”ÿÿÿÿ1ÿÿÿÿ:ÿÿÿÿª±±Ê¹»ÞèëÁ;å‹,ú‘Zö%…ýÙîß…–"ËIñ ¤áªŸ~äû㶨»­ꦭ87Y³ÝÁßîäÐk“Å€5Nmã_)…ܬþÃ&ÞH ÿú8ÿ6Ã^D\1òÚu‚©ã@üS N4³l«ÌKù8Ÿ„ ß¹pó¨[§²~h$‘pÒ°;«iÖ<�$€ãÜ–@ë\b HüR'Q¹­h�Ô€‡ .Ý@QyîÛ¿+t­ÓÚÏ=H1mÀ£‚\Vk~¾òWSDZ�VtuÏÒªÌÒrµú„Î.x žïç·Ù¥µ�j_ESXÜüù¼.×T¼ìÐ'BKmz-ùxrèú¥ÃÜsÕ®Ðö€é×Ó¿¢õKa¤ïÔ5À±—Ÿ+,Ö¤n¶„ËÐâVøIƨ[U'Æ­¾°„¯ ÷Ôg¡÷[x¢ÞÍÝ?m*’ÒŠÛÛ3¶šØù”UX?§dÀnëw™Û1ÿƒÑpؼÿW:ù:tº>ãŒÕ¨æ'://ÊÎÖfâ=qk{ë9¦úZKï5¤wÄb:Îï},|Ïî½-áÀÞ¾¿çÿWÈC~ñE§üz\�j™±¸i�¸UZ0ï$»©2&Þ!N.ÆYÍŠ»ußýϘœmŸ¯+}k4‡"ˆåêõY½îû> ¹7›Ÿ�ç u: ÿÛ´q¹Ð56í¶3ï…µnú S¿þ¸ÓÔ‰­ûêVð"êŧEV—FÓ‹,ö¸àÖøC˜¯Ã³¥Ü»ÿïalüÖe̹©Îôn¸µ­½�J7Ù$–³fÖS¿ÞKy»>Yë·ÄÚ˜¬+ÿ4¤îë«ßv#ÒŠQ¸æýÕ‹ÞÇO|â˜ífx1š¯±r& L0æÜŒË}Áú’§ûL“¯ÀgÍî°ü˜ÇéingÿdZÑO„ 1zØõ”hß?P(^Ö–S™O28gÐù€,¤¿Æ\º÷D|fÞšw'×ß÷ÝöÌ™EŽVæ£ñ›6�PŸÜì©m|à|ªlå°šr`C+Gmä&>ï°2ÿÊõu*NxxX>;úõœò2i&r;qî;ø„ŽY,~Znóq>¼î+Ë÷q/ÇÏù°1fU û¡‰¬¹oÛ7É*ÿªnÆ}ù—P°ä¿ùÚpvä6ÿ�aS²£Ì:ÎÚÅA <œ9Q ø>~ø“öïy› †7xƒ‘%Ö¥ýãä»n ÕG/Û¯gÏ™-€ÿ94ƒ…ü9¨wœg•ûüC4k¥ˆÿýR¨ 7û5Z×o¾ü5Ï4újÔàFÿEˆó�d‹ÿ½ùÓµ¡×H�¼x–Xà1 s…Z¢ø1sWÅ‘:àYùíVV‡‡ \»7_ˆLKkÕ¸§ð@¬88Nð¾_kð¿ªU €üœ¤‹@íŸuªàéÎ ±• zµÐ~ë0#E/ŽÐhÌ{Ò•^Ÿ™E¿l¼•²»�žµÙl•Ížó7�çïÊy%³}£¿åmfQ=C¦ì¯bW™¿˜,ì*³ù“•:Ò_›L½ÎÂá?|wŸ¬ˆ²LÝòâÝËöÄ “UµÆ‡ ÖÖÉ¡vš:Ç»ã­ÂκÕË>öX\*‚ÛgþÓ�•Æj€±`óÌ%ͯ² ÈÒ®1å‹)®¢�¨¦¢p®éO ŽwùÕss½¿ÐY)œ.ÖÑø+ÂÈ• ¼îÚ�¯&SP[w¸û^ö>’·ìyOõB¼�唺¼) ^­ZWlÖcÌ÷NŸ´ÉL½èŠ+\ço3ý€Ï·]“æ¢Ê§i»ˆ¢Ú®¡çž”JTcWÊqæGd©ÞÅsÞFÿi ãUô;éÕÕÉ7.¬ÝRÓ6á´+þÕhÝL°u?)Þ&èOá^¡äåÔ€`µhV‰<ª±¦¯%^ðŽ“Ñ b1õÖsnòf•ù„T¯ÉMf=ÿÙæ²ãÅœ×yá7Ÿn”pÒ¦v³ïYw?&‹Ÿw•fy5:èDt4 r˜;ìäÖkà6*àÖ#¯õ$¯ÕyüÝßì×å?”QÃ×o¡ UU�jÇ÷yÕ_9óùp–÷s¹�Ù�^ñ‡æÝ ò‘x/t'qVº€oû©y¿>î·—í..Þ V­OkÿüWûhAÜ´gæ;2W³O¦iߺ9ýXŸ¿Mk×ÀMsyÄ}±V¬Õ¬òÂçA[k‹ë½?>cMakç™uhñv½O:/庱fÊW›Põê¤c.øƒžDé�¢ï5è¢xƒZïFƒ²_P$Eê·ûÛýZ¿ÿVmvªN ÞÙ?'£cYÖ6òææ{›«o`T¿jŒZÊNô t8éŽñêkM¿§ýûyžHר=LÉßûÅâdMv�%õ¢kµ¬*Ìä¿ðþ¼D#J÷8WËØ�±qLrk'ÙÜqü‘iþ@,6¡2½ põEóÞÿSTîÒ—ÚÌÇ‹ŒÇܦ/"æâö¬ÝûÍÿŽôæ|ø?î·½±?·ý¿ÿsþ«w�°wr~ÓèºïfûÛû)›rçå{>K£ùâ7C]»t«³zæU[¢äÞs¡l½jk §£´g$aÛÏ<3¾ Ù·]‚jü4{ÊO*°ß¡U�9núDf‰Ì"ŽTý®Íû¦rÝÿæ~».Yͪ{8Ù}öŒO�x1 uGšôdâS'QÕÁÖ57Ñü»NÞ49†Rëø B° „þúqí•6Ÿ®Ôׇ ºìp¨ÞŸùþ 7ÝöÃîl|yþ㸷>õÖ_ÿ{_dŒcüñº¹Ÿ†wïvïçú~>Dx'9·T•n9ç÷QõùÏ[±¦ªyZm˽U@äŽ OÅ 8„½æT"7j·™êóßÀ¥pßïû÷2ÝrMøÐ }óLáԃƷ;èâÕŠe~â§"-ÅJ}˜«µwù'ž¡'qäù‡²ÿ„¨/ “[Rcg|Ÿ('þ<18€ 4Ù°ÃïÝNWÙ#3¨ªÞý]7½P~;ûÓ¯§æèÚw_f}ÞÕóã›*7øûæ·Â¿=Øöòg]}z­à¶¼jÌ©õ9—:ßz+d×íìHR< ³:J4Ç䀻LRqîá;Àz¥Ê宵ø˜DKœ¾¥x¶|+FJ~IC¦¢v4¡ô…LpÞñŸérëà˜ J‡+ò㦧¯žfâ¾Ý|wfz?%Ç&ÝMY™‡¿Å Lgÿ20£ OggS@£ì ‚R y×/Jÿÿÿÿ@ÿÿÿÅÿÿÿ«ÿÿÿ„ÿÿÿ·ºVYwLç?`<Ÿ¬Bu<¤ø°~ •f†»w°0<Ü�®Ù×ñûà‰s¡•.ÕÉOß§5\Øî ®ãÖO†ž×ü^ßêúë_ž/–µ{LwjëõìÜë^‰”Œ žKxÔV7ãëŸ\¨àÔ~8*\ÿi¨ƒ½`’¢�¤kWèêpƒþF® L{íOÖ“ `:’�‡ö}᯹¸¦™žŒ‘–§åO ¢( aªØB#åèž>¿•�ñt…àóxºÚÚ÷V|Æ~(Â{â íi§�ähT%Ï÷ë¿gd8ÔyšiŠ#�Œš$; ¡ê¯ÁÓ¹€W ù@LâÐCdd”\¿ò€÷à�ØáKG"ÉH[p €ì\GôN¯ou{{{!æc_O„>¿ÐóÜÜùÃ?û��cÛwšcÚ9а¡ùÀ&7Mµtp’O§%^spÊ4õ-÷“7($«áÒ£5´ìXïböIý¨áø'?vþ'&Ê•ü¾E3YŒÞå’>û½Škñ� ­ƒXל5ñ �æà4ò<¥4\êé}¢9u¿õ©BpØüô~Ó¤Ž[×O] D>=óË)¥Ú B²Ñ«îúpù²é�£wìŒiA3f.‡ÛQ)UæÃ˸"� %=jÒ÷û n¹qøÅÙ;×úÂØ„.Ú7øÓu:ýçÖŒ‡Ázg»ÃK6f¥áüC›ÐÅÅm›_ÞVPþǃ± ˆôeÉv(`.ß9�MHu½¡ð{¹£f!úDßÌCÑmgm@Qôû~k«ß­ü9”I›.7ë=Ã#³ÜX&´{¸“— !æv4Ò¡‰¾í*GKrØ:ê;Y¡q§�K1�.F¼ÑÊ?KSÙûûpkV¿a»ôÅÞÌœ¯HÍ·ài›|•}¯\Ä(=¶6Çåê²fÁ—/XÍ·º…%aŽ‚Ì›¯�Œ™hì7˦n×=ÔÒÝËâÀÃ9aÖí÷–rÒG,…¯Ñž~%[Š›À>JÅ¿`‡G³BFf{=ž€X ®Á>ý 4ë{¤€¤$Ð!bTH¤�Wþý%!DBp?ñ´žëÄæ—ëçö;µ×áSüméÜÛÌS—ïMU­ÏO3­Ö+}_Æûó@—|z?¸o;¿�>:ç÷Ûu?½§ó·è‡Û¤‡åÊõ%+W×QÇlø-7M´{¬OKxM×sò_êâé¢ñ||ßm(Úãó½§ÿ꿾œ·1StyCšÖûõks®ÓÛüNýj÷:¾k}méP¸µþ—ƒ*€4¨ÒÎ ð¤7¹õ[!(J;@¨ð4¾„î@D/U"©^`☑AJr)ª#ûžŸ|á�|L­K®„CDÍ…&þí¯®{¡ÝO &�@SuúôÍcQ²éñJÃO�…¤{rf˜ú±CÐ�\…ÄΧ€% pàœà´k,T«Køïftâ*V† ÛÅ{£Àr¾ˆàÀZÝß?ªí—0Éòý]ç½Ò;eÌ;¦ß:aÏûK­G°~ò5€Š„Átí�öâ" Û¿‹ý°­^ÊWz¼M0}ËówÚ"7èùž³`!ÅF*äÆ�Ü�]ȵÌYÝ‚C¿K‰Lµ½Â�_4ÁYº��ç{'ž'ª7ï©ù¶ÓíØ-·wå Ê.Ú‚o:ºÓ4�åÕÈɰoNÛÑåèæÞý›-ÎL= nß•Jü!"ˆæ€O0ÕÙß8í¸ý%¯ý�|#Íb)�ê JSR„6,J Ô&Ñr` W$’V­óìÿYš¢%8Ø sÀÞ�Þ;uð3¥+Å0êøÀÐö¢V%Ùßò«Íµfu"z~SÇ®³Ë&ÄÂWäÝVÿ¡{ê�J«¦eUwÓ )µg뽆U§Öüæ-M˜õ»æbáþ÷ÅÒtý$îx)"Âï˜YÛ,w—F3Yñߺ2^p@ÿ%v -žöñyöÿ¼Fa¯õ/–„ä0ïuC•yŠ´kÁ«ŒÌŠŒôË·vádâþw�óS�'±Žf×4ÐC#‡²<ÔòÒG€–@^qê|ˆ*›óMg�æ©3ᱚÍöý8ì÷Dz�r!Í›l¼ÏU�fnõÞ_æ, óºh‹ô{~ªqs¹ÿn¥¸³ª"ñÎÅYäŒ�»ôþ>ôŶ{¿�Ÿ$Q5…‹ÄX[Du5¹xºw�}ÜÚ�VÓõ´1eõ&�½µDQæ­¦ÅÒd™µY%ÔÛ"¤y½mûǽÛ_¥âl¢(¯¦ï¡É®d˜¯î0ð”±­ìÝ »¹ÙÛf;zÉ�öúɤڶÃÝìäg܉cÂ<ËלãE2^La çhßIr-̇?m§v½ÿ ¤Pl«œE=е¦hâóÇ?ù3sé|fÈŠJmæ;¸+Ž�ä—¡Pní;5}zÿ €m/c@Íò/3Q!¾—·Ÿo€¸®ö©_<ÝLÔ:èY¡ µ.@ÌŠ[¡Âã].´ŠÄ/GZ¡þ#UöJ¥RqHQ Ί6Ô-W}v<*Ý è?\`FÈŠÎ×ð ú»ÉÈ "Àc6¢Pù @ >« @¨ð3®€oàÜÚ m @‹ßöñÝ•Çyj… ¥°ž¿’ú{�ŠÏW¼R@3)J/rr"¿d@­{í¦6Èd¦iáÏC •4ªj(‡#$œ“…_»ìmÛŸ¸ú3µ¼ëR%ÛHÇiRJwÿ¡4×ÿçÓ‰érŸÛμö‚Û|Å=^°SÑÍ‹n±[—Lç=Ò%~~ú¯;ày1Žû¥eN¬ªÃ£|íTmj³õ¤›‹Í_l\Ôº¹šz9=}‹óNm_Ú�ÇßH2á±Öòz?­BغFî|Áw½bß~·Ò??ùRfŽõpö—ÀA"OKŒµY”m§Yf i¾P·ãh�¨&[Q5 ZQaï¯îûÑÚ�³ WÿU=ÛîuŠ©‡ èlqY Øâ¢e>n­0èA]]C §—ŸÊ’ä =óõÛuûòÿâE B€®‡rB83é¾lÖ`€4°.[–ȃ[K"U›ï噀†�)@�$‰ÆgŠÖ(Pº6ÀM @nþÝÕRn 1*BÖ‡;-sDä–m*,ê'7å¼Êk¦,`ë×\ç³}j\<øûÎHk{r¤&ÙŒ—´‡ï²kyò�œâq6Œ¿ ÑÖ8ÏÕŠ¼0躂 ×õ[œ®ÛÎìI�X?P O�lÁ8ényñFñ[…?Cvý¬­ä¥Ø#-êi¶êfѱRG_Œ„6IÒæl¼—¥ßüµGLý®ç›‹}RåewÛn×Iö[žÇ%Ûäo_ëšþÄj7 ‰[χûqwþ_ïBµ+ë]âäì7ïï2꘼èΩs‰àT$ˉÍ'ƒž¦$)Ÿ$&ŠqÒ õêv½ëãq.Ì+šY—W˜ÏH@£€.Ô þsC5kHà±B,õm ÷ùº  —…ßì‹9R:ÒÎÆêÃóëràWÆÚ—çQˆ1k3r´ðeŠ¢Ò¸øó¹1ýüåIãþ$jšÿƒ#¤âãQ8ÖØ- UE†Š�ûõ%×oŸÈ½�Ú=€´wi-îlsÝ„«§mU0é;¼ôÓËkÆÖ±ï(=<ÝÕѦ^ñ:ëZ+À¼PþŸÛlýÇ/ÿ†L°~‚,Êô0Ü,;>+“Lõßä :Óú^ÃTð2`CÀ5f@$Öªðà\µÀl€OÏ€5&ôæêQZµî§^�šëâýþjÕŸ T5t•�Ã=9Þóx˜ìž� àY Ch4ƒõí•bEîÅ”¤¿aJA{>šîòx]!U?e3|øówpðäÏ|ŒóÝCal¼¶{.™-ÓÍ…¥ fö¶h¼H¸ø+ {.wwŧ²Ï‘æ]†/Û$&ÚÎ5øJò¸ðk4�,*ã5û©�hã?¼1J-ê3�[èÚ�«Æo½~ó¯_ì ŒŸc~-O€š-ÕE/� ôyQïbú°3½½¸oŸcŸ~'üvÓå: Ðld¥ø¦£®[çO}g¼wû"�û¦Ê˜ËŠÕ²ú�±z»|Ò†š ÂPI*$ H°óZœ°f»yÞK˜c<®~j .oŽ¡Ì¯E¯CCüîÆ€c:du 3!øç@„àîÐ[¢$D` @`˜ÝŒ 8–NÆ\ƒbønA“Ê‘Bhóÿ?¯2VÂß„â7òŸÅaFFP¨Ì/^.góâ Ûòæ®Þ²�7uL‚_ÚÅT|ŸK©¥€9ÿY¶‡¬[~1Ö⨵ʉÁ¸Í€œ[PûÇÑVÊ�FîD´[_ÒZ%�˘*ަӲ9.˽Y'eT$U9¾w×áÿzÍ‘»¼÷cþ~­š"Ê‚»n“�ØXVã~�Ø~·ì6æq{ry…8kkÕ”õùßœ_FÜuÿþç…U ެKÜý©¸U×§SÒα~/_k\d�õž| ‹]ølûá‚]/ú¡œ—Ìe3s‘Ú… ¿Ç*o†þN›ñt•Û—Ëý<.9oW”¥:/Ú¿.»š@£z, 2S¹¥ÏÔë>Ès¹%}ÿæI¤ªè“AKûþƒ‚iIZã} ¨â:êèºe|¿kþ{@5ª0Ýè óß>éU¸5Ÿ-�ö_ÐØò„뢿AkÀü[û¬­È;Ô|ÿSšâ¡r�Ö˜Tݤ‚~Yœ (ñëÛ@ÍZ!àx;7Ýpõä"@7<Ô ³p�:; ø€Ÿ �üÏïÝ”&‡€�íxà÷O€o�÷Û `D hÙTņß9ø¸`T¸2¯Fž^xί>ž}§Dÿí="�î—‡ŸþqÙfrŲo2viâßÇK¥V8A†!¶‘F}?i»Á›DýsykpS£¶¦ƒÍ,ÓhÊ_`\ë±ßƒÊ¹÷ޏMxÙÀ¦hêÒ9Ñ·_&>m æcš/ŽyiÆ{ô~dÞ‚Ý׸o4g†Ñæÿ>2·íÆàç^`ph¢ÈB¦Qþ- :­ñG¢ãÒàHr”ù ß� ø“X·ù Ò#Z詽�V¯Uœ×&Þeawžvú�›S‰{>d4ù¡è Û§eú6H¥„dyµqõ ç)´‹Qú! ƒ¿œ  Á Fk^ççbA à¢s`4 áé�\aQ’(`Š)-A4&¾—=Š�˜ÂèñìRÇñø^/WF€„æEy—žà×0Ý4Vž¯ëÑ›_~×ò;¹B¬ÖÙÆ*n{²÷2£ùEâ¹ÚõvYçjBf+qÇ™ˆã¯Íè{÷´µ¿5º…Bûs¥˜[,TñþÕÅd§%£þçŸËW±ÿ+ŸŠúsÞ3´Æ|†Äö9O­øè)oraørúP¤Fxñh?J°¹þ—›uÎx™ªq:½ÛÍvc/Ñùú]FMonûwùJ~Ûþu¿�ÛQU0ÖŠ(ÓrÎÙP ‹.ûc(E½‰´¨Ò¨)‡µKÛÂýçaHâ(äuׇßÞLJˆ÷±¨NKÖž6e²{UEVDY�D¾YŒµ6òk¿$—Ö¹u¹“Ë•fÖRþkF)@)À†^¥¢À2Ý^³”«äÙÍ`0 ÍÉÞC¼——ùñIf ýk]ÏËçfO«ÿ0+�÷¶x¶ä6»›ÜùóÛ7@ø¡òZ€¥äâºõ¾åüÿOggS@·ì ‚R ì%[×ÿÿÿëÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿ^ÈKöž˜?"iß³4GøBžWçðü�˜oëBqþ¯EϾÊGþüT~�Ÿî ññiÎJ^�=®÷òÆß)7µ ~n8Ýpk½i׬{ßkp#�{°²¡}ö664“éÀvó­Ã”¶�^`ŸHÎÎo²A<¨ðkþ³Áz êq¨ú¾>ÚÆ kW¨ðtuönà¹F.880Ì0 ¿Ó4 ýäN@•1ªÞ$ö�ì Àþ½0Vð0'P_í ›LËh]`hªë‡6TA’¤S¶Þ¾*»_èaï<ÀdïASd%…—À9ÀÑ€f ´†VèÊÌzþÊü=f«³�Fõ…u‚€«Ò…S™_ÿ¸Š¸[î_} ÐêN}±L^ÝCüÜA&4b:e£¯çh ý¤g*%ž3ðhhhA �í;KÄæƒÎÓso—W…{�þývežÖ‰y=»ÅÎßßïž7†¸Dó¸ ªÈÖøž¦0kЋ½ä¤ÙÊ’÷W<¶0ã°íhlÚ­÷LW{$^} L½­]ù c­ãצuЫ&Ù§ñ$Êùµùuf®óÜ€{ÍÜíWÙÛ>÷æ1g-ÑÙO:¥‰çyI`VgOS¾ß–rsì†[±-' &¼ûØé§µóœ"­ÂR²QÈl~º&|¢nWŽ"TŸ†íwJ‰_Ë›»òxÕlÐþ Kô‘â=ºÛXÿv4J9âRŽZ«P�ú½Èès eÏÆˆF$¿Ç“¤ú¼mG2�¤pY;ôÊhÂ>eÖ�ÈÝ1\}“åäŒÀlÍUÑ �{½&‹îùÍ#A„†F*0 DOÞM ŠT|2Âh\ a À™ç4ÉiI|i”áÖ–hJ¡i;#Úˆ4 ìÂüíw†aojw�yÛ÷¶ÅÚ@éNkÅÅM—¤­ÏMjŸ_‘ÖÞþñ¤þìMZ1tM=‹úºqx_¸%Ë/;JR˜eÔ,ö_M€Å‚“ª~Ìu֢߇Öï§>˜MÕSå?T™ßémˆ=ë.pNê}^Žbže�z&:u ¯›uŸuJõ,À”høAßi¬âÛ›Ú}ƒÒ>-½à’ÜÂIL|ß\Èå瑪`s¾Ê «]-& 'È¡¼/‚â‹úšø6yøM·Þˆ“±×ãñ÷®·ÒT½ã#IbÜG';VûÛòJ"ëUŒµÆøjeÅðš›7ÇÍ`½ùèlxcãÚ߬m.˜á[l;žŸcgê{­! ru°1½u6Ç2|ç˜k7Ïü嵪a¹µ²ð8‰Ïô¾¢^~Ø«ÖÖ¸o–~‰:IÜ�íï÷T´®þ1NþÞ¶|Õÿs€ÚäÍY#ÜàÂÁ£Aì�$·W³Oì¿Æ`‹áW%žÎn­¢/no>_˜²w�‚§v…°ÅTR Ï×èW8ð À0 PÐß÷,üüÇ`Ëôáê†á]ëN Â³ÓçÀ6]A¡§Û¾Ý*P�p Øa}=0Œ·m IP<Äì�(À<дN�_Sš9  s1¤?ÄÄô��NkBÅhì/‹‚yRÌ@¡WÅÜèŒ'¹Rp¦q/p(`©à%5g�GêiRû<Ò‘ÖêP5–>PI㨹ܑǮ*2…µ�`´VÉLÕÙë0Š–9„x–߯»ÀüšµèÆÜ¹?2¡3Fž’Ÿl�ú¾è¢™ý›±Ã@ò)¶&H†²×åæ„¦“ÿµGû¬R}ÉßB¤ ©Ëø÷r­Ô%L°Õå#œ-ðÙlÍO´îcwï|)AÜ6nÞPq°7ÃI^¼ÎeÂõÔ-¾Ò˜F»Ððٷ걘Ô&tƒ{{2ó�/ƒ½½9ý¹fßÕÀ·~ñþ·¶\[3¾6>cg¯˜™fDWÉ8£7iðþ�X�pÈ>Y@;š:6µäÍPÎK>×¾uÉêku{xn:‹°ª2·¡u±‡MPú“*òØ2ÉÖ…î•0„{_.ž×›Õma6“zdÅ©£ÝK¶ÁÐáz,mjÌ4>¼:ë“  Ñ0õq7G$l¿·Ì0« Æà�ùí- Á‘¼Ü=|O‡Pí\q‡E:W+£âñ(æ>FM£tÚ_!ƆGXðÈ…4–ú,aÅær”¿DŠÝ,WÌKAƒdNSW¾OWi‹>P}מÀ¢ßÊ€·i‹�-…ˆÇº.¹ö¯)H±Åe”zÿ&ÐäïÖ~†$»VI¡8Ʀ{Á¹s;»ëM‘Ðî§âsÝD2¿t¥L˜Èüÿ¢”ˆµ¦qnëÄ`þ/4§t½(rX{Û¾Y§ó¹Û:2«úDûß�éÕÉlñDk ΉuœN”Ö_òaܯNÍÜÚÿŽnW¯çãAºÕ–nOFT ŒÌ1·A2žîdhÇ“où|݆óèÆäí�õÖÄ%ëG™W¼CÎ)¬œKy�LE9¾ÿà47í®÷G“è¬ý_¤rûâ¬í«_�Âö›Øž¯ý2våþwœW¡LÓ«j4 §÷ȹɾM D�8-ú¬Š3zëë§¹w^<;&Óïb¸@Ý3ïünÅtÈ¿oñ§¼DæjDz¿›ö'Îêú•¨Ûdæ>“fK5“Ë4Џš«Z/\è‹Ù#Ñÿ@ùy“Ì~‰ºhݲ¯ص‘Lîw¡¨*uÝKã«~»L‰‡åÈ­,÷›öG‚[e[}³þcCø´l$å\¡Ñ ÿoäú5g¥Æm �ër]þc]O`¡OÝ—hÇI¶ öÀhÐF\ý{7Ôà P—ß@·+€Cü7»õz1"îÀ‚Ø!ÏJÓE?;Å¿ +ÈYÈŽ5+}4XkºaI¹šK|¼[èLð¬ñ;é@nâ<Î:=þ t€åù 81U…ghž­yI4I\’-rˆÒœŽ«¾bzäÓìä¡Õu‡mÙëçç<"ó‡%Ÿ“ûü³O+ûKsLí45ç½>¢Šè²;Ñ)LGíÕwN<õst6X^@ §VšD¦Çë9>úž‰y(ò[ 1±�tì¬Ã„NŠ4Ìc£ ‡‚œ pÈ’RðäY.ò6·ÿdmLÍÂÍàó¯* 2¢g]õÚ$ú! ÷òbuŠÛ7}š”]fê›yrð–à=èý·Ÿ@{ÏÌÿ |ðîx}1ÿ =ð È]¾iÃÞ7©f™8E„OKkR'®IôÉsùO.R"©×Ü?5Þ=¡O“è�¡>~¾êñÅ:¾»Ê¿Nh�„»Ñ�ë\œgòÔr¾Hˆµ�v�÷šcNŠÇ Ä?±­Óþd �iŒÇHVv^ïsê´˜Ÿ¶1×›Œ²8À.£Ó&³AÄ£ÓÛþë�b(‹Á�Þdh¯ûW7|Õÿå0ߨ×*R9cÕ¾ÞE ®‰ô5rýÃ,•$¡Ó¸frùÓOwlƒj3EÍ/4�=ˆÙÔ"d`—`@� ³èÐ �e„+¢lÑ>¦¾i MÑÀd_±g†…iŠJØŸ™ƒ ¨m `””(@-Þ®Ó²¤Ý\ùUñ�á›s¼bRÔPáÐggg¥Í×3ß ¿ÃõôÙwm‰/ܦMp”ÕW˜oM�ã„Р^YŽV©†klÜœÙå¨5¡–˜§Òi]tâÕYÚºË\¹Ðî$À!ªþ‰¬_��ã–ÍPÏ/ †Q7Ýt¾¼¸G™*_¼/›úŸë¿ê‹âê:̹ǘœ�y—~ËoæÓÎõey›7îø�Ñœriÿ__ÿ.v™Áüwåàõ¾»ÿ‡Ããµj/‡nS¥ÍftVOÿ2|ÌyùØó*©‹Ä‰U5FÍí꟯ûöçï#—ßÑ yZ—íx  '•׬Zß‚•Û÷Sß_dû±N½KÉXGÐÑ··©í|k’/Ú'bY2ÄSÖ©®]Ôðõ-ýÞRÏãqñŽ}á‡cÙqÞL]£ô¥XÖJy:«¹G|ä¬R*~Økêú|¿Fzw".ò·´ù»ß¶ÉjÂ~'€h›-Þë½�8ßô×P©Ít}ßÑz2~•IÙŽ€Ïï pkVœ�íŸÀ #YåFè5n?ÄÝF;«Ék‹³OÞ¨'€šÂë#*8Yщ­Ô¹ºŒ'xû�ÿ àÀð À’Àô%ûùåÓ"æ`aº&§~Jô<¨ç¹]œÀ)P'¿c BËM(í“nѪÚáþÄ�nš€¦~ª„ô¬ü\ððÀ×Ï ` ¨§xy¡¶ÃŸŽèª33£’ÉíThzˆ‚Ï­ê¼e5ôpÉS—foZ_ß;~á!Q?º?‹P¦ !§šõRÚA™P©�09rÿ©\ùáÉWªƒÄþ˜#‘Ë 1÷5’ýØ&;ãuö{;d¤è~ȉ‰]"˜BŸÓÞ3s@m ²¨ïàˆä„ˆ¼@XÂGbø4—W ¯–ÝT_jIA j=£õo²<Ô{.žÜ¦urÛI¬-UýmóRpCnù)†–<2À½iH‹ÑN­,ÏåNq/[\üj4m:qpf'‹b¸É—Ãt3óüm‰skMR´s{’ íàâ€T¤@!1Çëùìþ“V%4£ÉñŠ7ZñláY=4}ôê¨bë@I¹9 B$3 AVH$ È�D:õÊ�D¿i¿JCÚ~—dò(Bað­‰tžh�Ò>\}»¦-†|%0Û ³L¾Ø²—h†¢Ñ¾ávœí˜˜Ÿ') Ÿ=^š>ƒù÷^‹¦?JмóJð<N:Ø3à(D³]A¨ÊYOú¿ÖgòÁöëFö³ùÈ^ ßÇ'ë(×›o� ²zNƒöŠFínIhì�.ïcZõóìÿág”Šª/ÚN›vcê¼Ùoi Ôàóe‡ê¥’/ls}WÍyÁ”çÉ-s@ËãÀ—’+^ yA­;\B­Ëh&VéœËí­§È盇+Tãî2Éc6ù·j;¤¤†(™ �µÈzIö“qar£ÿ�õý-)†F)ûp¾˜“.Õ€x¡jP• ióñK1>%½5aÓ~§¡¬B Âîˆê“uîÔ‰#ç�›=@p1é?°ïP¨s�Þ+°$f!ÒYÖÂ*(±óÐÝþE%qÉÀ&�hTˆâ€¸#ÀXЅɵiOä"�I+9ÆjŒÉú[gæ½nÖŸK’K'›ŠµªAé…É“¥›ZõŠ‹­ë=O)øz /S¬ _q²ºéÞI ÁOœ§›Qरiî@âq'CäZ½. YͶt•¾W×>r]{½®»ýíp\Š"9œ¬sÎ5u›ØÁ®¿Öš`ìõx»«xïbg¼M*c/,ý1?5éÒsÕžó˜°n¸¬é]ý¬¶éÝÔX¿ç “Ç ²�OggS@Çì ‚R œeèdÿÿÿÿ(ÿÿÿÿ8ÿÿÿÿkÿÿÿÿM^¸kÙkzÿ@;?$³ÿpQ¹…ö�.þX-f¬ø T´8?:|L?zÓçäøÚ 7l¥Â|}ܨîþìì†{ <ñ#¸U>ˆÕ¹½ô!±l1o•rù:ÄÓp ýñ^}kšbˆuµÊ_þM°AêëÿºH¨šîJ)• ü�<€óG?«MQ¡G¤Ÿïuùõg<�+²Ðn`™öÈÙ5M•®ü³ / ~„éÁ¾Œm` g†Ùê�aªW`ð0Ïe†ý¯ësè \ T �¾‘HÌÿNÈ˨߾ Dª°UÆþP �à�‡:1’UÀgµ0ÜS|פOþÕ˜9 :sL³¶Ã~ñ$`.Èkú9œhD¢± ¢¢O…v �` ­d3óeòÖV%»÷ǵ<[¹‰þ¸z™ÌžÈÏé?å‘ÛSæF“ËÍÍ€å ã>Dôz‘ÞvyW/øË[s¼v6} ‚„¡ê„7Ç) Àÿ|YݬÀ› 5sñÎ[+v”'déeÞ¨‹.ƒ'réþzÈ55<êŽqú]¼©¬,ìv\ÍD/j“Ÿ¡Ò ±¼&Ž]gt˜ñ^¡Ø•6à]ï/…‰å¨Ìþ®»ôñn}’#-)óÞh!/+þŸ¦@M�`iÍ:Ë7 Ë:ÐF;Á4š‰¯ŠÙÙ]Ùþ „× Lj�†G #¹îk¢�ýÜù€ ëƒFÞ\ ȇá˜Jq¾Œ´¨¯®ïiÇì7CzMí+æ¶„Øôd¡×;~?e¹\%(Ï.R®áþ¯£ýYªüü_�0€zp¼fç>g‚&Π3–!AXãò°òìŠS§ÿÒ´ ˆºÈ`L½TŽ×„ÏÚ’Ë4––|˜®[28Ò&‘}‰äž…�9Š’¹J´ú#쇰I;Vس«R¡™ �%fEó;ÇZK1 0\^¶p�V�Ž$ÕÆæyølKL  ãõõý_{c+iUçïæù>�93òedmWÃíº¹Oþ(œ-7í­SNZ>7¹ÔÕR“v~tVŸîSWt}|ü¯ŒgX(^ùsÆ�Â-[­áîmàu«Ž�{cDdÐ÷¸“@"xõÝ›éú(‹_�òëåzAu³½µvÅFZB<·)áøBÝ»ÛWΤÕ5eI4mø øoðþX6|nS©Ž�1_éö.Ã.9m‹\‚y±]«�ëHê$Î(æ�Sa J¸Dœãe×ý(Ÿ¶/|•Rk�c†ûÖÞ¸\3%¯ç±ÿ‹²#8ëD¼;¥ÏkÞì~…ZWÛö¶Ú„,öV-‰�sçsp"ൠ,à¦Í0ÓÃû`ÛíÏÏrìì§ Èx)mÕ0¿÷¶}Šøt‹T¶t­ÈøãÀ‰Rll$l2¾¸›ø{¢?DeÿIN,•þp.óHŸàÏZªø“P¶ÿ´a:•þÿGAùñiº2]÷1uÀKß_F›€¹iÜÙ–¶º¬À6®­”ø•'J�Hn¯÷Mu‹†¸R·³ÊÀ¯¦ùð  Ù]p ä’j<þ#–1ð¸Rü‘¢ëèÈç%«_ëÅ7¾‘éçÕJSA�.€ÇÇ OÙ  + ÍæœT—·W|@7šÊ„ �Òÿ@¼€Þ àð¿ ” 0H@€çã²{’Q!¿ 3WˆKº™1“©ª×ó( è‰&)Oq"ª#÷ ™¤wOú(2º�ü:/õÇ+ºùÚùìˆtw�U'Ñ&@ë Ô© À^[ø}Þ£ñ¼Bón� ÙGR`ŸïïÉKj,[ì™Q³©Ï«È-¨5ùà˜}Ó‡” ¡û8>[Nº¥r&/‰Ý7)­¹Ï1"2 @Èœ€pÊö�ïû¯u‘·Ó޵Ý–]צËÀåýúßÞ]>¶‰7ÿtç®Õn=ʾ|ùIáÖ|8zhþ­uŽk&¬ýYöAÁZøÏvü˜¶YÚ}›Ä€g>€ç±F·Ú¾vïW‹}ÊLÈA F\.ÒëÃÑ<>ÙšT÷•ì—ö<¥73"†XÕëôo­ùÓ:Õ³�í»QYáyñÁ9óH0ÉÕÁ?Rí/Õr�81«¸Êƒ¹�_2£7³N´T#¤âÿÙ7GçñŸ¯þ�ø0¹F¼ŒÖÇwd[¿�ßXª{02vL€ÇÔ·j_éŒ8‡pàA²ž@ëI '– rjŽ[sŽ2ßÄy�qm£bñ%€xÀwÐ9×ù¿,)B²gIÖq›:d3Æ:6·A‡gÖ/Ú 724µ0’�›KMÉ̈hF‚ÝõÓ|UÈj@¿ã4‹k‹wt0MóìˆX›£t3ôãXÜ.ã89W©¬óÇ“±òÉ»žóSž:+ÉÇ÷`ûf2ß²ïÅ}¦}¼7:™ÛnbØé—³àý„GËóæÜ‚gR¼A5ÃÛÁ³únl.óÄ˸ÊÒž£ ÙÅ+$9úѤGZ´Â§ŠSU Y�]hmLòAèáÿ/ãr|\5»xy˜P·ç£Z£~Îs…l̳+ñ&N¹Õ·Ãøá]ŸŸã>'Û›ü¼Aþâçˆ!¥ò^wÓ-ßepþ_—ý¶‰˜ÁYÎר”†HaÏk"ñÓÙKâ‚jsSl%Š›UŒŠMÞËp]#¿MËûûæ4«»W—ûpüæqs²¨cÔÇŸñ[}WÕ¿ýÛ�ã«Ì§F­÷>iŸ?i«á�¹T½�ó:‰Rk½I|žÇÞÛûs¤áÓ×þxøª8œ��¥‹q1æØ~ó–�1Àh¨Ì—GŒ/rö(yÃ$þÈ›”_ž¾ :Äð ç¡Û/”@é*t{/wcÙªöèç²ÂØT¨’ÜØL Þö�ØáæÀý,«ý÷1XDR?ç?’�»+å¡!EðÏáWü ±Ž8wÐ}øÅ3èÚrT%­. PÞ¾+èü‡}€ëCttñT¸á»ÔüHÊêIW€”äoÿTê©dÉQäïífa;Tdþà_œü/?ŸÔVýhåpU¤* åcqŸ %.ïKýnƒôä6Ý…ðlcSú V û_?šiÅ?gè~üêiZ»}WõÐP CólàÑùòº+]«R÷GŠ®G ŠåkôîØäñ—aþ|DŸS õÒ&k×Z£‚6õÜ©}Q¸[ˆ¹|,•¨¬Ùfæïñüšz?÷š&u€Jq<8©A-¤¸f‘DBw¤Ö’úuNXq*YÔVfò�¦‹¢’ @ˆÓ*€ 4TšÎ‰¦Z» £›)ø>l†€�Û6ßó”Xœ®Rg± ³Wù}r;º¦ðLùiqʾԈjOúQ\ ¤÷ßsÚ¿*_Q9YÍ(”%ª67GEµ¾{ıúG–.¯¿/K®P†m›åä^ç¹ê‹ËÆwy¬ü«cÄÛ¹ÈÎYÙaýÎ; €fÎö~ÛlÕ ¡ò½§ÿè,c¿Ç§¶U)^”»¤?¾\`@úe™Åbîrë2Ê­_íï ëµþ±«×ò)’—¬w_·¾.7ËkX�pü„„äÚõW(@Šî­Ì«î¦/Z¶}7à)ý²¼G@ÒëÁ’Jú]çíó> ÐÔ®O–8‰lq6ÿðÇ3“Þ@܇ԫ2='š}Ú<ñ×G¾5 $Ø�¹ÂȵMšZJÑ(œÎ› žòò¯Â¤Hü±sÊþº¾�Öñ <ºšï£ÚàÜÖÅó«Coá½V~(Ïrùüä`¹TL*G k–©5œ†«¯á MŽ�1ö�ǯµÑ{’­~”¼Ý—£Šõ$¡ÑšýQ•…b÷×ßð¯ÎΞë÷!y+=êŽÞ_=‚IæKYfvúëîåÎ9ÒîwrÔ©©Œ^‹ ½äݯ]Þ˜‘ÙÑM‡$ *ôNn“±›„óMÎÜÿ;Ù*³É•<~ ÏõÖ¡¾ô_ŒÔ\ßÝ¿aãÚÝl´¶Š^´Ó›°?, õ¥Ç“ŠK!Dcöø¶ÚÆ•yvãú†9\ÛYz7÷ËÏWüŒãé܆j½¹7ï÷)Ó´»ßÍê,U­f/Ïo•ÓÆËÛœ.O)y¼bÞÌhçœxÕ}·�Xßcu›ùRáSºÝ—|uÜÔi{È߯q MDŸ…˜à³w¯-‰Z Ÿ8mlÉáé2_ÖqŠïí_]¿ËÊêT]¶E2oŠb>]Wõ>Hˆ”$‰¼’76˜ ᔽÚqã½·ÃTöÿ�U¡­ qYI½7YÊ�d̦‹î¾UØ)Å Ùc6`¾¸[Õwý€àÏ�Xa'ÉgØ?êŸÕB‰otÐ÷'Öpà]¤›kÄ,ί£ŽÍ×ýÍäÙIdºä·Ö[Ý„úøßM;€-=TÍ_�fdÀíÝÝçA:Ǿ@‘õWÿ…T¨B/@›ÔM�ßW€çÐnàøó¥BÑ ÿ €¦VI_Ç­UpúŠÆoÓ/ ]-a—æ}6p<ûØ+q@½Vh†_Eè#ž\T×_ª8 53_öh½š³Ö�‹£Ö Z3´³Ö©ægWG–#;£[ ¤5˜‹îŒ@gâÊÕ?xJ†{¨5’d¯dJR».¢.žËaäìþ|ù<�ލ0UÉ8êr½ùá²_Êõ쳓Zé´ÊŽ*,úuлùdµ7%{W¤v„0šó~ПÕáúÛòšƒ'#»é¡“ÈsÇPðvÀ­gà€~Õ�ã=ÕÄ‘Ù_NUw7£Êèñ{ÄŸ.Hö£ºG÷ÖF¼ÜRL¿V/üµ†Š‰j;©¼›Äí[| =F„üUÕ¾ÿÝ:?HÄ�¸7€d»×=š~уóK^³ày¥·iWÚ Ù3KD. -¦‰¯4g?1±ÞÝ,ÐãMDßC,ļ8—4½„åqaæ‹{4ò¡jz±?=ÍC C�{~_5T¸†ôŸnÈÆ]ÐáwÝÞ†òQ_jyX¢Í2—Õ9Æ›ÐWØ«ktUy!LªÈAö â J«,€ Ú¥;[÷È€ÞX‘S‹?Ý®3ݯåW{ÜQO^zˆ'S½?+kl¯Å¨·‹Þxp¤õ=^’p]�èÿêvÉ;"4ÁLL_cM k¢ÑÓQÅ/Ö£{½,ŠøXÏ�\7ñ¥•J’l˜q¿`“R\.E¾ÀÐ`)6'bRù“çŽ6$�½=ñkyã7ãÇÔ­óÿÿªCœ÷žrÊæ„\÷õý0¹'›.qJ·5æ­Ýä{*ŠÞ«§#,b_š Ó)ÿº¾pŽJ÷_Ö>›¦ào�(UÞ“ËõY\ú—f®ÊíóÎJôèñέ#†ÌÆ‹ž¬Åt¼S7îhôɪRøŽ¹m%‹1/+²io ØšíRêÆÝÁüÙªõRYDi¬'+®/ÞýNùv0¶«¸>ˆym¾Ž<�‰"K‰Q×%3C¢ÏO±�=ñïòeqÉžFòÿs'W˜n3¨ÜžýA“ÙKåh“/Ú¥¬oño'fgÕ¾¼™q*WáÑ«ª1Î…Û­2EÒ[Tð6å�7búß~Uݻܧ© Ï­'­¬sêLÚ:Ÿyȧk¾Ð;ªÕóûÈ»>N—kóÚZ/“õ«ÊèÔ½ ^¼mç¾�憎Ue}œd¿MŒ�¾ŸöìUyÌ,�dëOggS@×ì ‚R&ØèÿÿÿÿXÿÿÿÿqÿÿÿÿzÿÿÿÿc>¸kêGXLo$öpFùHÍb÷c?q�0‘7óóéâc·~�?�aóTBîÄ›`™?ʲÃvÜO¼iœ¸ÛåYÀ�ãh_kºâ¿kg‚§šÂðE@�ŽóÚìTÔ¯ŠÞ€¨ÏþkjCr +#&_<Á0—ŸÔ�((©  5{}vÆ*W5.ºñkX¦©˜åßë Zuxfºñå8`@»{>g §’¦ûÉ%Í— ÀQJ$O±·(€@Ÿ]®$÷ê{4À ,@€Ö‘qœÆEö|I!Ipéè$oüFNçG=�[A·z‚`ôîQ÷p˜IE²hí2§[è(þ™Ÿ{K>ŸïU¯�’‚ SV% Î2QSeÉÏ_�£>¥*&óïTvÕŠCtÓŸd‹H­ªAL€ª}¤ § "ª=¥V1æ0�ñóðuj}dHТ١«StWaž"÷=ºô/EK·Û4Ú‘‡LE¦¯d4§§ÖÜ;²5”‹`wI¯…B 8NàmÒ¢áßχífjûðÝ-mìxÒö�Ü»w4Åïƒ5¨Ó “lHAÉ*©ïSÈñiìËÐ쪂±Uÿ`û:°ƒ7…^|²Âð}]è:.C¾Æ¥Sï×Òô%§¢@åŽ âÏæ¯ÿTö®Sv1ÆÓ±·ÏIÄæ~ õ¥žá¼ò˜Ì¸ÉÂw >èØó|ÿ’|Ã…â)ºä2Uónãﵤÿ3¿ÙÐåšiãTù‡–¤\sÓ,–ÚI¯w&£ËÇFIS;[¾¼Làï2ݦ S)iª&�B†�8�-‚~øK° 6 ì=ësáÕ†³ÍDÌÙ»vüÙå~b/³¿‰ŸNº^àÇ ¯³ì:Þr­úÿ4Í·TÐ6ÙÕò›��á›Y¾Œ)v¸¿ÄW6þ­I�óß)p‰».}«‘m¹¢—ÊVK58ïׂÞQ^Í^:v™õäpPÒÒ¢s­À1ÏÄÎgÃ÷:Ò}cÕ¾õΕ©NÉü\{°þå²è»F»ZÛVߺÔ[f€ÿ¥Súò¿%ß6K±JcÓoU8W£*ã÷ê’ÿˆµ��í´Éµ|É7*rCÕžå–ïì™­'‹__í€âüâ!¦Nïú}þคZ£�gºâ0-q3™Æô~Yðâ?}Ú€ÔµËåþÿ¾˜€j·XUÍ|¹áØN¹Þr„{¢6ÒR[m7‡Nôµ<ÕbYáíŠtR4ÜÌ+x‹í÷§vW8d�RˆÓì»î‹ì „iýÇkÓ.Фl8èf©X4ÿHò6ÒPôåû—´Ièö×1K®ÿË9×f5¬çW(®/ó¨ÿqi‚�z°Áh9åƒòœ/›_×%.ŠƒÊá¼E™Õâ'Ýdï×èÐ[vô±׳ÛHj óƒ©C”ÃN²ÍßÄp37ÐyG:ši_F£œª‡ÛæÜ"«¿áöûØt8L¿yô뼘ÞÐ>Nµ}AÃ,¦x¼Ùç³h“ƒ#P…½EUC*§]! *qcŠIþ†aW¾áƒ·Á81œ•1Ô%R$NgªõqìÙëù…ö¯µÂö<œb]£°¼¾7‘¡ð¿H§ûs›Û<®;ª²*à³þ*;LdNWm|êÛÍ5“Z•h˜¡¸ÔË¥;q7ÎPNC¬2ד[jŸ»p2}>FK¼1ÉŠ üêWÇߦ¼”/t‚Î?o¡öÆúÖ¿èÉ]Š54Þ2,íùŸl¹¢<ª±:ÅrîÎ×/­âþ¡8„Ф}ÚíÔ§óµÚ!»�¼v7ú}‚7%&VõÝ©³ØÇsœ PæÕÉ$¯ß¸BT{ò¾àÒ»Þ‹ZØ,qN¡úmÒŒµXÜ5•ï[.Y_Y’9�ޱ1²ySÞ™BÌâ\@ss¯¤ö’MY‹ÆÂLÊ¿16B±›Àªï¬¡hM5ûm@up–bÛÍ#c°R`©¼¸rC¶]ûwü³ÑÜÁ^å­×t(Ôç†äÇý”r˜Ÿèw“t¬|ý¦ xú‘À €-¾¨›àgÒ¼(F{Kb9çÕÏT],jxºT61R¾ðôÍÑ|Ê_Ëp$Ü*¤Üô?ŽÇ`ëô/²å‡6Y%j²–76²ëpýò€Ri.—àœí¿¶0xyë7¢`ßÕ5 nÏéáVuj\øÝï�ð=�ø‘2b©Hîj®éi™ Ø}ÞùîÚuZRiêŸ[qˆõ?þO*‰8@n‡ª¥+ðÁÊ«o= ž*3H§·�è Cæ–�‰’XP¡z4ÂÇÞÓÅóß´€Z…BZí§zy@ß/Ð3€ðPwšŠ€C×nª:WW gú9É ûÈòôðèé½õ©Ù_ÏDE;+²ÕÉSº.~öáÅ÷7q¦¶ƒµÎH&ÙrÁ…@> �EƒN@@{dƒdT ë\!8¥A‹U�V2%W_ÇÜ~ë„ ¯š ÈNC&Ìo¡×>òœm> I¯[ˆ)Ï8쟑̄,Ù‡êñ8Öš³ÄA¯kI 2’œz È €~—!s¸L"4é„ ÷>ÙÌ�…õ®?gsƒÏ,Å=Kðêòà0÷blžú”hB5¸§Ð�Ù-âÊóßõ©ÝlïØ9ó'¯Â{\ׂëïÀ/€|šA‹H?ñFñC™){ünMâˆ['”‡&àV잯ˆwÏ Ó¡†“q@[äuòveT |ž9îh·§\þ Ö•ÕÛ/ИýüÏy8xrq6Ÿ`7£KñÔÏCÈ‚¾gÚ{þ•ù‡e® ¾uo Adçÿy‚Õ[!V.$Ë:yûdË·!¯Ù»qç}¢Qm>`EE¢w�ö:•{s²Ô²BUY~¼*�;ºÖ˜Å­Ö÷A¾/ölûõ5Ï3äX�ËÓB×Ýw‹i_EÌh¸[SYV¦-›nöùOÙIzv—Ý|Å-»Ê&ZåZ]êÆ_ªg“ <²¾6Uýé¿~MŽª™ÓöÞù~oÏ?¯Uñþ-ð†ÅKûÚ_Î?¿ƒ,%hV7øF©ö*-ÂfÏ—ö|0.HîÆšf—Ò�ûþc¾¿û�d§Ê¢GGµ‚X§ÆX­+µ.QèÀ9؉2g›MÂõKú¬ +Ôoo×úzÁ~Vã¿14\vÙÑXyóõϯ^ÚØúï{]jgÎNe•ÔÉu‘ÓÈ÷Ìd�­4ÄWù\Á�ÊÏ÷Qq'N|ˆfÀ÷"¶TÈ%‘.\‚¦.[Cœ2Þ³­¯x?»õ�ï{9ÇH& ò²39MO“;Îÿ½âùúâ g1±ïäm{¶»Ûçq!§œ±<ì™ÁìÖíª¬^ð¶l)öø¹š,-ùÒžz­‰ \¬9�Å”‰�·SŠ6–}ÙîCñØÅñøöS~¤ÿÕ0§Uážó'Mt³^ê[ÔqÛù´ã\Tm8?®ñg§fæm‘% ĉ j"¥Â_Ÿ6Ëùâ4§Ëø›]ð‘ÃUŸˆö/´¥-Ëz3ÌÓM¶ÓÚ€å£í?Hý¨{R’I€ ž¸[¸wÌ:(Œ6w¸¾Úîd_³Xá#Zõé[öÛüŸiôƒ€rS…æ;ÏÈû2¹é£:qögæ˜BÏGÕëOÿË'­-øbÿØÅi@<%�íûöÖ …ë™qªþâ Ô*\QZG €ùïÆ8@Ÿ7Paë}„¾µXŒÿÓ5ÏÐˡ迵iÙS ×Ólfêÿœú¯ŸÝø€ ‘ h-œºÃÃ|ûÖ tS@±ÐL?6jCÅßd¨8[þyÀŸ$�Þ÷°€ ÿeï¹iäïË£&@AÓÅJ×ÀðŒ™ÐDޤˆˆ¢$Šô¿±G›Õ<úŒ?¡©â\SæÇQõ,‡ŒçhÕ<¨Et¥§5àQªÃ^gj‹yPAXŠò‡.ê\©hWmÙkPEˆ€³C‚*Sø�é©©¸Ÿ¿gÊ uà@Ràè–­Bò³‘‚å8÷a‹ŒJ®¦;·GÖÝn-MÄÒU)§õtîÇѶÝ�Ÿªç½ê`œvGuNÊCÿ_˜j5…\Rö’ ·ª§h~‘£œuöNÎü²n<þFÞi—ž¡}[ù Ê ‰©pêÞ+Q©›i›;K'ÆÚ|ûXé}ê°Æ±l¹BÖˆd’ÊÈ2ÅŠìyÛ�*8eƒ#ó~N˜¬Ð2Îà ½ÿÅ%ò1h{0Îêš«r>2Ëú*¦úÿ}QÑÞïÖ²¢/á¡üO³ºÆ<ÂG¾&âçT ~çßv¬Ç ÷ÉKú&[IønÚÿbLd«*Ms)3#åx Ïëç±ÿ,s§Ö%ùé•ü/ε×4É2c�QŒO|œ]ÍçóOÁ9k?.Ϫ¼Í"%þ´ù09èpïÈ¥ú*(U÷ŒÜ‰h~ðo“‰/.‰e¶›�’/OggS@çì ‚RÕhYöÿÿÿÿnÿÿÿÿ‚ÿÿÿÿvÿÿÿÿ^^˜[íwèpu8~4=. ž¶RÁkõø/Æá§Z~‰Ï”ƒ*×�p»øë|×x–xç”p+G’ªÖ557¼9e¾ A�ë{û‡`7ÚëßùŸÀ¨÷€[Ä’óð¯Ø‚un ~ùD%ÀÌ­‹‹ÿ$'q ê u&›Ô©€ê¬xM½g�;œ¸�sí8@¯~@›qe`Äù…C�#ÌÎÍêÇlf AЀ´ [½…†ÙÝ=ÑD<4Ã( n �ñ%€˜¬ªøê·€�bS�îF´é¯‡cúÁkÇä{Ï)¦=êºó¡qL™M"ƒ¡‚K�Âô�“³Ï#ø�”ãžÏCø“¨žJE£¨øØ?š‹å÷ïGå‰Öîz6};œ ZD¥Gº‡ÚÝ3]lì«jüÔgIJ¸®‡Ñ^ÿîÇ{ý¯§ •Z4tÂc˜ºß?F²<âï~Ž˜ù3ôû¯`ÿ}©?zý&×û{{ßÛ5sT!)¨„€Öá*.~ µò{ÏßáQ„�ÖÎôs÷7™ˆ6 É� Š™0ziÞ¯c‡å..=~!ºYÂÌ””ê\É»îº0ºhXH¢Zö¦„»ÎžÈlùT¥ÄÌ _®âzU,[~˜ð-þãœÑÕðà?\”6ñü@$4"_iï[}$�›¾Üò3IµDåC—­מq>±ýgm¿±'òÀzöZ¿W²åDè××~ñÁÏ·*NĈ†3ã[ÒŽtKiÜ<¬ÓèöÆ ÉÔïôø}‹äÐV¤ÖÅš\xÀœÅLG­ˆ˜ ¾ïí­ãJ!oFš(ò¯5p$%-Ãÿ‹ÄµXzƒÏhpræiEmmªÆáí¦ÆhQ$y¿úF?ý•»K1:´ Y®:8ûÏãFuÑTþ¦X¦s£ñ\N ²úÔ®ÿöÒ²6Û(b¾`~H{àñ9ÏàLì,kÜjùÀv¤ÊSi1¾¬Ó7©¿gøç ó­oëË(Ýê/ òÑÅ\ï¹ÉŒÿË¡0JHý×ÏV*bÑ>¯jb‚cņ{­._)žv°AÓN\]Ÿ,fïwýy*užGÍ7væõ›ëûõ É®ÝÖÂPø};ÚË\ÓU2‡Ý¨_™œ�XJº.�~àGyt\¾2Iäy‹ÿsíöiø_o˜‘êýš¾aîëwYmrB9_½nÎ×P&B½>6<{rÕÕT´¬rD &î§G½î²•ÆÁ;J¸×'Чü˜ðm¶Vm¿)ŽG"­Œú$*̈ðpÅÿ®ÒK]øßl¤ÊÁM+ѵ™Ub›ˆìÆE÷Ë;î0}㲯$ß}òŽ=¹O–6ú‹-a½c‰ØH‰ivBk©Koɘ¾½’}{¥€q6úw›”mÜÞÓ±›�Y•Ezz;qNŒñýj|Ÿ§ë/Í Ãpþ6! ÞïT],BpàEÔ^Xh,X£Ö“/¢eð,j£=M@£^L”f£‚¸žˆ›¹gXÌö%qÅ�¸Î¿íÑèÂ�­*ú €ÖiÌ—õc·þ:ýj½'°yQ ¸ß¸&È/53àfDËž¢ÿª—ðTÊÓ¿ó_Ô^ëöÎ0^:èÔSôô¡§ó¨f è�úü/Š^˜¬ýoŽÁÄr‹Ëøêýñ ÀÜ ÄþÑO‰lÔÇúÅcÂ/nFh^PŸ–”¯y¾ $8t (þcÜ-颀ä%P=�žþ7¸÷Nñ-Ã@͚Ǧb2¾EÔ§€ð*<Îâà À.ï@µI´È%rDñÙps¼A¨$ÊT°xûLþmÍÜWF€  Çz‚ôÕ�zvç쮈Tf4:‘ÖþÚµ«(;; ±F¨ÃÐçÞèãµ¹é"¡‚ƒÀì¨äMW¡zÔ%�ñs×Wù•ãÕÒ{¬ªhÍp&a™!ó¨?ÿÜâÖ¼œâ8j6­ 5òõ˜�ÖØ»JgJ *í ì19¨NJ%$¢Ð‚ÊqTŠfÂHòßÎã–?FD]í~�”izº^<É+!Pƒ ,CPܬ Ä­6�ÎÈ�Û µº M,9Zë¢Æ®»z pè$r}Ä磾Ît±Ö´Ÿâ£¤ Ö,ë“dZ'ëÓ2Jø$9;ú0‹«Yè›îÍZ$�ÒL5§áûü°>±ÇW‚g FO+ÒrÎvåÌô‹6yܺA³‚ŽÍâ® ËbT³¥Áœçóu‰}Æ£ó°ú»¶“'¼·=«¾Œ�tÅŸÚ˜÷fì™Ú¿�ýi-€‹Ex(‡ÕÝ­Û/¶ÉÏQæwñ6£xMð“Î29�K ×Sãµ�¤SórÞúhû| û±ˆùôp¹ZÝ×Ã5t?* ¦NÞÄ5àw n](ÄêÄ_¾Øb>šøP m S�/{$ܨ(ÿóV „lQÎAoßÿóçûíð8¥õ_ ý¼V…ªñ’õÇ+<íŸÐ¼€íÿmÇ©’\@Qëúøßý’³õÀ�ÛÃUÛσƒÛ77Œ†ÇÕ—ö@‹´Ž|9`ü½BÎ‰Û Ûº?}/ ¸ƒ¼÷¦·Ï_jÚ$-}\ÝÎ,¾îÖ’!_Tz½Ï[øLN#§(™MÁxòøËüÈÉGo�å‘1»R²œ!ýj{w oPÃnOoL8c¯)ÞrLÇYH2#w,*[Ç¿ó$â2oT7ΤÀÐýÜavîøRÿØ �¤1Œµizž†štu äíB†ó}AMê‘EeZŠÂNß™xà¡*‚�æ'9ãë/Þ Aµ* WHƒý“êMƒ¡ÊâèaÌt‚ãíÿ“âFTBO[¼1}ø$çk.—”uUn)&³öª½¦ÍgG°pb‹õâÖÍ©³"ů[«Ö»Æ×T�7 ØW¼ŒÞ‘ŸêÑS�}¢&çueïò�O9#!Îûó—ølɽç±&‘sˆ\’/^þªŸÇ{+wÈa�"ë¯c›PÏ­+ƒíËuuššèum—-É7(½¼åÌÜíhF2·ëjµ×ÑÛài[5«þ>­}ÝûÞ�d–kÝÍíðÇÝ_¸ºé%[—ö…ÄfÈÓú×�áÉ—ñçLå§prM8‰æWëßcÜÖêð¼ÒDQ&Ÿó¼’yŽ}Åâ¹-q+S�ÆÎývDmi,g­„]VÄŠQÀÊfm³y²pVqRÎéôë-¬ïè�{Þ´1�¦¤6öÉ»XNp’K4bßÍ›8˜|ã ç׬¥>ñzAyj‡1—šð–¢Y#1$ü±àÜ*,Ýyˆlù¿\¢Ò†¢+šâ~X‘ ô!Yº÷5.³l׿ÆÕ*3ã±YÇS\¿ší<ŽmW¥""V#©Úþðþ§Ï'mëA´Ì²B�JR%?”u<á¿„üí¦úÂX…U­Å©¤ßÑ!°<8v€>˜ëö+ô‡aœ/‰*ÿá"ÿ•>/~¬ª|' ÄùÓ+ËŸöš¼-€›®ƒ·‹ŸÛ ëE_nj€[í�ýfÑÏð-�§h;Ò:‘P®›y' ®Bß@êtþBup nXäpz}òŸ.tXÇ€mÁâÍ€ü‡—XS ,>qžÈêžJ«så/¯¥ïÏ|驆 tUò|^ý|ÌŽŒ9mmA'(ÐA�þÃÃ4}á·spæ/ PÀ—‹¦¨€Úδ}@áÅðÀ­PèŸÕ`€«ò©.ô€ä3´% &êí4��Tá(<èÌbd>g™œ‘x$瀔, 6CeÏJ¢Q÷PÉôê0/H8Ñ]©9}WZ‰,¨Ù±'{(ó.J!QœŠ0Ñ {Ì jÑ:¯¼~Cî—™CýõʺwM ¨S¨0aƕӘŸ‹<še|ö¾/ñìtç@óÙ·f׿#þ¿«U=*Ûž»êô*U`&;É_¯牟Aèr_�èD�¢8 )  �êÕDÐåöÿ­ü®[<Ž^”…¬äÔ�ìÿ+! åý-9¯®—a†T¡7ï7é$ À«6KjÅ5;Ë 4mÓEºj‘7‘¦z/‡ð)€›G½«¿‹T~ „ýWg"Óò:‘è«jpؽE&šøâ-•}„ñrb³Ý@É2ZvŸ<$¢"y(bÝò›p�©l–Toçý¹ÂB™xýy8WÓyâÔíÍ{�ÑŽ‚zñiE..—mµíçÝç–¿³=¸Ós0Åð¼­YMý/¶8ïÆXbvwÕÒõ,ÿé46›ßðA»®×?µõ��¤M#\Ó:Ýãi ²Ö®‘GÛÎôù_üD3­þ36yôŒYV\ŒehÑïîe–±Š�~|ÄPÔŠÉB‡�gÝ÷:‡kV!Í}T�§?ì¿A$óäN˜Å�2|>º‚ˆ(´s$núÿ&™CD\Y÷î2M'œ™Kú¥„Å=±Ê·`¥&“ûC-ÈoY²«_níR¡ðÄík®‡­äcFzœÊÌš$%›ëØ�ͻś1k3¹�“äc|ª@LJz»=5Z#—zŸÉ¿°²§¡šEþj¼–ÊÜçhï6¹h6=W2⇒pŸ˜ÁÁ/SÚ« pf©Œ§_’æC!¿m3q_„1^ê¼R„ˆë¸‰±†êkÍsSü0eKðÉ�sïÉ©ÿH¸Y„›kÇës¢¢åõ±Ï2ÿ¸ZGÁ?ühéÆå¢î:i÷¶ÁÕNëág}Ö\&Û²‚ð¨s9IyKã§û±+�çæŸ•�ÇXÔ4¨®òÒc®åØŸ‚ò² >½…ÏóXø7Ô6s.²¹ßš[Ø×m>·sÇ=¼òšƒI˧¿o‚«ŠecÅúùZ$ãÃ!¢Æk¶ÿ÷mÕßm»McOœŒƒõFUB ÆkùÂæu-Ü œþ vËŽ¹¨,ÔÇçðëOggS@÷ì ‚RÇàµÿÿÿÿlÿÿÿÿmÿÿÿÿpÿÿÿÿp^ˆ[ÕW8(o>í×Ñ3ÔÊù¡b‚+ÀuáäÙýxùæº7´M D�ëãŽÕïj�øŸ•ü}ÿö»“ÀMŒÈÁ²T¼_t –ÕÿMÙ­[Q¿Á9ªVjtá»ÅˉAÜðøóÞ1XëÍ À=À_ÿb5\÷ <Ìöõ“ç@íîè~¦Ü>cÖâ©?€z6ðf†|Êó¥ÁƒÎç4PA ¿ˆùœ¢«•ñ·Lѵ¹à!¿Y€J§T ¨v¤¢Ð�ÚæãÌ…pà6 @Wó÷©"l÷T÷ ûÑnìµ�'Ô{ëô<ÂkÞ}OÝýìöóÓ¬__gf¡_ùýÕ 6O¢�µéæ‚ {KHñª*ût“ÛB¶ «V=´F;ª_ЭE­Ô˜ÎÎÎPæ½ ižÚÔIÍ^)H‰Ø*µÖZ{-Ûõ{ŒOãñ¯–%žËœÐ1×™,È‚1!Çû/âW¦ €äBŠPíЕ:·Ûß_R¦OSk¥é�f_òûô±{¯â©=B‰?4g6A $€Â0àâ¬ÞZ®°r—Ï¿ý‘åIÔT<�ë½Ñ/ZEktB­½E\XtùyaI‹¨�Ï,ùIær�IQjxeæ=ü§ y“̩ݛj‹+â·ÄK¨iÖÁgÖ®On3A#ï(<Øs˜ÌÇ3ÛÔÂÉuwŽ5]x˜w¦ŠN]Èl³¶WDh”…®íkLp¼L‹Š¢â�“³)Ò bè}8t׿ˈE^ô×ÿTk¹—Ró=wón …keË“Ë~À¨˜©1«U›Îÿ^GƒÉºÂÐu=Ý«Ngw܄ޒòb#̨³µù» ñì#L8óe­O†u´ô¿HÌôÇ|çšë1?KVÓAtÀ×E_L¦ßô{Š´ÊÖè¥Rnøíà*§�?@aT�onX–ÿ<ã6ƒ!š…D™ZÞÆÕþ4˜Ë`ìË^~ÄÙÊÎD…ò vÍ™ã5S\�ñ�ÐG­WóªMVØœ“Öj,æMù~�ŽlI¼ûI?ȯƼ3˜ë½q½Mxjý_âçµIÆ~ä>»8'>osK2Ø£èrž:ü7€95`Kº|"½BWV””!¿]ãQ„p2³é¥”Ù~Úá¹tMçã5Ù.S˳ƉœÎ=Á¿°Å&ÝAyË™w b×t>èýÚóf¯ ·ZßÞ} dç<:{Ó“Œ�ûjA[-þJI®ƒÅcúÇóçÇ^LOŽisƯ8ìÑê2žH£¢¯©Ê¿«õ™´=2½½9 ZÛy!Üÿ-øži;{÷ÃÓMçŒÐ™‡"& ú—uE®ÎÙïá³Ìÿº…¼×räJ£xY´A<·8»ØŽéFemˆ;„s?ÇÿÊ$»m×1µ7—D`/×)>w;`w h‡Ö«eTeœ› i]·�õiåCÚø0þ‡ ñšß«Fÿ¬ ³Õbã w=OÖ<ý£Z¡³`�'Þ‡kÁOj.hŽ´R-W¬�ôv@l_*J1?+=ÿÃ5쯬OâQ+”2Àtð%�éõj¸){œ‚Ù#húŸþšˆ:à™Ç*ú\@§Šý«§lƒƒ p#ÿ—Û7ÿŸpV9‡ÿ{÷ûÏÑÑ7࡚ü¼íÐõy7@÷Näñ]ðϹ6œPð£=¼ºÁ­°äë£ÛT "Q€GºÏ €©†­B€Эž�™K<µðuF�µ6]/jw¥~ÑÔJ²¹àP ¨Žƒ8Ó£P»ÆÑT9Z*µ‹¤B©'Ï¡p{t«J…êÔ¼÷±W*¤¼Ò4ÞÞ3BO.DÏNï¥ñ¢{ÍÚQ8ÔšÚJFJWØ‹“4xÅT³ÒµòØ~«Üã×c<¯ãïÛ��}™ùtYbÓt~'þï¥û–�eÿ�•T’ÚD…>hØÛ‘ �®àPC÷£¦R8ùŠK(¥Â’ñ׳iø¤L¨]8]ﬦ\0©žûáðfôs‚[œ� ÝZ´.Æ]ûª�¿øLšŠw‘ŸÑì¹2þøÍÿóéË:&Ãħ.“Ã+¥¿ïAæxùïþ»`V*ú#ËÛD¦èÆ”ð‰uÿåða/S×hþß�³,–To¥YÄ0þ ûàïl)×Fê#ó�»4$0áFÇç"nqµô¡L¶z¬Å ì|º×N=Lh† «_ž¢ý® µ½cŸ�«Ï”ÛØäw\EÃã!¥¸”[4j¹'hßï2¡m1ó¿eÑžgX À@3ùgcüúcõºh¯õ„p&"3† A“I[zѾ(뮲ʰ˜– 7ݽT½ðW6³7Ë>§«†‘–æ©ý3Åýxè,u¶ÎñÇØëV}âÞSÌoȶl× M-�ÏϹZ²až4ò¼Ÿ³i5x;´ p†À4\Aê¶ v“ LwÌm4“zT]9ºÓü™õÔqoƒŒÆæé¨Y#Þ3Y¬êò\+xób¹ÿGëúÞ»§÷ z¸ê‘=Ùºþ£“‰ˆ‚mèx§Øi{¥C­ÚËï§Vm‚Íq{ÏÚÙ墹è¦7æÇôð@öV §w{Øß)pQë‘y­“l÷ÙCqí>�c}çerîÚX!jj{]QoñÃË«Œ»DàxKè›àéÕm'žFµä Êy¦Õ÷>«Æ�ß.ø)ýzo£o4Üg¥¾Y¦�9 ÞÇ ¨ôçÜHtsu×¢K”‰Ž,Uïøp"%ÞOõÝ ü®ß5B›´ZpT½r"exÑ…RïkgÄ7«âäëIÃM³R8΢±ìj7ØÈFÒè&|S¯³ß`é ·±Û(V ·“±YüÂøÒ¯{|6DkðUV®®5,Ëu?ª³Œµn=¡Rr‰(Å/V�¥ *;Ñ®ãºkÑe™lUì_%\¥ÝIùèÕ›õ"8¯îjÃ÷ï½»@òÀwŠT‹Yeÿ|²£ÏXõÒ¹"3=¨Ìêè²üB¥ÃÔCnªJ},©KÙj%íiY{aTpøíÉDZGFç­&žäÍá]*c+¶Ìà?þâó8ý]áí�î+øúž„~E9Õ9ö„èÕKreˆˆfŒ¹Öœ1Áñ×Ðïõ‘¶éÑPv;.Wo&X™Uǘ6®ŸïŒ>÷Õk“�ýöÝçRl2;{‰ç’ nk;Hÿ•ËÒ>Èñ+öϕíŠnoÛŠUIÊÝËÎåô½Ô`D3ç…Ö¾0c\ò1Ÿõ%+¢O³ôÛÆœ•9M£_dmQ.wƒq"Ƥnóü–îúX;5.J”¡ ™ªõQbl0\6·váuü­ÐCÉ£øvŒûâþ¶—ÙXâÛÐù¢ÑÅ‚ ܰþ‡›­#4‘@Z•:\´¾ÊˆcEØO’£à5 R{Úìá?¬¿|.è[`iEçælÂêw¼û3×aš½êü'pS�·›µ>?@Ùlÿþï÷IÂ÷ø†SÄÓ‰%0<¿†Z] ô€zúlpÅšŒï×·_ÿ÷u½€zo¸Ò;(?¨g�@½ý) ¹|FÄbãØøù-SÄÓóÜ“ 4@¬_omA츙~T€†g‡"þÏJ­@qx4ô??Tðð|•«Kè¨t ¬ÝÆTÏ{†lñÃsúºi(áP+EŽ/Ô€—ßnû¾]­Át7šd!½?êî¨%gAY;™Ï‰z2ƒÖ£[ù™{×qëxðR�ÚÇÄa5¯”Chv¸EÒtÈÊþ5ãåqPp ö"'3ÀY;‚>�ZÀ•”Œ‡% ”p‚½òàÌ=éRs‚¦Ö µuÖ^  : ¿… z8°ÔÒcÎ! ©8ø??w½ëãñ’ñÁ#Ýù9§q²îU!%+Ñs”íÖå¿Ìž±F³xt?ûÁ5Ú ½S;»úÐ^nßÚÓ�ÔÂ�J«Œ]HöÓ܉WϬª›õ ’¶†ò»Â*p»3›étr$Yc];ãÒ%I8/·’Ä™ÄÒöÓ©‘=L.*,4^QüDZ_ãõʯý© ¾=¥}/CR�½ûøÞñ‚•³Zak\aXCþ3,Ïy¥V£k_ðàƒÊ£=i³\¸ó&<Ø×åî*CŒlx�¹ Jë¬ÃÙ¶S×ÅäÕ_"GÂ+ìi1ƒ«=ý!f“.Ì ÅK±qæQÍE÷næ´'Ö¡rY<Ét½hÜâö/Soóî;B¯×Äïhá2¶ï•ñ9+š¸__%rN�klƧ*”ÕOPÙÉ*ÿ¼Ì‘Œ €mU‡ÃqP:øl²üõ€§Ç(2pHÊðêd­OļsÛKî£6‘˜mO85þ²þ‰Ë=úÔ½ú_7\ž„ü[/ºÊæ6W‹ü»º¢mc¤ý*9›Ó‹ÿ‰!ƒU“$ø$g2B¥?¤Þ ÞZY…Mf§ž˶޷ç5W®‡­ WöîµËÅJ%³Ü×ñõäa™ç‰}µ1þn´µjœuʶ@$ñ¹üïܹbѺ“ž_â,תĺ~e§ßp}º%Ä–éVƔɿÙ= ˆºdòe:4¹¤àçKz{â.ÀÆ�pTOj u®h¤´t ßð…<7Ë7dþûØÙû�{wÇŸÅÃCÎM(g&Ì ºçzôsmOØË:¢O7—³ÚSð7ó.Î’É?Wþ,}/Ýs´jr>­VÇ·^ {åºRx2# ÐÄ=´ÙZŒbö-û]“ñÍek®¸0÷Ìý1zèíT.Øõ¹ÿt=n®ÃS»­ÔX?kÒ>‰N.3_4ó©wÛó#—X[%ÖŠˆf…qqc5ï;ZÏK?ÂûuÕþZwãW° €îÜ¢5#Þ³ �]‘.pb‰[ÁOggS@ì ‚R:¦ÍÍÿÿÿÿ”ÿÿÿÿ€ÿÿÿÿzÿÿÿÿ‡Þ‡›íã^ "EJ®Y?)Ÿ@¹IÃ|M€–øÛ4¶§ÿ˱”·�¡Ka¹诀þ›…›F6ûøÐj\ØÖé/Ÿk ¶úú#YÞ@ƒ©“Yz3‘ ÷Düý[nÐÅð&ÿüþ÷'{×Üà†úÈ ä;ý¿‰h¶¸ e9¨yc0ñL�Ö ¢sÿ–MÀA*yÐx  õóã Wü” >³V* Q<…R·hè¦ßMá(M×ý}:PŸªÀÔi”=º»•JCåkU’Õ£©µÂ^�‡bNZ8ˆ¬•Á ”ìê5oã› ªBPÉ£ωÙÞßG_¶–û3?äð”ŽâZ„DA3­Ò8œd§:™©Ïëz�˜‘'GÖÅç‡;q¨úx­þž~‰5Óq€ §HôÔ…¨©IÔˆð¿C7[ËçÌÖ+XÆù!Y|¹„h³éÚG 5›†¯P(-SÔG¢Æ^H·È8еHÑì Vjä^»Èà+ R‹:A…Z ºúLjäÞ7Ó ø `(Iv „ñþ(jð4Åï�cVÀíà7žªƒ#–i�6ã;àùf�ý=PÑxÝŸpÛR[;�€7Ü>{Œlr·¿ö–qkìf*èsmû:=aqÔêjZµq—Å)ýé'ý‰ÐŠ&‰ç{5»M¶^ ÒÖË�$HÍ_°Âä¼;Þ“üï2qò|8V�åÃÕå{Æí?Aù7|H$FB·®Um–=§´ý5O©ƒ�—�Ûzñ0*#‹–×6°IÜÓ‡Io rTãнóÞ$6r\÷Á5öû§\xŽH ¦ñ)ž!U6 ¢—§­\÷¯…aœ–Ͱ¿=KÞ.>¢yøfŸlBó«WÙdõ? #øfÿ7Ϥe¬�ˆTT¢ÿRuÅeUû¯Ì¾ÚᶬÈ>ã­Ÿ™�›¥~.Õ&+V#(û:·z€.ª ª–k”Ù"ußÞnbxÕuH/s®ìR�³[t6U£¸ãÕ–Ñ#õ•¾O¶o¯Hä>6ÝûËçÞ³1–“Ç1ˆË�Æ5£l’{›ÀnÇ#š:le}p¢RVx°!†SÃ-›¯ÜEœ±ÒŠ«ÒåüÆ^è™×Ë�§”·&ÆêíFã™×_»dî6Þ¼d™(,…™sýþ¨jYÞvW|E«¿ÆÇí…�ÏkGô•Q ס©÷àÐ-ô}IN¦Í¼>ºMÿ}mûû;þË« »½-f;…wFKá\ßðþzNÑÜŠñ+Þð³¦;9"k»Û;”ªT´óÇ~¢WžÎ§Þœÿ“ïÿöθëìßð*?çç<¼jud\»öâýQÅÌØZ˜ósŒF܆Å/”¢éåö¿çSåÍ/Gø¨fQ{�Ej±´ÉÔTÇŒ¾(²‡Ì¿¦[§žaLç8Ö7Û¬î0“ÔOùµ¤ëLÃåh^õùf‚%Ä‘}î]Õùä´D»VnŸ`Úe0çÇéþ³;†È…Ó$I¼I\šwn\k^ô[órøít¤åi,ZÏMyü¡To“d®¾‡[í?É4Ñd¤M¬´áDð;½MÆÓºÂ€ù#ˆüSowóÏÿ*íÎ[F›U®›§¦ÙâËßž:g×@;ÿn;{¯ãþ OºiÿþôTÛðõ‰ùÐüÕ¨´ lûýҶQ…òñ§w À j¹g0åoñÛÙ ð`†°ñ@…®µx~$wLœg õ¢²ý—üÊVj¯ÀwÇgOà€ Ü¿NBQpèv€º@ý93Ó�fÊï_-_Ä<Ö覯@æ (ºâÐ0óEíí¬]TàP*â µv§VZv¨ð½Á‰ï;UtY ÒÐI%Ê쟩éÖ:t¡:ó»MËx�§†B¼Ö‡Ïxn'ª£Ý øÉäñ°L0î$¼úÜŽD.oÉꎗÜ) Íùœ”�ï§šÇ9s¼fÏ|´n'[¸Å±}˜¬âø<üQ×G ªÅ ÐQQ�MpÝû)ä2£ÏN*÷ÊO©òCtÿ·¦³gúñù¹ÿ¢?TÛq@ ¨óËALEd¡ÕiGQhv¡5~¯YŸ�C·ºÏï�<Ùhgöêü äI3=Ò�t�¤Ÿ >âkÁ) à*ºv°wý¦çØM¡ÛÛ‹~xûiŒ†Ga7P&å®ó“ÃC"¹<÷³½‚’Ñaéô›ŠvtGôŒ"Q¾·=�;ÎG¦O×l>ž9ñ»b='.ûOi²ú6Kz»}w£`œªWײW›Å¶g©íÔ#í¥~ý4vgk¬Z‡U"âpÍu?•¹ñÂ&|öv _3¡Úñîê”Æ†Ykß48Þ|Bï9(’¾Å ¾®ŠùL£„^¸vÌâ°µ) â¯Tx-qì숰„#öZïkhš"ðûØHè|;óIúKbŽŠôðq_V[éX8ÏDJb“he¡�¹åy9”£L$ú-]((“Ö�g¶F\dÊc‘mc×å�·Y—Åæ„ë´ÊË;„0‡7V«ü{S¬<)“ëïÜÕ-hšÙi)Ÿ£®÷Bõõ¾îÔ™móƱ&r†st¯÷'ŸÜá7ÍÓuZÖ²~‹Äñ­¾�÷ãÃd·²dÇ;&å%B?ÊÿžãFV.x8[“ìbޤš(ÇO'묾ø‰M:Ÿ{Å%?øÄ>ƒ�Ë“S³=��ú3BV¤•ÃrL·ª¨zdÎbÉù÷€­O›œ[®=µ$£øJ$¾Ò;Î+{xöƒ¨¡²as7Ïאּ¿ÃŽ ­E÷Ô{hÝÊØ!óÝýÅ™Ûk=ÿË•ÿ^¾_®nà^îö ûîhlõÇT•93×I­+�·#s<µ j¹9ˆŠ¾dyÛ“Ì`ri;“r®·N•UËûíµ�´è¯.Îò3óÐùC#ñÉÒX·axôá¦èzÆ: µÎ×’³ ’ûuŒ÷9ëw«ûöÑφÞ3ÕšT„±ìÔ§íö–Æ÷ù_”F�:Š,* «¬÷1½á#�yý�¡”Û28çr,i»}wƒ"Ä¿²ž½ž$×kQRåZcsáC^‡ë™c:óMôpÕ¦xöú‡Vò�9è* ÐùŸËžpš`’¹èB³ÑGhíæ|©@hÖ R#©@qèC;œT¨µ�¾ôÆ* Ø‰—�Îý¢�Fh€§ ¢ë TŠJm bv{ a2÷ÖÜrÛ戸ÿ†Ù®)äÎXò¹iê–Ã]‘󈪠óQ@A„a>¼ovn›?ªðÝþJ€"ñWáï¹Ø¸müÅ€’!7lx "µl'îô·ß€¼ýý¶fÉ¢”—X[Ù#FlF §qÑÃ)‚>ëÃê¡'޹µ…-aè)óxÄÕÞÓohTÔwaiè÷=l²’´ë’ÝÛ�êGDa7îÁió!¼¦ÿû Ãbp9;¬2èãçR› ‹V`Öà¿Ë_þ38Ì6f¼~õ|ö°Âõ·vvhà*²ürÎg™¤ËuiP¿ö;gìŒÕòàç0i‘×Úó«^²‰eëˆøÿVd^´séºAƒÕ3ÞÍÉåõN“974ã]øMFj»žâ™ù›öÙÁuæ¯qW•© ï;‹}gñ¯ÊW¥ë~É�ÉÿžÞQi·}�#ãšäÙ_'úè‡]$:i?Š+Žë—ïû$ž¦•z—ï«BœÓZ°ÊäX…OM�­¡nÿ”Ûéw¡=Ïyµ¯kÞלﶼYž¬âižˆ>ô¾ü#k‹ßï.И¨}+&©×o•›˜#C›âNñÏj³0&ï>Dí;©³ßÚ<¿*3*¡þ Wt�ÁGßF‹=*·¬šTtýøv×®¦«ÝÑZþ]7ºÅÇÈ»{]èn•ýùÂS,ÎûüÓ¹ºFãJÐ[³ŽÉk1Ö•êÆø*ϯ«ïéʪ1Ü€/›R/·ê)Ê¥Ôoñº<)xï$Å‹_¾~¬Õnìà˜Åv1¯ùÕ\=_9&¨`©¶¼é— ‡öÑûiæzlõc;æv>œÝsÝ<Ǥ�sš&Þ€ˆµIa„²¿ï·BÚ°æÈ¶vKÉ—ûð ÍÅrû~"z¬ ž‡[2ÿé ‚Ì[.©¿šæ�šŽs]) ® ŸŠ½�o½�ý¨`˜ $}ð®~Õpá½ ¹�Þ?Ÿ>@à‘?´¾vP·å~?Øü© ˜÷Xù7Ô½Žá7ýÅû¿rÂÔaâA ?æ0Ô¦ˆøô¯àxÞ£ü¾Ýªÿ€!¿ÎµŠüC\ìįÞ„Ê6®äSw�`ß¡B èôP¹ µÖ hMIòZ ¡¨‡ 4µîà ù;�åÞ´ÒÖ§:h.ãTåìZ‚KBz=¯K2£Å'ò¯h¥VjHôSP«Ð Ð³j× dÖJuÎDDÕA*¢rõE¬ì‡B>ä³è×){–Hf§IÚq‚–Œº¬dŠóS¥B%Zj‘L™kÎÙNÖ„^‘Y�û)ÇxOô)8ѪTÂ!¦×t˜U+RkT˜ªPT>E;¤ÐvD¤Ej±O5r&C7êçý¤#ÑmîÛw«n,]Ï<�s]ÚÏéK�ßFí*ÿdˆ˜ü2ÃP›>ØJ¨¿\=¼�íø/ø†o4ÅU:»÷Ãà7Óã|nÆ6î‰Ï­�ñÍY­u¨jq3œ‡nëw¯·?+Œx9¨<}-w?P·ž½¦£ d~ëP…ŽsvNç†Òf¼}Hn=ºó;VŸ 1ʤ­è0 �x™æ¼‡÷z–IÒcŸË÷ÙL³FÖ™ðô˜·ºƒ¼igEàŸØ‡­'9º«7LV[>¤ÓR�“ ‹^{� †u ›D¤¯®–…bʉÏýºÆ8þ_ŠS²Ñ'þ#ƒª'÷K ©jXþODÅWU£ú7pVÿûa,oWï�—¿Ô׿[ÑÉŸo%—¾%‰7Äzá‘¥¶L\ë„�%ÍŠ‚© cÚà�MNkh.4î·ïÅ÷ÀÜúš¬9r«·âE¯šÞ~äI'HûâÆ,x%ufÄŽl‰á|›Î¦÷Û” šE˜QË0ø5F=h�û›ÉŒÊúºôÐQ�Wãl]Ï8J‡w“ž´þŒ 9aÛ˜UÝû;ÍaÆùU³ÖžÆ¯]Š!&8¯t…)f˜4MR€Õf«W¤Á-¶.4júö¯vNæØïþx=`¾Ú„okð�&t\ß•œ-éUg·;Úœ»ý¦»ï$=ÿØ “3)Æ  }"m÷�Ä‹¿Eyk›’^ÿlÛ †¸O)óO˜ñÿvžYcÚnOA[Ûv¦B/ŽÎ̓“ä{FÎ6šÖ1LvœÄËëiXÊ¨Ê „Èð<›˜ÓøßX*ù{%džÈw´âv= þž#Ú3¡ìM&mê³jó,Aª±(YU¿ªäÛÉN‡û6Iy¶ýü™Œ]�·}™Ä�8BÖwh-bN»aÊó,�"‚o�õyÞ.äKñ¼úĆz\¶¯ELÛ\Ñö¦S“÷óeÊJƒ±jòhþôÑЯÒ>/V¢*±µAEŒ‹Ô,�w6>}›ÍûßZ_’éšÒfñÖ,þ¹ 's“ócÉ+#½ùžÕƒw@‰4qIOggS@ì ‚RgvÃÿÿÿÿ‚ÿÿÿÿqÿÿÿÿxÿÿÿÿaÞ‡[”Fh eWÑŸx[`£â,¸�{Øçé÷å›Kttƒåz×±o¯yÿßÛR¿À—ŹYƒ½:í-/�ÞRÿ“dÃV³äÔ†ÌïfŸ�C"oøxaÖ€{¿„êδ,øüÝé¯]cí�“@|µ �†~^«EíG�õ}¢>ü)”zm Ž~ii _ê E¡ •‡þZ>œ.**€3{–Iº{ªJäß¿ˆÇ‰1³+q&84Thgb0¾fö0tÝ]=S‡åçëá8Ëðõª8¢œ@Eºjsátm �#tÇ|›€ÇST$ÿ®ˆƒt>W�÷g�òûت¡&tžÕ9“J}š½ÒP�ª38ÅN'Í‚ÎJUØç1™ïéîJµç|l‡St¯�°k’­U„JN§ÎE¨:KîrטÓM_ÙYõiì‡Ã*Š9pð�íQèí�7G7™pi ö>{ƒ†¬Dm*™/Á *dæèQ#¨P³4b¢;ï­[pçIšê¨S0#ôž5•v´¨ 0â�Úʱ÷öŸÑ™Y+JÕW‹\MµÀOíóóS@ )ð·”„Ød¹w§ú»k’|0ýlÛlÎ˃´ä3b¢mb4"4QˆÙ¦–/²?HvôùÂ’Ü*ðÇÌL,‹`jò?û“vÅ Ûe)ó#Ñ’}¯Õ'ïš�ï]iiî;žXc.§ÐmõÝ�@|¬ùel‡õŸ†ƒôBíYì·1r7.ÿˆM#åßxêºsj|`2AOF¾[L¸Ò�'ÇcÜÞw™Ð¯‡ëÀo#m”ØÇY\Z èÞúˆtºú­¢¡â­? à]m$Úæ¯|Ž9“jlWDüBÌå–~äÔÖÇܾŸtûm0¾õÏq¿[ÓÏÂ7óhÄ’-fëˆg¼¨¢}Wn[qÉ€YÑï{71vØI”6aˆ}ÿÈŒý’NÊBÞdhÑÙÈêI>çÐù·Ú—ôØEÛ#õµv [*µ¹° ß¡šó©!ê+òy÷]^+¨K߀ÜhS”>°1Öë‰ OÐu;lo‹˜ �: ó#&†­mWjþu¿×uäþ“‹6Og-«(Ë�{û²Òãwñ‚¥ÿÚªNtõgäKkX#XøÝHRòçlüUŽ•æ·½l½Eî?ñ[ë™ÑüÝw¾µ‚ÖžõA·|ý4àlâö¤f7ºeíºæÆˆNÆ­9¯èô‚õ—Êà"0™¾Ü6ÿæ³»û�§?Ï�™LÚMpøÀãvÅkY/g?/Ö?Å¿³“H{Npµdîh¥h~-ÍË$ì5‡Ûý{ë‹1}o·"'^�J7Ó Rå[ÈBÏC§qÏ•ã—õˆ»Îpl¼–ßsÿ]±|ü[ëø5n÷¾*ÁÑžÌDR«³—ì͵Ɋ3þ¯Ê3 Ç?µ¤½w¾|e­.txÆK%s7¹ÄýØïšLöÛiáÀ{y\´ÞÖ�?ß‚�ÔqžåEÿ¼ÀÜäÀõ{@clô—ê.,£ºá ¶Að�E®L®òaÔÞ‡ÛƒƒRÚp†Û|òh=‚añ$(¨<_‡òËù0ÉðI¼¬×� «oþñÉ\_€n¥áfxÝâXŸú=˜ÈaÇÿRƹŸ¡?Ë}¦vÁÇã+Wsý` Ö€‚}ÿñÿ+tåŠÍ,c3µß{þÇ»ý 6aäç1t€ }êñ¦~⯥ê¦P'ð÷8§VÀaõ¦¢L#¢„‡ÝY† qÌߣ`» A ÿÞ>…Ç‘÷7P$ÖÚ@í,´+5@»Ñªô\�T˜Æ³žs r"uýDE…X>Žrï#·èµò4q‡ƒhTkí9 ÍP–ù�øÝ{ÓŒyttw£GÑ÷9ͼ~Å�ŸQçÝKJG-*‡�ÖãÃì’Õ÷¿gÿ~ŸRèG†*Yƒ˜£C¨…ThQe!²AŠCö”YŠë™OÔ¤ µN!�ó´„ã(ÍJ÷©JÏTÒ ’öˆ=Ç-š™ÚÏähèORæ7‹+§]@D#KsÌGfèüæLRˆäÌÀèŸn‹\ûu?‹ëÚcçš"’Žç5†NÇ£™@‹x>U2äyi�¿­Ä±\_#8CÐaE§Ý¶§ºŸC*‡dߘM7ÕÎ5‰RPÔ¯Yºw¹¤þÝå“—yNVG¸.q‡Kª¶D-!5‰\°b :fêpSüÅ©{?åÿ/ôR€ñ~|Ç$ÈúûUÁW/Ü£¾‡>Sç¥=óI“5÷7ËêEÚ>CÕ×®Ñç?‘šoý5gøép'»RÝç? Ë?sVEÝ=÷œõ9L_áã»ëÞÔ}4ొSUW�åp%I1¦ê(âÆcdGÒ ºõ ¦�ÉŒKŸ† ÆÑÛLÈ[´k¡ Ó8Þ¯ ýv³e³õºO�¦ÙÈ[ÁÇ›*-)Üs÷=_{Õ^ëg:Ìÿýi)¤-0sMv§¾Ò°¢PWt¹dþÅ=í¢eóLZ|”w_f÷{«”é±Ú9„“íàö;ÔªÔ ){s垸Õ?é!׊|›H®£ÏUx룽¹§úeîî×°ÈR×€xoàÿùö�©œúlÛlzŒ# »½v žö‹›™?ÆOT:Á¡G®’Z#ˆæÿ=ñíBI 1¯£¾ùoçr.ÚSÔÆFóÞ¡azÅ›€Ìúp zg¼µØ{ËŸi2û?ÓÉlîv÷FÞ5íñåÉu�TºªËõƒÂÛâ×X‘¥…3áöu{™ s•�tì;û~Þþ-ëÕž•,?|2äê.÷‡ßIN´¿¬ÉÜWiƒð.D°¥tœÖœ|L2–æFéóžU`zÌÐg>µÛž³Ñ8þ+©ß×qqúOeL†M±^“þøŸÙÁk‡ìh½ïÛ~§¿}¿®ûÇÎû8« ëëÂ81Qb4$T “jiO0•W-½_‰@gSL/+Œ¶wqE7v˜èX‹Ô\T€~‡3ÿLx ‰h�Äœá´ý?iZ c‘ríÀ´Þž¹Žÿ:}DvÀ³<îÚÀ·Æææì^žu‘…ouè¯GMí~:S<üÁ%G2s‚mÿíl*€q€ül€´-A=ýÃmüÜ!o7íú"`ÇRC}Æ3çKÔŸö pBñí,˜ÇѬ—€{ýºóì?±18|tµ–„€ú‡t`Z§Iþé~'äOi-@íX�€Õô†%³*Ý 5r‘Ë!9­5³^LÝâ¼v®æl�Háøô‡#‘@Ïš™ ý;)̾ÌÁŸ•‰%Ô¡�|#‰þ~t:�­T!Ãa9’ ŽÆÜ44SKìÉáïTšøû:ÕñÖÉÎZŠGŒÖá÷ߨM�¾Ñez ·79ùõ³?2C-ñ¸ä �Lˆ8Tu'ÛÈßr5æ±g_Éo÷¿+‹K¸ö,öù#ä±ÑcdJÊŸì™�tg_¢¯bCÌ]ô©'ˆˆÐD98ð8 ·þ^1MΡ`w�…Œ~ðûøÇüòOæFjÉz’µ„¦Hàze†K�n?©©ÜVZzvªU¤d(€ %„õOü}ó¨ CÈÂ&u5úRoD@6~%(Fzu8h~Ü Ÿ£LíB1º>r^ý2¥ <ÃÍ1œ”ÇÇ|[ÔØüö`›Xƒæíq¾—�®Öõºdõû½²ºvâ5Ï¿²°ê/uÍ'Ó\`˜jêÇ®©ãHc‘þÖˆ¶”3BPot;Ö‡{ÈáŒ:źÆeˆúÿÏÒ{äÇ+Þø5Œöò£-ÒbµãŒkê—­– 7I@×u[KÎE=à@ز³›-ñ|ñ3ƒÍÖù­ˆZu51RÃi ‰îüYݵîK ^€#BZ³ä#·Gc‰ÖŒ­A~Èi¥[ T¯Vn…—°.¨¨öLHVÿÚæz>*�3–N§½kF»Túú¦Y—]üœÏ“QkÒR5$}jÂzúf¹ùMÏkb»Åi}¤œöy¶ýd­ç#Öˆ‰"•(Úl\ICÊ¿wõý_“[“!#¤/æ÷/OXU]Ö`±|±­Ç(P‚4°9“Q�^‡ëá?Cˆ‰I»~óà…@k’É'(*»¯[³ßgõ—Ëx�LÀsúÀ×;€óNl¾ê­vpÿÐÖ^ž™ì_6&Ø"c0¥º 8ÔpXoî?;%À=òý°&[ÈJ À�åÿö/Àxè Ÿ#¿,bJ6qù;º+GCþ ~¿ÛH÷ãñHžl<¯JÀšv¦bt¼orZ�³bnþqfûŸ µpd(]�˜n–€$þOžµÖÊLW`Zó9/Û_£Ãtýû4xt7‘“÷¡8wQ© 4@S{éÕKrÅ'Ç¿ü=Ê—=‚û  �'²hR�@rÎ"´þ�ZçMÁ�^I'(�q3éÈgÔGÃr¥æa‰“$Œ÷ƒ˜ ²h"8*GE ‚Ê—èô×±¾ïYúåîÁêo¹ú÷(G#ë§.·öûY w 1�E*1EˆºÚóç …:8'0_÷\¤.|ÄlÀ"H)±_OcKc†›$ôA欵ŽÕ¼IÉûk,Ì^:ÂFì½:û^æÄèïæ�¿r¹å`óæÞoð{f{MP,…¼‘túMàO¿DE¡7ö:T;�/Ö¹A弬‡›œ2<—ôæ ñv.Éö–o}†¬¤N¿·/y 'ޝGSïdó–Ÿ W$²|ŠÒWõLTÏéãó§ô¢)ûä’¼&ȵNÉÞª½¿ûºïzˆ~·¤ðË¿p†ÐÊÇvqï„ ~À½®X�æž²7) ½U/;ßþäWo”Ìj<ôý¥²Vyj»ö�IZªâéY¾ê q×hØ!ª§ 8÷î¨xùÆ·/.*&_©¾ñ³_fª~óºZÿ¢oî$&‹zç-ÿ³O>sQ;Å)ð2v¢ùê ìoç«•[ᗥ߻Œ‡ßK·¨Üß¼wÝ�ß|[%ÛÃÏnM¾ï(­ »Û½ÄŸÏ•²ù{ÅOyß` U*ßb)ûÁäÉ95½eáßìx˜ñç„âðï³f"V¢°Ÿˆ.ŠºY¡­WùëlˆEÓP·b¼ŸµfŸrø“4$«¢Œ‹úsŽ®×¢˜£ÌhäB¬ .uQdûj½o-€7Xñ·ß>šõʰPÕl>¹å+¿ª>˜OggS@'ì ‚R2öcÿÿÿÿ`ÿÿÿÿgÿÿÿÿvÿÿÿÿ_~‡ÛÿAh�qhÃEû¿xššH± \7 ~Þˆ–¿çÍô”( L×y‡¾ùÇÿþ-ù�çÙß p3?�SÓóOϰY—îð– C«Ã¶ÆkE¶P˜!Þx£½ ‰{7¦üñÿ} nùÀÂKJU¶_ïWC[<©›Þ¬Pžd�lâýýh ê_�ŸÃchˆ åëÜÔ€?Ô±ÏjkÀÁpœß) Ø«*'ª——�|‡õë½EB�„ˆ•’û| R—ÎÔ@¥»O¦Î¨óiºžM%juöçíFÝy¼ŽK¶ü`)¿úÛWƲŒd†"q\áT.œSt ‹0qTd™ÙïHÌì`žûÇ阷øý}½ûéŠhÀNögÏÏMm9 }½_yÃóûŸðM…†N€Ã¹€&œ, šfú1{„Fuÿ‘©÷å�E 5Ï¥zçNDÈÎtÂ8@FEÏ�T€H'#BÞ�E¯qïkj9ìWÔ)Õd?§·KCóß“‰*f‘2Ïí¬eI}T(@¸&*Ì$órï"ÙñZêˆ�h”ÈL©žþÕNIüÂ@”Þ¡£ÿ“¿)ï);ÔH©»†4•›> àx~HÍß¾¾|=¡-™à4Ûÿ«^ÓæïÈTu\·(>�½7¸£€¿ëq4¿PŒ¶ñi\ ]sÞácQ›™.¶y½‹¼ëª§o”Æù*(L!ÖŸì]àŒ’Úr {ùùy µT=ŽOëu·×»™,v6zwEµ‡Ë¦U]½˜µ¯-)ªÜ.b nò¤šø�#­ië`öϺŸ¤ˆ‹¸äÎAã³ï&ÆJÛÀÁœ2*ñ»8p“®Ç⪒$BjN¯h3­©Õp�¦æC5dïÒzêCD#äÓM#—‹vKÓ-À £eªéãþeê?”ûEþÜÖt 3�ms2½é 5»×TülÌt;óÏ~R°/Á©=ÞLuhÿ´™ºšwŒÜw’LuyÛÓ›“?ÊsJƒ kœö™ð¾Z ÏdÆï *%‘×'zVý{õ$ÜÖo5¼ùBñõ°Íû�-ÙâÞßW´��.x?üiöVÒìÆtÛjdýÆ#ëq³_ê?«{}­Ã=#äHÓÃ÷OðlelßZ«-°ñ[‚&AÍ6%ÿóaI˜,EõræÍòukßÚÎ<çÙë.\ÃîF]Î?ÃS,|³[¢«Ýü3Ù7öo¸ÝÿäßgC*‹–­»ßƾ"wnÇš¬@îçbòž^O=CÙíÎi¸µ=&éq­ºWôÀ¹òŒ¦ó¦wOGý®X9Œ¹e�7å�sº&8^ß-o‘Yýšâ�ߺâ{y‰•cÆ:½$ŽÝÓ�ɦpо�žÿ´ì«pNð+” 8rJäØYë­×ïw\ï�ç{äÕ¼ÉWñ#iíû˜°ÌŠåýÃ0v’޻ՓþÄë‹çß¼ =Jf9�MuNÍ…�?…ˆáKÀ„^‡›Ãã"�¥Frb& ÇÂÿIóB­,âzðÌŠõÎñXÜ3AFP0îÞwÀz7±s7¦«×@<™SÿëénZp¡ãIUÛÓFŠJÀêùäP¹Áf[PióÇkÁ5àqÚpÆð‹ÀPv$@üžòñ~’¾õœÚt…¢ü? âÔV€%Å/¯â™žuæ}ãà�¢aß ê¹>ö @HŽqáå’AÊp(È"Y3WDF1Ïí -Ìòâ8ÄÊY &2³Ð¢Èøb¿¥ˆS¤À¡äK—ÑËñáÒ¿Ç{“ ì m‚†ù�K:Ò}tñ!ùÙw=蔄EgôyÙÉ BÀ{­•NhJëã9ïM<µ?úóï9�Ó¸§ e®Ì-£´]ø�¹þÉÂ.2bºy�÷=ô4˜£ò�dëO†âqÅáfÿèÍÔc>G~þ`¿æ¯SÓK!�¡WNß¹�βyÕî;IÒùû7۳ʑ¶YAW“JA Û×ÙA *5¡Gò”�"[[:{Nô 9¶v7Ý™ÇP8¾›Í<w¼ƒSW´©­éS¢ªäÃÙS]�›Ôø!q��8íŽ�¬×VáHÁo4Ÿ)Gt$®Óq¯°x$–‡þD‚ï–øŸ`ÐUÚr�¡méR~¢�ØZg`\Tn¥Ã癋èÍ%SYÎY¯À|óc|6.êñÝHˆ»/ Ÿüè©Ôµ~E�]´ÞÀxè­ù7­´ï©tMYÛt£ÌèD©²X�|éËBP¤3’HCtÐ&uyæ¸Õøöþð¼çÿ.ï¨4«»jjÈûŸžgЮ$˵P¦‚žEŒÞ‹ ÷Ý�ã·Ud¿œûÛªe~޳\ Éθ)ûÁú7þÖéöq>�!ú…Θbéë±o¸7Ѳí\G’‡×m¼Í¯5jᯠ}™;y¡ÔÄNvë´ò—ÆûÓ6ë—×sØ›ï[5-ªÛ¯®·cŠnb©`b½£«&‘^zOæž]Â�³ë™µ›©ï²»]­Â{üX^�?{üS³ý6ò¸´Qj¾ã´á ŸÐ0Ó{Qoò¨;s‚Åš‡›ìƒ’�ŠÔÉÊN†ÿ;^�"IRÄ\³Ú¼/ùOͯêF• %y��ò;þù 8ÿBnzÁt²£|‹xQZû·hlØ:ûH¨3‚‚4ErÕË—Ö=€š»·peŠšë÷?ÖïÒÐ{ xI;ž§@ý '� óo Æ€6\à'� ðÎ1C‚Q@nßR0_G€ƒs¥â«öM×5'‰Ç«ª BqWAæ?@v9¼f‰“U œc £ßÝ5ç@ºél2&(*{Ög'$r=àhí¬8™Sõ¨5Þrâp� 5¨ÝN·­kÐ婉L¢µ¶ÒÚZç%Y÷C�íOTªVÑ‚¾š mŠPH*Éì¡§¦Î¨"1û�çÌŸ<¯z=|ÊêK}LÙñwÿNì4µVÐs4­P[pâO#*¤—Ð~<´Ÿ<@³Š£�‘á f  »§{äåÁã6æ~6?çuӉ؅Çl³Ý碠)Àé&a~QÃÌ9ÕŸv«PõóÓŠÎ%Aë�§ðÇHJ…p¶êf¿Ïãäz¹ù]�?ę̀æ8ßRªfyóŒuýˆœxµQb­�Øð!›Èq¢¢÷Y±Ÿ÷zÜY?ì"Ok§|c¿LÕÜh½°âxÕã'šYYÝø!²Ôq›�Ílº–¢ ³ÿ ×®ÙêêE9XÀ‚Ⱥ¡‰i¾:Ï#µÄ+Ïþ6—"'6’,ëû„d·,än$ëaCz·w“¥DW¦è‰³¢(Enƒ¡ä+CàÌÂ8ª�Éñ4ߌPз+ ëÿLj4ôþÞ «×-TÆ·å«,GÂWÏÕÁú?tÓû#$­£Ò{¼^@¸!#᎕—gô£Í·!86#7ØQ¾º1“Pš«½\oÆdÖ•5ž¨ ›ÀÅÏ®ý×tv à C[Õ¹RPVpä~{-½SêìÇ4º[’Õ>¿o/… Ô>•‘c4/ZãœÄÜû×FÉÅ£gÚ³ó…é@½˜Á&ÇžþÖë:�[un©­î†¿õ&»ã›ætÎ`Í7âgIÄV‚€3Id¶¡·A@fòŽ3û`¢Ì=WËøó~l;ñʲ¿mj—5šMá@×£çßÖÑ-é§ïšNWËR­¬**‘v¤’™…[" ³Ü»mÞ lz,3d¿~�hž~yƒ´6pÙO#!rW/ó.i›ÁPò_—å}&­D€3òPèÖ¾?”¯MäbõH’PìWŒgã�>øyÁnÔ—ãsCŽž)8ÁÙøÃYð[/ã{¦XëcípÐÚ•g³¸Ê"w7ÎÄ1™'Çš[Všá}~~ÈÕp«w§W�aõ(�ò÷Òm?÷{¹ú­Î§2O‹Ä:MŒˆ"âT�y]‡yjÝÙÿaÒøoƒŠï¯¯už?Õ 8£5ÙQ^ _ƒ°^®I×B»6º­€€åŠò^‡[¬Íƒˆ�VHÊ·ÿL×BS™ŸÆip¤¿ mýáü¡—ß³¡üÿã�`¬z÷@ùï$@ÆOnö¥ÕOì›5±W»�ßçauØêÇDÐÐ*dp·ÿv'q€ýè·àA? e®Çÿ^ÏvÎZ�  7ÜL mЯS0üŸàüð@‹â*`ŽçSW„(œgIQºPÄÝóp€ÇýÙ�@GÃ�ÉõªnǦ³ËSÔK|õ+ÉVòPmK,‘áNeÒBŠf>.·8ŠL‘ϯƇì‘q¹�ÿ"Ýó0�Uh„–¬ÄZ!“C¯DÔ‰ T‡=¦cFµgòÊzÒý•=wÑÝå.ò/¯’ýÔÃ<=È,´R Ì’óÇôûÒUÌèZ³Ï?ÜÓ¼znõIª 9E󵜑úŽÆÒzÇ¡!e¤Ñ#mHoéž]žý4ݼöUð¼4§ãÙ=éÊ!šh*ÜÆ^ü^Cs c‰ö —Gpôt ‘º/Ý}އàŽnÕÎ}b �¼#\I âlm–Ó·«ëzÀì‰�ô×¢8ò‚/ç?Þðè(œó‚zýdm$Sœám÷éÙõçynûzc�#Ó«ìå$�ZÓ&Ñ‘œŸÒ›ÅuY‰»N'¿ e­À=ôå#x‹'~ÂùßÊóÖ²ãÂéï$6.[a^âOæcÙ’’;û¯È”Š}y…<þ×?;m^ÎâU÷G�gq5xëV :ÂJ ÇðQw\¢ju3ý>缆ìy½œëré¿¶¬ªïåûm¼MØ~æ‚yïø\Æ6 sÕÕ�¸ªt ÎõE”aü;Îٜ؞Žê-�ø§ª:ò~íj]´¯‡—~Kf.úbóÛ±ÿû!’ózÏ‚Òëw�¾ªá—*6«¾žb«n— ¥”éê˱Nl™Ø/ùP¶x�éùji´�é»9~Éñ{_Ž h»TŠ|Þ) ß6qY6Uwž¿É^³Çÿvõi£Ï¿¨0>ܱs*Õ#æy¾kóܘC}VºôŽ.Èœ°ŠÆÆ¯rvƒn² · ,sÎùo±üh C•ýÝKÃÙfÌpá« V_"l§y¾€@ÎÖía­BíCÈøRŽêM7¯3l'¥Uúw/Pp×\X?eBWá_~Z¢-fw”;—TÑÔTІ­;�U‡®<þj-ÂyåØëT\A¶“WÂC¸ØTð–䉓A~×ujŒ5‘¦Æ§K“¸îr|í®8^«P,©íz;îþõ»Ü%•wÆÅÁ‹1"Æ#lïù×msâáõ²««�¿(Ž»§jÁUkIOggS@7ì ‚R…¹è²ÿÿÿÿUÿÿÿÿaÿÿÿÿOÿÿÿÿ<þ†«Öñ $aÐɤá¼õo¼ AkIÒæº½pSoÿÖœÎý‚–ÄÍù‰ÿ}ý˘¦þàuÁÍì”ÇÛZ8G..›êãKIÀ‡wÃ\€„pàüÕ_ùøˆ€Ö{踲³¶m0{5þ/‡"Ôæ!{?O… µÜwÖ?€^ŸæÅ9LNÙåÜÀ�â{�J�V`º�‹AUàÉŠƒ\±@Ðk§8ÎÔcà‘„Nlyô>ã8M4b2è~<´ÒêÞ´~�Q)AwÜ^£¯(a¸KË<ûùòØ&S�¼˜6»Šø¢æ¤·ž¤uc¤·ÏíSd¹yø‹H½RUÀ‰JTp™znÙóó/ºó¤žÎ|†F.úÈÙ·zÆ·DÆ�³D½åS™ÓÇl¿Ñ÷öùÇÇqpÈf\H§òHâÙ�Áèux ³ÏSå1ûÍÖ�jä½lýw¸DªŒË é‹ÃæeߥGjr…N×w$fêõ›âT½š*  ££‡]�‡ºQÇÙ‰lõÏ;ä”çpç‹dO°ôgV]˜U—ÂÕH ŒdH&1u¸yG§½7°�Šޣª£vµ=º5aô»xWYæáNúeïÜ$“ÎÑNÙ†Á�VK†Ž÷ûáÙdYãÎ:Å œÅß|ý"§ý’‡Ÿ,îgkñh"Ë·ðkµô±f­l§«üVUƒ0¶Š‡®?ÃVÇ;Âó*F§bUÞgö£ó,}7›-šæ¶ ³±ÉÚ¦}&[] Ð%¶Í¯eCÛï{^Í»D>yF>Ä Su±‚‡ZÒx`ªšUú¯{¸ýŸ � ÿÙ|óiÛKþ½)e�µ“Nÿ0_ÍH“öðý �Õsê–#±ï‘X*“J9|‰úÜu“ÍqÌ£\#²kÐÜÛÌ$¯P @^êgÜVíjæî^ÝæZf„�Ž\õÑFW¢t×ß‹Wîé�ç Ž–VƒWËk©o{—ŽÎ?n2'¡_¯óM×ßü“�ðµMÁ«œë½úÖ\ß»�éÄÚÿcAŽ»ˆ÷_×ýh -w(›ÂõVÅ�è鮿ûøÙ]Ö6æ“LôVv¹¸Ûu¾4æ}Ö¼íyY.ß®m^vÙ[~Éì«(›GùF>^Ï5Y¯1ã2\…Jq>›Ìk fØ]T-ýåùWƒ(ˆÆä�YZõ²œvÛ7*›Xã·¦LWñ¥Œ“ØÏ&Gk˦ýèN˜Xÿ}žiqöx��ãç Ñ7ãöNÒ{ÚNð깳׈ÃÐtWVæü´wqŠmÞgÞ ›�Ô»�I^¹·ÒfÏëz{´zŸÍ"ó1>.ã|”5š¤ÊN›‹k;ÏN:lwTrf¿ä¡ž}þìý{6%lîyS ƒm&æ»IÚÍ5é^¡ž×q›TÁ婚(2kÔhj®ï+9vFÙê¹�Ͱѽgò­|h£EAÜS‘+{åžžú¿Ó/ (Ÿœþ†ëá¿ñHP&ÃbÎp&ü/'¤Y¤$f矀ö~±èð}øá›<€6T�JÞø�g@½×á,ž°½y¶HôOü‘rúÐm²lÛý iiH¨?¿÷÷^ æ÷&ûëy à†8!@û~ܿ԰o æ!ÀùbWG�Jý µêoÉÆ��ÿå?ŠÚàü8<*MÅš}+êŒUñÑn�d.©Ð ¤@œÙ�@UP}4,Ó(‘° á�Ô#NH‚^Ýâd�©$�Ç_›®ÆSÐq.~_~:¹F„UZœ¬0k<ÕaFYšVE²‰d¨„ƒÔÙ™Ñ í¹�0Iz¼w;¶”ìK¦º:¯�:%äþü˜þ BR�Ùs�Jkjb&Eã‘Ç£|ô}ï‘O9©Hƒh“;U™Ç:ù«=ÓÑ fH¡Iþøû=®6ûï<žÍŒ�h>æs?á()ÁÝóù¡Ý�¼fsS+PQ¨43T'f» [ÂQ>³ºúÖžìOfüÍ *½{ú9ßoA¸ð^ïTz<¸é¡h2 IH7Z`;†<¹"uPÜ.Ï(’�¼1Q¬e± ÀøiqxzçòEÚ,\qØqq˜_7õú\¢Ð� ß¹·Ý¡h{ÿm*r¼ÖªÛå#n™bõÏý;tÀ©—ûEä +KwGMïG´¿RðÐeÂÕȬñ“}à­»© Û¯¹Ù”^'³’ͯ̊�¦é‘×-î:{0¢ÛÛu ü|ÍÞ&#­ÉX$‹þæáØh ”ý¸­Øz„�Æ•*°ÃÆÏsÃ+Þ.%J‹Štû¯[mB6öÈí`2‰ˆd¿sã^Y˜¾•Ï·‚š½þír-yÝ·†ï–µ‚’2ï'8—tŽ 1RØ[ÊÌ¢›ÏKÛ[3­0ûN!º¢†mÏÒ0¨V‚~±ˆQã7½[æ)ZAü[�ÑAm)¿ö­qÜ•«êy ÃbÔøÙéÁó²M›Yà;˜mrÖñüªêÞ¿·CäxüRæÛ¿|[vmFg‡‰òô~§(ÚêÆ¾*ô«GþÅÕ[sUEÏ¿V±ÛÓºŽþ7êyîC{—Çq‹"×…à¾Ê×ÃΟ/rv+Q¿?ÝÀ žpÛI~û(çù7[uÛ?¯ÃU#îæ |/ÖÕoypæÂ¹±Ÿ½ß #0má4/v&Š¿ÑUjwJŒH~bOÕÉ&¾%/ÙZ)ŸŸ9Ôд‹¡a „x[̹Ñ5˜‹ä6ôÀK5°*3¿—SÍP̲SÆ{ºN¿BŽß²9ýî¶à=Þ­½ƒ�¸ähmt‚nÞ”—HeB~üù„¤9(ÖcµæŠï¿:>;“kÍ2õÏýT™CÓ Âaue_ýávÛ©1â¢,žG`¾æž*–ŽÇ/-÷õ=ªÏ‘ÏøÛs—L_ü”¿l!‡ø%�XâîÙ'²Çº *l×à5@r ?0î¼óº(Q*þGûá 𺅗_v6çÜ� ëÒïjöÈ…Úk<¢´ÌMÞ­qúñ®i«� eìÒÕÒ(œ/æ¿—ÖŸJí¿HauȰ’ª\æŸó!*Û^0�l£D7€˜îËíZ¬ûfYÃÑrÄ@vҹá^O¨:ú\Ûq9²5àút›ÏÂGŽÛ†ŠÆUh{d }Wõ8ƒ†ÿu:ƒçÖ à¾ìÑ_9m“<�¸²¡F’vôŠº<=0ÚÚ#ŠMÓõçÌ)Âwï훺©Ã‡½–®E +W1lØGëW×Ááªu{Ÿ?‚×q—ÁúxË˪Uvå|Œ¯´YA�˜)‚Wÿ4*ÔZ3†ìümªš‚,#'å_ x“¼ÁøÍ žü¯™x½PyýÖîÍ7ewfTé¯î]ÿºeý§y\ƒ•F¬£rÎF±dÛüò‰󠼆õ0ÎÆy½½Ý¥AÝ['i¨(uçNÈý©ˆÙÉã�Jxy¢69¸TD�¾ŒäÁgÎkË»åRÈxUtëë‹.û°‚£ZEÎ ÷®Œ5”‚UÆîG…‡²‹Vy¡­Ÿ‹Ù9nùÞÛÅîŸ}Ù(zÉFw6•š\lÆÛû³ú)ÄÏ-ew ’ÌÉí + x»¼âs íÝØ¯¿�q›/‡ëÉì~QíÆ’EÈÏ=÷[î/´ðnœ ÛRÒoýcMè‹/‘Iø¾€â”ã*˜\_«éÑ¥§ŒÏ+î{—öÏòOsDëcýÊ žÆ�ßÒÊ‘e 1g›uÜ8cõõÍòùKH|$F¶mO ÿѶOî·«iÿÖšãõÆy29í³®ºèûkyc÷ܲ_ÍDiÿ“X¢fm¶s ú|ÜÏ%m¾†kÁæéˆÒ ÝIVÖn‘ß<щݴŽÔùÚj�{¾x²îi„á@Œ®IY‘{€?65L�ÿ+y�·éÿíVèƒýfêýçÇ\j|½>œª* �ðìµé??…óÊñ'~q »ãþ¿[4@óŠ>Dª6àœÿó¿|ŽâY!ð .@lo þEÈâ ÇY2lD'DÜΜyOÜÁw´Î¬Ã×Có¯%&kÍýOöÌ @¯TÊü–„^@cïQ�“èç­È œNZ‚‰b.$F&ž»’£¡è‹Æ¦’~ªü>¢�G òˆ”î‡-�BÀBŠï™G ‡½]Á�t€¬d]ÜÝ-äñ8¡K­)M1Ó�ô½<ç$Ì àÀ½Õyë=ÃôzÌ´ÄŒ$OÝC:½è�<%Íç%¿33ýÉÏãç±¥uZûlûS¹öøÊ ª·éõïà�×èÞÇ9hnò%ã°o5S/Eô®tln|ô¢!‡è#»Äµ$öLùšûØã¼4 $2w¤6ùœ¾¥÷Ù1%+ÙßµÐæ±Ôó»T[3‚«Á“…‘ðs‘C éFÂr]]·õZÁ'ßLö]žõD;_‘yÓPWXÐÄj$ñöså=Ï:u0áÑßö¬.~¾!•ßwed»?à¬0 Ô]%÷Èp€˜&óÉ ‰!=ÙJ“ŸÝ§¡ ³ÏyîÖ·Ì*Q¥«¥eÉ I¾ñmÀÚ˃wj—çZß1šW""U”Úçcv?($–Va�n~A´òqK�³ñËw…y á+Ϲl?m.¯†®º‡)G§ö†áÀ×»Æ×ÐVC=¶5¬~F /ò8|9X}v×|¼®.ç÷m_S \ÞÔœH1[Œ¸U)jRTsÎ'¨|Ç3»Aðï4³ g?íÏîöÌû|å¿®ŒÌu¤„åû�Ͳ][ü¦Á>g„ü•ÃÛnhÓ±Ï.3?ïý1i>câó¼‹k´rÎNïd-”HœýVÚ ãŒñ¡º]+4[«$äü÷óö¿³~{ßUK¢S“ý‹6L–„ä®/WÀ ž^ç“‘¼�Ð,¯JÔUþa•GždüjfÅ'­®sö¥e£c°ÏåâC^(§Õ¡Û±-yc¿µï<�áøK<ÜNJ«ešV&Úã5v»üŽÒwʸ(ì{7¥tþ•Á/D¤Ÿß#»Âÿ“»Í´ÆZfuª—Ñ*bäÕ?¼Ü‹$7çg§ð^îYº;ø/—M`ŸV¯k¾ÍÀV¿½œûÍa~šì »ºr]«Ý©ü¿¼-=SÃû;yeúža’©TwNbÒ·„ïŒÎ¿ SɈQñI û° ëXL’籘.¿œÅÜ¿Í_}e;„äúç~¬6›û�üúà%£2Ž›ÛÖCÁ¸Ð@ÿV/xõÚLÅÃ]6æ%«ª POggS@Gì ‚R ’h‚ÿÿÿÿQÿÿÿÿ6ÿÿÿÿ4ÿÿÿÿ%^†óÙs*@8ÅPšrf+ÁßT…ÚŠ9);_Øí{·Öÿ–•¬À`Š24΀ÿúWAp!næß"Îíé�ã«Y�lÖþmˆ ¶üü¸u$• îbý¹½X7zû•8ž ½q€êy×cCÛ_>´:áð�)@šO&ZÔí½p€‚ùè»Ä‡#€.�ùNÁÔ�€Ï]‹ÚUq Ræ?ıP?�y]ÜmFÊT03½™ÚÇ!6nª@hIÒLjù˜ˆ©WsD'e–§žÔpRCªS¿÷³�moø½Ú4¢’²(OÕ9„Æ•©ÜÓf_Ç� 7ßûidtÇaŸ}”þØÃ/zjKÔz€4 P‹¯IÍ/¡†{1ý+WÜŸýuéOäžDŸ�\Is@C«ÂN%|SkÌ£U¨Ÿr´¢"‘zNÎ#ïíyT÷·¦Èa¯y¬æówû‡Ñû§|h¦ôa�¿ÃÈŸt>äj5>Zã 3²±_�Âó\mÝ9æ+ù×Wv†€Ùà°;@(Ø/h‰'3½‡–žT•‡ä÷È5@2b·/qÄó’�½é˜ª¶7Æ¡÷`a±§¼Û€:<çß àåì°.\š%eÅô¯#O÷$*š‰t¬°-žD“»ï?¦ÎÔ*æuºœ³¤Ãt–£Ì�ÐD—Ë~  HvsÔÊïqŽÈËlŒk…¶ÍÊûœ_xŽË±#´V´3–hc+´Õó^á ÂBB3‚MA çtq m*¬¨aF `иù…6p~·ñÛlÚ^\a±�ÄS6_|w…]›3y@1S ;w<³‚ÖK,MÉ€}ï¶ä[BT2¥S¾ïÄÍiùøûä ýJ.îz’“ºáçv|•gf�vÊ1bä~sR?ö‹ÓVýwŸ\9ØWºÔê ÕY&Ä­òŽ“Á§L}æ§\4÷ðÑùÆGë67ÎHæè’§ŒÒ÷[;­rÝ ?þ¯$;Ímν~ H}µ†»{~§Ÿ/#)dš™½ÌÇ´éÆë»ZÎ^cÚÔ=»¿*›¤37ÊÓö¹' &PzöîñÁXý¯Á„>AJî™À"‰ÿÂøÒ%r½ºÜ¿óÒçô¾ÿ•#þý�é2þ²\©Raj�w±¿¿r±^ªvêL‹í†Ó7ÛwòmŒ`I¸lò¤˜·ºÿvë¤ËÃñ³^ƒ¦ØXl&ºˆãßd·ôn�G³Ž¾2Úî[œ¹ Uç­Ž�ië¡d’wØr Ï®\¢qÚÛ÷[s ?¹¤W]¾­µ#sÓNOMOá¿ßúeò"£¾ê&ÓêþR}æO}ZŽ»»åEn˜W ˆñ´W�p}ªUιžœï8›Úª;[-î_qþF÷q—¬h—ä†Üëf¸ä†È8«dî04‹·›Ý¥(’y³óå”¶ùý›“ù˜.Ë­¤ êïF�5¿¿Uø3oÖ�xûc]®SÀs±ÜvóýT|€ÿÞ†Õ¿ñ BvѺ$VÂn.»yZ² h[çëÔÀ´ŽÎ§öýõú†Ž¤Âö–'è€áÿ(�$¶î¿ÒûSèëÿ»´®M\HSþ4ìÔð]ÿ«4.€ <{þ¯òW€B)t¸à…¿ûEà�ú—›_Þ´Àš&àÁÅŽQON?Ïi‡['”_ÞN÷¼ñÆ®3@÷÷ý€JT€bœ©]˜Ìlfþ¾©…éžìÑáÙƒ¦’ˆI„.ä¸?éTZ·m×ú°Ò‡LˆtÄ�–÷¨¹¨;ÚËëÆKª¼|j0ÁXÊ×ÍP_ö!îX±ü!Ð׿ÃûÁŸ:ÝLø ìÀTgÕÎË’ŠÓ‡¯%Ks4?r;§•_íÂ!5Dl{)Y³™êJ*Z¯ùÓ¯»\K:pC/þzŽ¡¥åc–ó)GÀÏÉ/LŶuÝîfr<ð_ÊÆ?ü®i6KêO*?²-8Z]3líÒ“pÈìü?*Q’(Ê×Z9l˜Tç&óM)sj‘oØj0áÖ…ø/ž|SA=ÌIÉ8çPçÉê6é\šsÎÆÚõf®Œ¿75�Yš˼—«[kSr¾á I‚ÖVùÐŹIžnÅs‰ß_Ö婌 n)ë÷<ÊŽu gŽš×˜¼Ú¬UŠ.‘¢tsðàl¶¿Ò­²ˆ *nÍÂÎ*(¯—g܉ž�‘Ҷؒů»#% ¨oè%¥g¸sË€ÕÞ›�^jrÍdRSÌ ÑV§|cgstÏÏ2¹Æ2Ë/“qÝÿ­¸XºïK^‹¡Ñ/6O¥#iê(]<¾b‰©ç5–ûvŒÏ>¸î×ód Þ—[ÀekÊÍvÉö—Œ d Ⲍf'{ÊŽ]›®³á¹ðK×2]£Å­IWÛ:+Æ¡úHòéì8žÍNU¯ïÉG!޳0XD+×/§ÉQ>”ÊvnU­I$vÛo’”šuñ®?NnwJýê8VÁm~×�ËΗªO |PÀzÙÿü˜u½ó”Òjú¶÷¾æ¥ø'§ÈÕêO‚½\M5SÙõÑìr“ù³P/* >†Kêߤ JÑ9g6ÇÿWÒC™%¨MÅù  ¸2Â=\O`áÉ#'Ç‹ ’øovÔ?4<†›+hûdµøZA¶üø•ЍBª°Â¾�‘€} Ã|&Ü`ð»Ç=±6àa Úö¶@—@ïôØæë?pଠ«€s…T ~ŸúªIA¤Ð�½¨‹àÀXJ�B€x$‘ÉDϽ¥œ n‘Àà²OŽ×½3¸’ž*2µêŽàóŠy<„2¾¡~Öþ­Ù²£¾/ýÕ™ƒL¢âP)hŸ³iÇîUû�ÌbJ"³@!� ° “šóŒñï ¿\$3ù«s·NõX]…¶Ä-ýƒ&Õ¡Pi©�´T¦ûYï¿_ž}Èýg<³é®…ì¼}*hîÊÎÞ€q!ýÌÇŒ<"ýú[æÜ‰qµ N©t‚£ÔA�9*"Ћh„=:—êÁñ˜ž Êì¿õ=PéC¥NH¹µÿ|²(Ó£Ä0×™þ•ºþtš šØÐQpòS€5PJ€É†óa,œ|èù`Ýq×¥²‚T ƽp•Ê“ëgO¿ÿÅözõøµ÷N؉¬íˆõНËW4oØÇ ì¼ö5®¦{@¤¾€ns‡¿9~ÍŸUkP™©ÅöK{jú1r”c,`¦XÏ–cÉw}ܘ‹’ó–KÓ|e€'l] <!l®À&*zî‘ö]RVb çü`жZñ½§¤”}n|%)ÛZÌ*S¡l2ulm•òE1¤ 3ð\jy©h˜Ï"ró¥z�J~WWÔáõßÓÓé·Ô*GâüÇG—y_Ì”JA§yT.sC—rÐs‰­O+T Æxë{0â‰Î¶Éq–Ôº|¡A¶Ñ vû M…l_I¾\gj4×’—à°r=qOb-ååëtRö‰~~þÅd9£BXÆŽAu 7Õí™Í\�oü‡U�² 9×k3·¾fXô1;ü¾�©2ÖÚ�-XVÎ9J©�B¸×d�á='teÝM€åc3}æ4Š4N¥çáûVYµ¾U†›)ûœÍ”­ZÉäY}Ì)wr¾iAz?ïM"TÀNõJ<»þ‡‰›ã¯Ë:�Åq­Õ4àëe°Vw)?jëÆ.ÞÇ4' Æ$¯­FÔ–ß{0H÷C ”…®ôÙê%�7ìZ_Æ$?À»:ÐûKÒ&rûÒN.ñ¦AŒ9Ú4ãZ`/6’Ëuö-Vak0×3t~ 7óŠÿ1¦n�fºywß¹ãr¥Ž)�bÈp‚ê·Çß7Öˆ˜üÞã[>>®¤BðëHç‡Ø„í�Âð Ì!jA|ìׇnT¯FCl™~\Õí¹þœ^W™ÖUöÛþ_&ÏÍ.N¢$v6xkT1ÞxÀ¯é —åVíwõ'î2·êmÚ*¼à‚ ž†«Áæ‰hʳXSv«áŸZ˜Ååk‘óuä‹Xqýâƒh*P*”0Ýx]à &©póòùzÜìz 6fCS/þi@ÂÇëà Ù ¨ÿâãoúá„®Yü/Š:̲õ�Ñ€²ö—ë'߸<„T?} \õ 8WG—K¬w&l<®Uä¹ý쩪¹zø^ßÔ ¤½¬’(8�TY¡$D%D&[Ÿf¹¥NJ®ÈNcª[tlÕ­}-¡»<ßî_ÄÐØ?ÅSŸ¤uF[™­¶E¤¿úöÙ)÷ôÑsÔÞb¹ó‰~ªhODè� L(@�¬U"s›~êï°LÞOú®êx>˜½W?M}¶zɆØ@€êÇuu¤ˆû÷*~&\žÁ*!3Ñ�g&šyn�%Æ?�‹…ãäÔª‹ÔqT:ŸWD¨>eZ›rX÷�ʧì×VMÜ¡æHf-Û��:c¦çïÖøíéix|£ù ¸¡“úh}ß#@wûXšÍ³.€ >$C@¥ €D@Ç^ž)±…VO½¦½'´½¢|rí)°sô/ŽMô™!&³;èò>`ÉÓû%IŒßî9‡Th,¦dÄ9kM£H­~½}N'˜¾Ü[km¤§r·T`�ÝœeÄë„DÛ}è>È\Í[Qe»¾Þ#ð³üÍ}Z5¶–#¶ÖËñ…w&½rˆ¯›`¿[Ë ÿæ4õ[ÑÊÂbƒVV9½·;‡¬5.tÅjµuºÚ¥ŒÜÚÃG™ŽxøÄ©K”œ¡ •Þš–‚¥KŠùj2^g,M°÷.ÙÀÞßL}¹½Üi£ùâ)sÍÝš¬å Ƨ7pã�‡œO|&&XÔ÷áª�Ò%îb`‡Ð µÎ±ë„ëÉ;+Ê^ù‹åzwÊ8ų3¤½j¿«ç¢oå‘‹O†×—K�Ëz1ëÎÍÙ oo°ÝýÞ.á~I:+:´VRçË%2»?u½Ùr ¨èq󖘾ÌœsùÖƒºêkì¶ÍÉÜ`S†7. »ÓͪUVóWŒ5ŠUÏtbs®‚åÛXÁKÿ—�y…¨Ìý¾ ÎÛ�÷Ò&m(Íû]åð�`…U¹äc$y÷!pÇW® }œ�¬fžçÆô[VåK#:Ì¿¿ 1O“‡6Cpþs·AÛŒÖGµê*/×�?á?Ï9»)9ç´f¥h·oWÞmûðo�߯ߩ8.g»<\gÐ2êrþYéÂÎû«€¹ãk(î¿ÒÚ‘·éÓ¢ÈVùoIæÂ½Fç«8*Ž¯å«Ÿ"_|¾8cq<¨ ™*ññæûo»ÆºÄ¤/Q[[ÿnox£ädyñT©^$®l€—PÞuóáŸxsNYZsg¶Dþ�‡! §i[Éê|M@|¶ÛïþôÅ&¡ Pý|ux&ŽÞøEe¶Ià&râøû«æÑ™?fÖ[®û  !$ÜíýÃÙÆ†{µxŸ ÀdQ€âøùßû+˜:à¨Ozr€B´X'A~Ý ¨µqî.Â^U€%Gý­—Ÿ7© 8ãÕm€žsÅ.Q|9¤{Hø9޲f£L„$yŒÆp©¡Ó'‰� ß¿(Hf´�k!‡¾•g­Z tw£T)÷¯–‘K£}×å;ùó+¶¦ù>xå9Í“ÖeúR„é~<»3%Rßx…«è`—‰ªâ#ñý$pô±?‡ ™Y„øœùõ“ÚOâžÚýÁ�1zÜïI-òý]Åͧèï Ør�Tíæ�$ ¿rÇ<6"Ñê¸óölf4ÑÍ`—ôO��ÛGßžñIjOoÁÄ-U p7=š‚ÐU�¡#ɾg(ÀI†€5Û‚Š¶Ë³Úºuñßky¨dË6 ñ†ØæŽC~R€� �ëqÐ-U;f¾]»m b>HM¶¦É„ì<–*Fä6ûuvMÔªe¥AC…$29P³u°¤ÿ «ÎC®ú‰œ[Âm#ÕÖv}Õ¼÷’z"~{†ûNÿ &­ríýÂa ª‰C°ö¢ŒÃTê׿u¥§îM#'o(ÙHiòïe¦÷F`'‰Ö@v‚ûáÓÈq‡KÊ(�ÙI®Ú[—¬ª0^ b_3yQ¾ÿûy¯1³N•¿÷ˆ˜ýH+«6!õ?‡ä¨ë‰ëì¨tAbwugöÛÛvI€»cË=ù6–SK\ åtóÚ|sô‰CLÓÖ;Œ°Ð¨/0\“ÿJ¸?|Bv6«S¶\2¥Ö'5wž(�ãõUQdÌÇë‘’s,BçÄ/xÉåWò_üæ�ÿv¿óì W˜1—òó·v7¾4"w[´Y?㵦¼_ŽP…—‚˜ŸÖw‡Ôd;¯ºbßMM!Òêþ¥Þ}˜˜Ò¼ñ©ëO6*Ëqø¿W‹û…^À”Ìþ“×Õ½þœ¼òþ¹˜}ýúܽ7×V|UL>X~‡ [4š›žß�kùîÕ'ÙFL8uðÂËl_º÷·tÎ4l¸¥Ê/]÷µ‚to¹ÞÛ‚Ú9C÷×ë3Êrì⌂uú*{Žý"W1æ{Ð÷‚ÍÉ]�þËñÒ}�û�úaξº7åçËGsçŒùrJ*�:3.ZçFÕ”YV�ëy[Fë}ûé.Ãí¦F�©³át�æ·~[±ø(ÎTÔ€(,Û¿eè-ÃP±änû©+¹þÐXå‹n7Ãýéy"_nY8OUÿNbh¦ô|ü Þv›ùß5š[DímNì\f«êŸ”;’q¹�ÈùÚqÊÖöÇã�‹LF²“K‘;?©17û™ÕOšÛŽÜñßï’„-l®E$n÷í›wШ÷µöáÛ'j$�RŸý6¦•+¹ÀoÓë¿§xWÕ•YT?Úáž'œ*�¤Ré"ôc0¼ÊÔxHÒÏ—�‚»wMyˆQYŠu·ßˆÅw@uêÞ�5­ˆÞ#�ÕCŸvoØZ8~à@¥R8NjáŒL\[Ý×sy Ó½ýœyÆ„¹&ûÑû<�”<Ô¢DC! ýe– ÆWt<þýÊÒ™÷ƒF9ŽÐÀ’ÓÄðœ…ÈÞŠ¤€š&µEí ˜–á¦Tq¿i¼¤Õ÷¾Tø™8Ô´](y8ä»o“{ñìz’œè̪pxg>wŸL2«©-§-³ÅÄÔtá– ò�öG«ØN<¦)5ˆ8Š“«µm±‹ŠäiÄ¿–Ðæ½Ðp3–�o“i´…~ç‡î½äÅKøL �U?V÷4ƒ1i�êüÍá3ßXmÿŒRæ.óÝõ_Sr%Þœ�-)Ý™S¬ú¶n…o^{{Ÿ:´/0¶ž&jì4†¯õëçüÏ9¢7à2Ù‰¹Ô`ëÙô¸¸;ÃU^x)Ø_­‚òÏ»ª7+‡g]ùÚîš¡ìçÿ™õËáØy1]§Šl¼Aÿ¿u~Î+Ÿˆ’Œh<w3Áö™gÓ¿Ö›¯ÆºØº2ÉNÃó±K©ÏvåÞ»VŒý@wdþZÕý)¤Ã[ã~ùà“©¯ âZ/?Òwª•¹Ó¥·Ö¦k‡Éøi�÷·Ödi�ÇÖóœë•kì‘+Lõä@µƒÏ±Î8{é Äe»þo¡¸HÝ÷2‚�K&¥�Wçx”}Yí½{Ü–�pc¾¦�j›Ø×鶨{÷åþmÎ÷ñ­~ÿõáX“Ò¸spòóÊ7ªè*q&Ï�[±ôµ5ùýø#‹þŽë›\YÎB¦|t*õ¨²ÔˆñQÔîÛýã�hv2øÍ傳ƒz8ÀÕþQ‹×úÓO^îê%?ÞnÙÞÖ›é›;ßJ¾›?øp6×U×#ß~õpëßcôbÞ“ü×Ògþ…“ö‰Øæ»H±eÓÁß´pTóY$ËÎWÄ*ºkýÅæÑ€é7’]è;çÎQ Ø~èS}¯m¨z’ó�ºýãèlÎo^qK+“àŠ&У´™àŠN¼ËO×�» \¬Qül8Œ,Üóuú]¨§@ÿa‚ñmÞîdø„“1A·ÓT„‡:;Ÿ/Ü=0 é�/§Ù9ê¡™M™èž¼èòÀ½íYííÚïD2ˆt›™ÉÖ}˜Dº=û•¢¡‘¢ú §"DÛ·VOr‘ÖÑ'ÍŒö4>gDÙ[Õ?:‚N­’ Djl2]½ª¤;sÑ©rŠº4þ‘®o_‰ÛÈ­�@·\Ü�{bž“©ËµÇɧàÁ´»Lz«0Ý· {l>Õ�GT&˜�lbúŽî“Ô‘Œì´ tž:ácÂOö“txƒ‚ �_‘�‹Sê¶^Vè¼-Ó:•ÅAtÎvך.™ŽSÕVuø0�ÝkÀA1o““™"«Ì?œ�ÿ²ˆ©Þ›Ñ°Ì;zè ¥ž™ú½¿Õäá'=6³~p´ÿä yï9”0rq®ïWðyjÈl‡–›±ó¶(�ÍïçüºÏ>ã7dÀ·?ÐÖS« dP‡/Bï,3¾wÜ�þ‰¦`FÚYZ‚¦�MªP]0j�욭͇¸×ÜdÞv-˜Jú;ò-ƒÈuîÜå[èS¼}ÏŠÿîÙšï~`$kY»Ì{ßoÄ�ÔЋ Ä‘¸5Íœ�ižs”ëHŒ÷­g²'á$¹‰áv*ÎèSÁMXÚ<µžåk£¶¸N²ÂèÍqËÙÁæeµü¾ —••{1ø½L5ÙWÌÉ4²«xÒÝ_¸7ý(¥æú_—œ+˜ƒ2°2uwÍû�àäöå¬XŸÍ¶Îœ·Ý÷´{¢ª­‘-foñ]� îʧŒ±qÏnµMî�oG¶äÚ¹Ô‘k­PH°8‡0æ?Õo¸ì×^$ï0²»Þûúõa³©šaùáßZ òb ƒÚÅŽàÉûb¹Wÿ Y-M6ªì·Å‹qö×ö¥6Ž�¯UååÜ8[é‘Û1ˆó]åAz+F\¹½ÛF Ê'R?Ðſ޽ɖ�X¡¯³ÕjSçc«ɯŸáÎ jÍ|ªG¸¨x›¿¿í<&/þ<ŽFd)µ kì°Ì{¤¯÷*¨¨T�‹Ç¨ʼ›w‘™¾¾‹2Ï­«çoùFÿín¯bM—oeˆ›T§g·‡ò›ÑÛR�°ÐqÓr=Œ¿Í“«(0]¦êÁ¯¥¸ OggS@kì ‚R>еöÿÿÿ÷ÿÿÿøÿÿÿåÿÿÿÇÿÿÿÎÞu“ê¿ËQŒ»H _6¯þM¸!ØÏ"Iê|í€ü¼µöâˆxàVè$Ð~vÀ¡Ìw†  œðØúþEü®�?Ýp9ÔNrÿò­g€-ãÛŠzê €Ï¾é%D"®µ~ôÍŽæëãý¿¥€æ!4ɤ‚S¿>~� `–¨\ `�Ð0}ËBÎðó�ÝNp¦¯H#Q?‡$+ég—�ÌJ(T9ªt*ÙGˆ¯‘p'«BŒ+[�Ê#ôè#Ã)>³Gŧê½W(ãeŸäZ4t„i>pªB‰ ‚g0UÀÅRw4éUäO¯ºÉˆ$yHŸx2þòM'ÓÓúËt·Duqá¯ÌÌ:˜–lلЙ^FïAÕ§<¸µ�‡¶ŒÊ­[2òÜŒLÕéëpuTy#“Õ1fWöÑIFÙ3�­ª “·ÎL«$MÄ3S™=["»weZ©­ù÷2¶Œßö&”m—æoH•øV ?ž¸f ò½E÷¤4<¡µç‘©=@—z¼‚ô3†�HJÀé¯ lÂt˜Wý~Ð-õ Åê9rE2£Æ{ðr¾fÑÀ^ܾ½AWô7kñ"¾¥öùBà�§„×S›~Ñá€Ãd†ßáŒUÅ}a°Û:}SlJ=ËjW+z¥¸ûwPÍßÛ¾H:†€Fø¨q‘7�ïÿsóÐÄ-ýF.¼~\‚¸9rǪEÁ¾í¨~½¦cùùt<�¸\¿@ae-úÈ9“?s>êÊš|1oå»U9TD©öéÿ¥²~¬eºàE�x6W´:&Bë_ß+ú/é­7ynÎ\2Ž|uÊǸx|O@?Gù�mÅXzAJYdk×”MW+r:~Ï’DP‚õóWŸ»lˆ¯r:©eÛ”)²_¯‹¸ÏNܳø¾�®Í¿WÇçäÒ69 vqkóç9”â¶ýCp±|ëZŸ¨¯³â˜ñ©^¿ûÿy)çç‡�óíðn±gnp`±m.äisMàì>>Ëd¥òÍEé7#ÿ`,{_‚1X”ÞÅKØ¢Ž#=ÂE—®N¢Æ¥6«î‡Ý¯pI‘�âó½ú¬‚qQ�+7þF_v…ná° ¿ÇË"cœ¥/…Ï÷} vóüæË©C»‹¶™ÈùÊF•§Ö œSL8ßÔ€}>«ûéÿ>~’ŽBÛÔÁõ }ª·ýŸ¿¿½”Ó3h€ð RoµÓqWÇ‹7±ØNTR`Ýú¬{ÍjïÀƒ¸ À.?õ÷l ‚F£€ÓèWÈó±‚_>h7ðmòƒ7'_ÈwP¥*À” ][*Èc¸{¢áQj”'œ¦Ò€¢‰aïÖj›¡ùK|ôÑ=DíÙøAØ�ÄÿþêS‚^Šò FüDŠÎDkäÞ:®t�0û½x/ ÛèUg6G>w•™¾C§cäù@û4ªÌ ÀáW錺?ýSõš™™`T;÷%Ž1‘)#©ì#W2¡ÄÞÍ_ÓK› #îßkN��†v  ’²×÷<Ñ:ié¦!9ï¯AP.%z˜ŽÜ2 ds¸3 sÏd5…›1€}µ¹v¤¶=Ô�! ¦¦O&¼+BL¡N)8.Ïï ƒB\—ÔÝ|Šg|Ì‘f4ß­õGO<˜ûó§|QOôl£O4ñÄÜF&¼0ñR�[GWÉIÿÐ^¦£&ŒD NõáôÜa�%oæ�Ì,vé1tÆ-§k—pt±]k+ŒñæÏ4yEMÑ׀̲^ž¯V´ZMÅã?Ë„öþæ½js ¯øâ5~÷m, ÆêÇYÄ£ÿ&�üb²®MãkwÛÍTé�¥U×\ʯ;Tx¬-µR†ã8}g/íz;òõ†2ŸßMBWÓ¶Û]ÂÎR µ).ùZÎÞgŠ6™ým¨§4Qÿàê/žî~KugúÖÇrUoÅìîáBÎ.‘?¿ÓÉ«[2mI&Ùs«‚¥TV>!ç£{lŠ­ü{»Þh¯OݰYÉ�•.³ºÿþ‡1Nû3èççƒ_BŠd�ó”Ây²Ùun/ÝÞב²©Ô×ô[î�N)ý¨]ºÏ.T|‹ôý•"çAÝ7Ïí|1²y›ï«TÁw•ã…<í PÉã²¼Ó~¾*GŒ[Þ\Ç5ÎÕÚ�å5 òû¾ #6Қи¥–py¹Ö¶�ƘݭºAV¶S&øŒj”qwî£óHV?þ>góî#ä_£”Î&,¹¸\V©O}þmòÛüU87³Ê쾯�¤Å'µÌɾ6Öê¯<_òÕý]{[X3…\/ø8¼4ÐyÑ×ES=ž‘I‡kxt«ãÕ·k¥ð"¢uëãCuˆþM7“S—¤.‹QcE&„yý·ºÞ; Z¸Où­½Pªòè*vKÜŸˆiHÆ]´)8oÙ´õ·9åˆÚ³h»eçëì{×®¿ÿ|{Ãt0n +“w¾]Tp(ò×°}6�ó6:µ\´TâÉ�㱯›}¬�UIàçû_þøÕ²%‹¼ªûßþqmÙ¼¼�L ²íÀ¥ªósö 4À Àh·ê;`Í`=ƒŸ>� ¿©}²L7@'r×¢�‡Æß|ªä èÐ;@ƒ3Gt†âØÄˆ¤'rùpKP(ø¸Ô>å�›pJ<µš"hñD\™!·ôŒÐÚsÜ:Py�9ígf|´_{ ?;ÃwºŒôõNu¹Y‰¼šÞx„”¡ƒQ ±Í÷Èyݲ–ëK�l1£¬ì3÷\[©ŽŽÓ-Ö¢¿Ê8ëVnkPÒÚRÏgyŽƒ2îår»V>'ç–ï/#ŸÜɗ̺J߬G‰­¦"Gþ?猀Ìöä{ŠÏÝSç]šíÄ‘Ëýb9í·q™ï×HýÕÁŸ(ý É}¬­7£¤�^¯î||ˆ‰ò®ª&]§ }·ùl´úº2KRëÇ»ïðϵ¹ýnÿ´œ½nóüE÷EWÏçèŸRÖœ�‘Mξ̮_U6»»^,jö¥ÜP¨^vK`óp Å>EÛEì|eóÁ¯©ÔAx¤Î×Vƒ)îR?ÿû�š× l Ùpí¨Ý.ù®ð%ù)8ä7ó÷͹ÉÍK‹E[´¾~ØÊ˜¿p;2!ܸu÷ƒn8}ê ëŸÝàA=uT à¿ãõïL5‚?¹Š7`~ŠX÷�Á088Îðhâýà©s–}Pèdz²5wžô³÷á#=dd¤2Þç52D´f¦¤U"2™ïƒô£ñ1ÀÍô�}+�ù.TIžze¦4‘ ¨é%”¿¯2ÚàâR`zŸ_Ir¤ýö d¦{“\�¸Z» Ê\UNGKep™¥å~(C/™d+=Uƒ>Ô÷ ’ÒþÁ½Mn3·^�Vcz> G§¸¦�Eö'ïØüÓCâ0â¼^ݲÀ¿(.@MPÎŽÙ�Ø0b{—�ïäésšý;¾r½@}¯ì�°{S 1ÑËþùú©¸]ì# ת‘WC »Â¯Ÿç©Å§ïÐ`Rü-eËÏܦwVÛÞl‰‹‰®}ëbóilêLÈNIŒËËÊZh\-Ôƒ’��i‚ÌÈlk.*šÄøàÅt™ !¢¯Ÿ)ìo=q#ëÃáCZú †BfÖ¦6ýº°¨{…ÿ§?°Jræ™ö[6éÞJ’D=Ú›R°;Blˆ�Õ€wÿõE8�#êÈ•Ip¶Êo{©ýéSvÔìµbcŸãœ‡ÓJ´u Ìû¤_/æJATðkðŠ‹”n¦±¦L‡c¥ ]J·ˆòJ-J�pè5–†l¾—¾ƒS”7öC¬_ªf0ïøÙê½;�ñqöš®JI{ü]»ø[ +ävŠÇxa•Y(sÖ#ÏzÿÍ™÷¶x…›´ò|ëÉ2Y˜p n1íBÐ¥ââH%Ý«D`¯•T–Nÿ³V!!?íÛìfO¶üm7;üçûô|\Jkßi?Wëý–´k³0žEÝAbŠ&ÝþlÉó|®RÝö4I1þ§(¦÷«³/‡˜P¢«@öô¹¢O>'¿Ûkc�âä—ö2í l#ÕÍXë-OÕV<˜e—–l¼ÜÙ]ã¥/O]UŎ΂—j7ýQòÏ„�5ÿµâ+5¶º�Õ‹~²¿9L§¶‘ýÙ=§Ì÷Ö@uð±´ÍQ±5ÏfÉÃèøAÒøêg6�ð-cÞ‡i—?Fþ¬óîGò€{>'í ?öÀ#§ªpÕÞ÷´«Êﳡë/ÿº¡j©~«i5[)›ÚàWPX Á”˾…ÓÖæéÇA» bç-›PÿÍêÊ·x1Uçk¬Á¼>¾ýð!½X³[Eïü"no8ÜÄ�SgõÏ¢F¡³Ê¿À¶O;0�¸{±ÿx;ͤ]9ý>€Sñ~e£;¢‰#à8¿Õû¾Äêšø¥@'1ýÁa=O0¯?£€¢÷耿ä%+â�¥›T  ëœ8ÝËö©ô+I§ì$Kp ¸NÛ�.ÇH Å#àRpáû@�?À½í‚äóîɘf†PíŠô¡¥+5FE’¼æ)Àôó’IÍ­½tÊ­­ÕFz<ýx€‚>%„y ¤0Bíï];è»E3Uº ¦ž_iyNëÒé£&&‡™=ù yL-èú’ùHåz&>2F©îÇÐ:ƒÆüLu]uy¨Õ5p 'HI`ËÛ@Öê­cïû£ßèý]º¸ß… ¡E»—Î-XÍ�3Bì7±ÙA×õ%’Á™Ì]=žÛÉÏ#{ÔÏ1äfìzñ T=“ìûÏÛ8Öƒ$�Ÿò¡—=2B`´÷‚ãŽ�þ³f»®vÜV$n:7˾‚º™~ݬ·¾ÀÆF l R¦_÷2õ ÔÍJˆòI¡ü?¼¶WIyýÏuá»K”€3¾Jt_aÙ®Xª`u«Fìd@‹r.f"#JÑÅÛ]FÅ¿Äy_�è­…¾«QÉLeT©gÑHBý±5ÒWã^*‘ê»nVsãú½ž}*ýél´0à Ï�Te¬,o¨"ñ}ÙÇa>¯B ·Á&çÈ@œ\(*¡ÎÈŒ߷mM‰§væñÈr"M•²}Ù‹¥Ý¶³¸ÉRƵã+½sÔïuÛµùçø`ŠLi~‹]ÔC3Ö—ïAAõ)§‘óíÜ+¨ü6äc�Û’kiìƒÊ?íM¼3‰­ju«“(~I½(’»)«|²á˜”á¸s+—$Yß\_#—¨%vÝ%âP±9µÊ÷ŸËzU†ÍÆ* «üѹ“ìÈÇØ³ºV³¯Ö1VÌ]kÂåk½=ðÿ örŸWç˜d¬’@,4åçžÉ7ÝàŽ}'ÔOvÞ¸®IW›d<ݲud:XuÖ˜¦x²ÔÏç[kh-£ô>a²ò€7 ×2êk�(ˆYï…ô¼Õ[–R÷sÔú ¹þÄüÇß¿qgÅ8Ÿ^~Ëeÿò8\“ÝË{+uét}¥'¢5~;Lnï' ~ý<¨Ë,ªõº/‡H9rÛüPg{åÍj¢€÷/¸˜�¾Ñvÿ?л¸PQ\ÀOggS@ì ‚Rl>Rÿÿÿ¼ÿÿÿ¸ÿÿÿ�ÿÿÿ•ÿÿÿg^e3öïÈcØÊ)Ú‘ó•M*›Ó ´gAv¾¸DC%�}} =Àác¦ °]ýìø×;ÅÛØt›:ì8ºüÉs×�¯›þë!Lèÿ÷ìWŸ‚Ê=ú»3¶ n%´@�_ï³�cÀƒ€ýè(ujørÌκߦ¿}àö‰ü^@¨<5 K`’t�ÏN„d€QE|ì‘éøh-š´ðôÝ@’øÔΆÂEƒ�™möl í‘­ì*ÌÕƒjPêZ-�¯I× ò’=g#fúŠÉKFÆã[£2˜˜>‰è­õ•�‡ôt ³¼êüJ¾«ÆÔ=�kb’»;’û}ä†Gª$Ð�Âªà  0Ù8ý•ýÏœè�áÝôr‚#X¤ÑjëDôŒ·Îf©‹bçWKüÉÑIje"úÖ¡/³…™IaS=º°Ì\—Œ÷”+„óŒéžÖÂÒ¹Sö9Ðg’A<–�¸\s$ÎÚ¢K†2ýüšœX˜Ùß¹:½Ò¼Ý°W‹u­×ü3Ÿ$ *Ió±¡RüsÈ×ÔÇSYç¿ô\¢+–P¿¹8ñèk+2²p7ª&öui5A†Œ4ç? a RIÄïÇÝÞ»›†À Oäßu ÙîôO{_Ê ¶_3ƒ¨ª!U¯ìE”a´Âw•?�“!‡†Â<Û5ò¼(+ã1¼ÁSo.¨Â©­ñþ¤Wç|oU—_]X–6Þåã,ÑËáeyþý}[�©WÿØŠb·Gμ­A¶d-¹¨È!£>9¤4*`Ô~�ŒþÇbê”ÝX�{fw?fv}•Øþ¬‰„W¯¥”Ùs;û«Ô¢î»ä't£Ôì–IVŸ}v"se«`èÏ-öÕZžéâi…�;qžGÎñ<±ó,g®Âï«|V{YoKûðÄœ9Ä]u¹]Ý*_É '¦³¥2N]‚x½¼VBݰ Ǽj¿ËÑýߢˆõPzqïåJ]Kã­¾¯>sî&ﵜ S:ñ$äŠÖ3“­Í`_–ÇSiê&ú¹Üâëa•�!Q¶[ïk«=îêh�®r-º_c^û~Ì#ªñïA"…ΉËÁ5ÕÐþ0v°Þ¢\ '®#/xéµÃÜôK9׃e¯Ö§ƒâœ5ªqÖÓ¦8¿žÕjßÅãù?•åxy¿›}rÚ†ÔªõUG‚ª5¾UÎoÜRß—_^Ïf¯nŸ?4³ÅƒÃC�^pÝýVõˆ�Ïže3ÖßÄn(Æ]¤ˆ�§l,û·¹§[éY´Ýªó õÇ©ùsýá‘ÐÆQ9nVÇt»ø}0ËZ½ŸØÛáãõoA§þyÃ�8 N?.Ôû¿ZÁ¤Tàáëf7T ¥n­\lAK!iäý¸'ô ð  @؉Ðoà~;¹ý·á¯;@­ àìPV^‡�l˜JŚΙà:¿ž *Tá#(ÔÈÔõ€º.`à»â+|Hšó$™ ñB" 0Ù1—6ÉšÕSaºšé™é1»Œ¿|Ñ3�åŠæó*\•ȯ¡DêÄ̳»Dªd$£•~Ì õ »0Åç¤wj¥ý};´fÂSùBàúDÀ�ëÁ"-6fØiÊ,·_gɪéI¤ÆÙÌÇYÒ'£Ï)öfzÅõçž|uÆ»5›ÉHd(%©ž=ëå¶6ÜÁÚÌKÚWïlˆ ëaàÆ$ü¿ iÇ›cí1zVg$¬X [ƒóBP\÷<0lmž~MR¬04- U¾GëYÖU¯K”)äDâp¦óœìŠÒ¹wzªÐ —EyBgOûV’õ!y`ºíHhk¥^Ù›!èÏFÑF6„ݧ×`‚úXMÞ“£Qe+ÄÞÌŽºã�$Í¡*·‘‹£8Á->·tSåœígÜÆÛ×ßU»40k§lc{MfAè’dÐGž�ò½"z•nÎûñë1­JÒMÌV‹ÞÚR Â,öã¶ŒêÉæ›Q2íB²�s´Ì¯Þ.HÊõ¬.È…ã­§ŸLïeùµ2-Ìíx_ðö|ÓÊRÞa”þW>‘\ãE1Ù,Î0ÚæõM4%o·f{/Õs¹n¿¶Jkj[Zzëãåæºœ=\ÛJñAÇ+µÚÃUè�!Ç«McÓÞ’›½ïKÝßNI�׌­Âþ$¾„òÉßwת�Ïä:1^{4;³­¶Ïy|¥~zûvyš×çVHÞì~I¶ÚÚѱ/�=ªß ™òœ…`íïåßCBq.ÊÓònˆ/l«áÕ8Ý‘ßîÁ‘ÚPzõ“f¿ÖžÍ«u«Äg÷ X•»oh—Ø.¢»¶=/e•jÇåþjß÷ÂÆØøì•“üqž’Ð;ÌêM~4ýÕÂvn#aD-°Q�ÿ¨NE:|ÏóVU‰ìí(æ,Æmùö3œ¿orY•‡#r¿Øæè¤ÑSºÚ_×;Ëu 9Òc®–vYáôCÏî"C®º³Q›¯Pçýþ·~ucÊ¿©ÛМg‘Zv޲™ü¯ô2О…pp¾^vyÛ#ÿ{_#(¯Aɦ¯/&¬é†ÿ| ö`½#ÀÖò)¿/Nìõ×´R•Ü}¼k€«ÇÏ,@øç/?0~,5a½êõ¯ž-ªæü‘¿T Òê#٢űþç§éV7”‡PêÐ<À; ¯¨ÌѾ?žRÞ™¢S�àI%*:ÑùèD 0°ã°«@øJ@û¸¨+DcR!ôî~Oðá&»ÁeöLeHI•�T† Èk‹Î#<ªôtü€éë! Êà…F*²{g¼úG6€ŠÕèQd›Ö®Ñ^SŸ)R�Ø« ¦£å"n*4%r$;¢JÐüàþ9è;€Vô*˜5免À<g¦¶ÔtxîÓÐ@çÄò‰­@/ÊÔŸMæ†ôÅQa¨h c‡ø¸PPp©aQŠ«ì¯Ãµq7#^›[Þ©€�{}˜h¡;¼fÒ¨JGòˆ+TšçŒWÕHÐ\ ƒ=$:Ȥï^»µµ‚ä¾¥�zñúè<]ë…ϸ©ÚS¨¡¥€{õMЋû¸½Jº�•}°w¦,WV€§ŒøàØ{¢šÞɤÐd"˸5"ÿ?ï=j×½h]gNÛžˆ�êÝø:—qhiQ.ÌZ"Ø—§B¤ç*¯µÙ9ýÐ4�“©ŽËu^îô:\Õ³Õ~fñä, ö’X(Ïi+ç¬b®3¨35K E­àË;‡¦Teà°Ò²›zH£¶$,VŸ–óìà½a+y³™¡U=ÔD_é6wX5›ò¤¡ac¤”Û/à”þ’ÞK÷è}¹úo«SBð,¬Ï¾†ë”¬¾$ÚÛï=÷¬�œ0º_âš¶*q@Û<ò0iœˆwl`<:�[9O½äk#¼¾�ð˜K\ F¼è¼$­¹Á¯¹!¥ÞÀ/Š‚ÛzÌ�£YgŸ´ì½Æù•Ø{‡B Vï·ììÈeª¢b¶%½É-~éGŠ¥þè·_޼+þ½¼Kc>£Ò»­¨)ûæ}¾oÌkw÷3Ùêþú^n¼¥Úë×ö—ýƒüz¬Ä3?¼·š¥ó"‘¸uèÿr¾IøXó7~—àºù8Ú¸g;Çù®†”¶˜{QÖú¾/Þjç@eò¨l9«lRâ~’ÿR¥“’ÿ)Þ;k½¦sÒâ0@ŒÞ/åÿÛò»:|–Ô–„î­º9ý°ú¾²']}šŸE«k• Œ–Ö´z6¿hßW ÓKMëüXÌáˆ=|BV_6À%lâWÃ+KŽd¡4¯bý3ÎG.ˆ¶¡TgvÿÃs^Óg6fiC¢úNÛÍ”ì×±ÙÕ87¬ŠkH뾬Ût´¹}ò0^U??ÍO)þú†!2«Y3·ð tWͪê¯u»wÞyÓ�ÔóË€žeKêOüÝ4Nñ²Šs•Íg~¥wé.hÎ׬Ó6hþ $0¨¡d×Ö1­¥½ñ%(zÿ‚Û}Ïïì©»P_B 7çϼܯ_婨’ ÀûñìÛäî•zð÷MàúÚ, ‰Æj¨SŠ£®_Ä–{ ž% È;¯ ð<`_ 6N“Ð@$óy1ÛNCÙ>Iô$È|²(®ÞŒÂ~ J9…; j>÷ªýÁ*šøS®E ?êòô*| Ô¸@ h^™ 2€¤$`Çlᔬ«iÇÇÍ.â2)ÙPõy2£`ÚxPûؽ ÐIäJYø.sº�þÆ»ŸJ®ÐÕæjßhó ¤´\FP–Pc®]³$ݽ̽NÜï쨪y¡áƒ¼]Ê«6OøPFÖµG‘I“᲎¼š—èÔCaOcèÊžÇiü(h¹;{î­úëPú‡xË ­ž|®7oˆ�eÁÄdëÆ¡Æ?¡“ˆ"ðî/ö îmÇ<¥ÖOЯT:\.ªŸiyRÆÁð'¶3�®ýÉ¥˜ù× 9eIùš)´½zh÷Å'µg½€B £~sMZ„S+¾×vL�³V)ç7rû­hÖ¥ïµO’nvìméy8YÉYlÉ›Œ™\µHÎ2yío¦³>³£W€ÅèÀûV‚öÉx¨O«¸¢ö£^Í7³ˆÁèÁË­‰CåWz€†i¯š ÜrHüüBy…cþ=jCM(YþÞÿq@%k»=&íeè[“OMEAØÞ­ý%K9×9þÚ·Õ(õš¼ÉmÁñ¼+µ/«vëÃþ£KÔë²´Õ7r[t²ìõjÜ’ÞcûžÜ_{U ÅB—Äl?Ítä6…�lœÚ ë·ÿ'¹U…ìb_ÉrU ¿ÔèwgëÅ^´bå{³ÊÎàe»4PN�7õ„žÑ�û` ªÆzï­³³¦O;ƒÑ×ì‹ rA”°!¯ ÇûoAi…öh±å°_y[95{ V8ɱ\àÂ@oydš(RúÙ¬´˜J¬­�Ûß|Ø¢<"òÖªýÔþLÖäRË­2ö¨#¯?“íý§äßœ½E)é#à÷–?øMK[RÆõåWŸ§ÕòXüJióžØwr³ 3OggS@“ì ‚RICÿÿÿ`ÿÿÿRÿÿÿ?ÿÿÿ(ÿÿÿ¾eóÄïÄcHÚ.R‹�«lÆþ�¹‚=‹±óÿ€Ú½¹Kný´¾>Ò‰ Oop@ ÿ55`+7䦃x]Û@6zr]øelcþt¡"àÀú~÷ùšh�‹ß6jùá:ÛRJ g.ºâóÁ_-ÀÝK€`ÁŠ«êßÙ„HúKÆÆÙƒ;4�è#hÅ{6™ �‚4ž/ ž„ ¢(ÅÀÒ”  †.€.H« #1wn.F<�ÄÜPA»E4i‚áN¯Å§ø5AÁ׸EÃxÉ�€RÞÄÖ�}ƒ†“Åz ¦ìÆœ²adØ}~´ö­×t‡ñ±/0flR¹t³¥–,”}ïMäÔyñø×€ñ¿¼.9oš³U¿Ôñ± /V�͡ưe›Ë¯|&[37ßDöbÇ÷(ׯñtξ›n_Öðªý¥~ÁNBÁÝCüˆ¶×ökñB0› � �T$<ñº”+çüæ–Ìhg|½Úi¬Hõ+³L­¿eï)úú ix1£ß:’ݘ­WçœeP…—]!Y �ôïtLúVÅ‹ú�ͨú!ë[´Z¤h¥6 ÅLR}$ͬä£D”÷N!û¯Î§W2ìþ�Þm0èT N“$%G�,ÇB³uêŠC=’û€²½$S�ãW <�]ч�¿Eª†q–̾¢3»¦^•W.I~}!WEv�²@fÇJ4˜¯È–BHE!$ë{ÍI;-‹QÜ<ÚúÕúx]ÇuqÞ EÄŠT2nøu {ý'mXdý¬É~œö☮¸Á¾›VuZŽ_Þà\⃠YŸË=ù}ròàX)Ôf”]!¾…~Þ²£Új¼r‰°_eLJۄ½Ívñ÷èõb³³Oj;˜ÖFSÖ¡Å/\6X„Qý ½.>ãlSè»èã"Nª¨íêe·Il7ºõ~ÿ¿´™�ÍïõV¹õëO¹.-UCa3ôÊýzþÝ ²äïÚ®Ë7%,›öõëðx„ÁL· •›/â§,©1­l~£×Y¦åu³Ù½~áõ‰#ù¿êÕÓ:Ƥascüþа¹ý&�˵‘é‘ÙG:.·%ªÒ?í¯)‹éyé^Þ™g…€¾Õ´&–¢(¸RÐ¥ff&p7vëÄOê6de)¡ìÜd™_é¯�6ŠQT8_wò6"òËQ#‹Ú?…L^×~Ãv·øòŸÏ ¿°õ¾Êg(¦ói XCbþwVnÄ÷š@îõîþx;áL­¿Ã¼©ÿ  yýùŸHäO&:URn|ÿtÖg’Áƒ™ÀvUâH6NÃ}h‚¦eë üP*  @NxVe�"<@(ÜW)€‹SøºÜ4p ð¡iâûì�sO{-@€¥ÔÀ R Øæ@›•¤~öVŸ¾R›Åw®+OƵ $÷@[˜z €ùQINZ}¦â˜¢£'©ÚW&o½ž:ƨ‚ëΡË}Ñ”ƒ ÞßÚLØ�)}Ç ¦Å„þU^ÜZþ°Ø=Œ‘ÛgE­‰ë�ЛäÌP„Œ cô÷÷òˆ»ñâN§ãáñún—ø¸ÁÑGæP;+�$ø5 ¼0år(Mé™ýVOè¹U§›;´ìº~§½»Ôþ¾òõÇÚ¡43óLâõ¢BLuõ£S”ªæ«aƒzD]‰7¨•ÆO”pF%ÛG–-ÑÅøÊçïƒÞDÞ ²õb‡Áâ )DÃ?õ…k! �xä«ÔZó%Æ÷ßdžBéôâ/•aÆyé€ jÈQiT¼íÃ^´úyc_Wöœt\„ÈŒ Ù\Nú�“+¯‘+�ïÏ a_ñî-o¢û—Iæ0ó-U"÷Íô}£ÄWþn²c[ ¾“÷µcŽš��«?µô¸ô°_£alý_ïQÐà�üQ]šÌ ÁßtVÄØm¯$Ý·Ÿþ[vêKô—ñºHRYc¶.Oþ'q)ÌA8¤¨oÆï‰®ûxQ°'ÞßÿO;wb{Wã•Cˆ¯óE1SÙˆRNá�ûl³8Œ_ÔWq[~ II¡äQÈ8©÷”��ÉÏuñϤZÿú&:U_c2ó˜”íëáž;ÆÑÏá4åÃj^Ѷ5i¦½øçö©níëòC_yéÛWS†ëä¿óm³�8—ÒV(=¯·Ç¯øÊù}m lÓ’SsŸnÌg…¬ì˜ì!ð]ÝTþ×À�ë× Âj ¬ãè±›òß®?]ü.pÕžekêWü¢¶‹§�s”Í…?å\†¢œB”œ?®õtï_-Ø!�²0…úúµ†Û¥ÿþþÉÂT ¾ Àöæ+?'ÉðO�K1観ÏuKàõòNDÄ€÷ϼ�” æ«iúoÛ€¨õn0³„RZR±×üëWÄx_xM€KÞ ÎœÜÞlXqj{R@"™TP. š (uI. @RÃK@}ꢆlß~˜'h4tÓÉÝ d|„À) (E†Î3“áÿð_ovïWgèž,‚Éì¥I«²–[{öåíÿf{ñ:)—ÝÅ^={>[4Š� ó‹¾íИ/æd=Mg°ØûñW5»7\“ÆìËöZßJq‰§/"ƒ�_ïEk^„¶ Õœ™eîNÄX_ðþóË÷ÊÒ”Ô–F±ÕÕ¶µ±C8‰33ß.§—¥-ÅT™tåÚà|q_ç nþ�¥º$ÑîÚb^¤Îq–Ã÷Cɸ ’MIŸ½°ˆNóû³¿ ·m…×��á÷ã¼™Vfuôy®ßùÜkìD¤{äçz/ÃFY‰\BVÒŒÞ ¢IùQ fôŽ2Ïfc 2Š/;æ…Á>hãÏM¡#”–poQ‡fqøKf�¯H�“ÆÁþ�zû¹~äËluìEn#ϼ�Å+Â[px9Pæ!ìw€Ò›‡ñ*×¶õ‚’“{ ˜ûa6‘\ﺒG¤Wí½cÜrÊÿvÛŒ|ÄÒ‘9*ö#ë­UcüîxÙˆ/j�f?„G{S÷¸”-^pv£:™‹³QØê_••RÖg;Œ”ÏÃeéW–JÎúXäìÛ(«ß�{�j¿cŹt#äZÎ=p¼ø×'hhâèµ… ?X{ÿŠ1¯ ÂÜïMþ-?" eñæ5˜VßÎIû¾×§smýœx o¿ê‹¿ýrjóá¼AºÊ­uÊ×^rµ9ß>×?¦ßKr[~ò6ÉÊ�0×â‡Ý—¶Wøl“·a'-I¹´7´›öxÞÞý‘þ¾šáw3?ûûÙ )þc•-­d�ÑA"Ãã¥ìêç»ß Âþdsüwê]Qv‘:ÌÎM6þs7Pv! Îרoö–³ùõÊE�|ØtÈä} ñlÆôl†™¼è¨,y:»°eÔ9àÛmûû{BG\ñO´L›ü#œ|©$ €pý1gnK¡<¤ÀÕ@×ÀÑ6æ§´eu z€£0èQ  2œBy…ž@xPÂãBAA `A³Ô ™©� H†À�ŸGv@EM ]ut²Äæ¬é2È$²“x%¬ÛP¯k¦f�Ã~Ô�óÚ%;kc“q�ºÞ­ó�Ò+w¾*bñ“Ž4ù«§ý[ôÿB³ƒ5’þI7R<PÓûd½¬4h87Âz]«/ß Ó>ó’Ž[Ì ö¹2B.ÿ9ý´�Ê^vÙ´u¨,3££;NС—p²À9ùa£^×Á�>XŠ¢yjB�e8¿‘ìÆ6þ6`ÍZ PrèŠj–’ÊN‹¤ç. KýS4cîï? %—oÍчIº’H*zôeÒbÁ!)¢(¶tÊz­–Y%‰P4#ÃïÝöóýAÐöešÅÇÙI^jÝ'~“ü\Äœc ]µé T@ò*Ù ¯-tí-«õ³ ¾zÁqvÌãAXØÈ}žzY[°oúoŽ-£QD½Ê®_’út)óÍ.zä¯ï«®SŸ™éùÃlCý“ ”ÕŽéÏíö“�ÁàQ%_ÝÀö¼ýéŸaMÊ/û^ x¡õš>_úœøk¢=¿¯õd{·ŠÓJ$·¿×X~òÃðýxû6ØÇù‡ï=›ÉÏ©˜¯Ú‰îþøºvÐzÂaSò϶·=·å}ö{¾ÆùõÃÁ?ÇÂm|>¾&iþÍŸ�Œöù¬­sˆj…ªZM§3¬ÃR¾Zú²@ªTu©|žeKÄOôv s©eç$›Ì~÷µÌUh§JοîÏÁ­?7û± 0Œ�ÈâÔë¯wxªp1@€ûÿsj…›éØ:¦žÝÇÂYèû|Ll¥´(Õm€ï×wq‹hjí…å_ŽyéDþG*ÂÔì‹ ä-”‡Pê )ëÞp*Q<@"€†\ àƒð5 ó�* þPC?øð©@ÀãG�/£ Ô(§’• cnÑݶ‹¨0íøB'§ûŠ œ¼Jg¯Ñ–übÃi¶üê'_^ø‚¡g—nU E¨<¤ÍÈŠÐÙ.Ý º_O_óÎ<¿÷Ü&É/Oÿéëé^õÑ,IH3&äÑ–8~ƒ¨F^Å%æ¬?@jùš’Ƈ¥kÝJéá1µØ5ªmªÍº²‚€˜ vÍ�Æ¿x0\Á‘p(2Dk;¶Õ=ÞÆ`HºkÝ �C�{ê—œL£¤$ñKð0¢ ‰B¢ó‰säL‹~ÄÅ#f‰:™¢²v9 ½¬€HÒ/Æö±@Àý(RƒoŒÆ ®ñ•ƒepªæñÖÛkD@ön·ähjè9^‘o›ƒÙÖÜ®£VëF` �û¬-r\�É>×yö°>ì͸�r\�ÄýÜK¯o×En9å¬4Nð>ï³ÞˆœïÛ¡~eÇ£‘Oq¾³Íè5÷÷)m¿ÌÒˆƒýV ÏQ%wÂ>×¼©•WñLÿXñSs!ÝR™#0y|'GèÉ–oäIø™Ã0Š>‰Ø²“±NÓ)ñ—ûy`˧¼ø|¿pÏkÝý«ì÷Óð�×5™o¹ZÛw7½Bt»ãúm±�WÙu·q¶i8ùÍl Ôu¦1^ùÇ×üÛü*¿Ë(þ>Ù<(n´ár]V'¿™b_›êq*�ÃÆ§poÛÛÖn꣬å~ýظiøY¯Ž÷ñÎÊÕŸ¼¸äÉ‘~6-øz½¾ûJe8àÅ2®iJ¿·{ûh�í'çc¨üN+¥k�±êîj¿Þ.ûÑ_­.ÏÒjzW¼Ió+ѾӮà¡®Z^[u+OggSM§ì ‚Rmvq8ÿÿÿÿÿàÿÿÃÿÿ¶ÿÿPFže«ÜwØ ”Yl4ç"Íý´ç5°Gçkvæûc/jC‡B2ßðàþ¶|"f²>ÿÕ†Ó€ü›tÀ–Ñ~SÀ1X_ëïÐØ×ÆÓ/7¢2ýø£“TÀÁÙ¢Œˆ¶SjËôQ =ÀÏóJ�'Äé.ðJÒ¡€| ,2€1á%@(à®(pÑ  œ’~ž¶6™â;�ÍB–ÔáŒí0·dÅ!7Ým{Š&l¸$ù­Aÿ@Î ÝYû-eOÂFçÝ.Ý‘½xø¨Û·6öð3aVŸFK±³kK ŠíÔ’¹²•?ùÆ:”^WÅÊG©ÞŸÕΘnÒé)ÞV]ª³³B©‹½2i 2|%×Þ%êÔ 6¥¶üvµéIç7JNÙ„Ýs>ËÑ'»t·N¸õ§bŒ�) e~ýj�$ÁË”µ Џ ~têEé;,Öý ²ÃŽ%øwÈêð’‘BâX+7Bp Ü 1o8YúÃõ­xñ.[V«Á¯ˆ}ÑÜÁ¿£ÆXܾJËëë‡ù«]ˆq-oîçHxŽí~È‚A/=×=X&ñ¹ Ùëa¸ -¡`ÇÀëæ*\²‡ðV’Z™þø?G^är4«¢õšÇD³SÜUô¶û¼EÖ´Æï’~  œ8û&ˆ  öÚã‹ö‹X÷GjävÄ3Æ&Èà¾Ô@ˆ j€Â¸tÿ±’dYqÙ�ÛªßûósÉëö´2T úÉk~/&{»˜õµ®œV5Ï%~ t´ë)ãM~š†ß{\^ãŽn'ßœÇÔÊ-Y�x·ÛG×sÍ T‡­1�®~è2çüY€büfü·�÷ìëùÊ�·§·[•¾2—N­ioKzl‘¿ROÛC‡5<T?«y—œ�S,K©{ ÏÙT¿úžÏúC¿¬ý„?ºä5ÞpÕº›õ`a�ü´Š�š?t�å\ÞydàWŽrŸ¸§šÍ+ÿN‘ºšB)³@ ¾d3Üwü50Z1&u.²‰ð»8Ó@:…8u¾N€|£éÇoÌ?…óxò¨°õúuaÙz‘ ð Àoï¶û«Þg˜·z ÈFpþ«ÿ°­“튴‚´øvûâºZ^Éø#ŠPy9 Ì,°L Ÿ ]~S–H8P€|ýDä|» |NÀ!‚*H.ÀÀ©ñ@‘„çûÀ9–€IË8üE—óD«zLJÿu‡µ î„*Aen(fžË†�Sí�-~ñV÷ÕJšñ ;l’³ƒÙÁÀ”êz’w§³2T6²¡ÅÄjý8×'Ýx8�R«ä5“�vQaYÈW>cðúž„X•ˆ‘ªi¢yæ7+}¨eÃ’VwtضÈ_ùìÈž»o]c/»L’,‹oÊZ}f²UDâÀ9µÓ¨ ™yEq~}ªʯ%2�ȉÈ@|�èÈ«[ª‹V8´p‚©“¸“A˜‡‚LE«·öq)’aw`¢ÔòWÚ‡™¥®}6D"SX�$Z¾†+÷ÛV›# œ\á;°(Àë]Šzvá�šÁ6Ú òlÑ·ÞíI�s�í FéÆ�9Â¥Ÿ=¸=€ 7v‹=›ülsðÕ˜csjÍjJÚ3RÀå0ÂÂÂwe‚›ß.~p{/~7øö²÷Üç5Ü ú]ØÚÛìäå³´í Üú½2X&õ$Ý}ûóX×lo›·½ž”’ïhM6åVå‰õø>FgÕ«SÏ۵£yÜy½óò¸ÎíúÇsYÇ–Íû@C^�ïö}�aå0ðŸëÖ ÞÞM-Ò:/?0%T¾¬¸1—R^“[Åãéò“ß |)%ÿ~µåq}½lü7ÅïG|ÔÒÇŸõ5o«|#¥<ëÍÓÛ½ hÿüZ3¾]e½.ÿf»Ð†Êí�b%”÷j þú¾ªîGSüó̦þ§›… Y]åUÀ C}ù*‡6û¢–¼?>>e‹üwÚg(š‚ì\dêwænæ,j\�o6 �C^ÿ"ß΄5ݾ`*À‰³}³ÿUúW.ÙÄ:ûàjþL�ïÿwýùÙàj:2%ÇüUô³î{ªìxÀ y|––�€8'€±Qßn Ün¼9Hå*‰½˜@Ã8•”€×›�=[Ž÷ù4ÍZû oÑ„54[ãÌ"Áߨ|k¨]6xöµàZ 4ö~�é‹yN‹3®ÿ¸tPø°š½TvR?Ý’¨õ+×^›û.¯ªÀ8qb a¼’³/¶Fj «½H«npMªK¸Šø ‚gLï×Åéu��Ë­mÝEQ¤$±Û¶ÏÏ´ÿqJ笄tnÉûä,‰,5/Ãsþy—M¿�Ë¢$%‡²Ð tØœÈf-ÒÇ?ju®Ø «áEm[‚Y1â>¶o—Dˆ€¸@Æ �áy‰£Â˜´&íè »Í_“ùìñoumÊÌëçÑ6&Ü.M‡íiŸ8m#ûUÎý”G 7å•Ï`cJoìÚ�ƒña67�Lô5»˜z4w=ÛQ¯ÕÕe{wùlT¾©žì¶“{;2{›™õ'Ìî«â´Ã“=™ÂÆØ&c.,ßêÇþ E·]£Ûà_ЋÁeVoÍ/ÙÎÌ�Žiõ©k‰©½oÞ¥£ßó)2 ¯ ˜b¶#áÐz[Œo_ýý¼êÆý{KoÔùÖþ.|äã²¶þöŒßùqý‰ˆë¦õ›�m'Ï!û*V| ï¾[ yâ�HµJUŒûºEIÆmŠw¼þüƒ%É~2Ðîe�ÜüÞì.²‡w9øj¾ߎjê*Ì]¥=Ä=º\$ ?øEÍ—Îì�$‘²¨š×ý î"3`ÃΧó;žêE…è ŸP½_.ÝsË„Gü1”i-À�âcÍã\ŒÄFÓbóI&/Šˆ†–R×ñ·ï¦»…æßq˃¼çͪk˜ð|6q]÷cs¶Û™ùð—]hÛ•Ž^üçš¹›R@mD[í s\Ôžñ[N…‹ÛÑpk®Ç’OÛ÷RZ ~Ú¶½J�/‡~›ÞyËu_c ¿˜*ùþ²_·1¬s&4ñc֊įºkŸ ¶Ä&ɇ½áu�·­«»Ö'Åîß÷ŽÛ kUm×ݬרNf½žÒÏáv]îeXsùM³ü;q9Ê'v£E×kÀ–3Oøª¦&,ô�þ-ìŽm§i ˜Ë“çäw^“ù‘4H”®ÞdÓü�"Ô± ±s� e~)� oC±*u~DTËkÎxÿç-¼@†F%§ý§©4ùöû¤ßÎH'м?˜hÖóçäv�”^ñÏ+·ù ­²^ö»7|]ÇÍ&HBi§òúžÏ®Ø 2ÈXÞì“sWþ2CÈuÉ£Ä2H šifÑÄÍ\P&reµ†¼ÕHÐÏ«@£™²�9cÀ)ç 1çR¥r–S†àôÏHÑM6ÖzUíÈn8�¤Ux˜ë{Ë¿ãåÑËÏJ›ö°~WÓY;ó'0lW¼¾Ë©fl¶ž#øèŸ×ÝÒè›aý½n�ó8_ O^QÓ©zUw‚ˆB¾ÅòPÚ'u”q-Ò"ÏD�"Ž*Òëaý=é;_Îïëz0ÀE¦ÎhlÞ�›‹å”Ž÷#~Ùj{—?ÓÈ>—9œÚAÜŸ=èõäëæcíÿÙ5Nþ*§ËÂõ�ÿ#U/Xtý ³ÔJÌ\òÊ÷T¡OQR™{ðº¼^�1\5�p€ ÞS{í (àÜS{í (àLB ÀbîÑdÛ“´›wžÈÿ´Ïþ¤ýÑαëKIQéÛ“9eukui-media/ukui-volume-control-applet-qt/data/sounds/ukui-sound.xml0000664000175000017500000000570715170052044024457 0ustar fengfeng flop 电波回音 /usr/share/ukui-media/sounds/flop.ogg clank å�®é“ƒ /usr/share/ukui-media/sounds/clank.ogg gudou å’•å’š /usr/share/ukui-media/sounds/gudou.ogg thud 回音 /usr/share/ukui-media/sounds/thud.ogg plump 机器人 /usr/share/ukui-media/sounds/plump.ogg quack 机械 /usr/share/ukui-media/sounds/quack.ogg ding 金属 /usr/share/ukui-media/sounds/ding.ogg clang æ°´æ³¢ /usr/share/ukui-media/sounds/clang.ogg gurgle 水声 /usr/share/ukui-media/sounds/gurgle.ogg fizz å��泡泡 /usr/share/ukui-media/sounds/fizz.ogg ttlou 完æˆ� /usr/share/ukui-media/sounds/ttlou.ogg rat-rat 煮茶 /usr/share/ukui-media/sounds/rat-rat.ogg splash 电ç£� /usr/share/ukui-media/sounds/splash.ogg bark 犬å�  /usr/share/ukui-media/sounds/bark.ogg drip 雨滴 /usr/share/ukui-media/sounds/drip.ogg glass 玻璃 /usr/share/ukui-media/sounds/glass.ogg sonar 声纳 /usr/share/ukui-media/sounds/sonar.ogg None æ—  ukui-media/ukui-volume-control-applet-qt/data/sounds/weakup.ogg0000664000175000017500000052167115170054730023633 0ustar fengfengOggST•˜ U�×›vorbisD¬m ¸OggST•˜ šÔRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSvorbis,Xiph.Org libVorbis I 20150105 (⛄⛄⛄⛄)ENCODER=libsndfilevorbis+BCV1L Å€Ð�U`$)“fI)¥”¡(y˜”HI)¥”Å0‰˜”‰ÅcŒ1ÆcŒ1ÆcŒ 4d€( Ž£æIjÎ9g'Žr 9iN8§ ŠQà9 Âõ&cn¦´¦knÎ)% Y@H!…RH!…bˆ!†bˆ!‡rÈ!§œr *¨ ‚ 2È ƒL2餓N:騣Ž:ê(´ÐB -´ÒJL1ÕVc®½]|sÎ9çœsÎ9çœsÎ BCV BdB!…Rˆ)¦˜r 2È€Ð�U €G‘I±˱ÍÑ$Oò,Q5Ñ3ESTMUUUUu]Wve×vu×v}Y˜…[¸}Y¸…[Ø…]÷…a†a†a†aø}ß÷}ß÷} 4d  #9–ã)¢"¢â9¢„†¬d ’")’£I¦fj®i›¶h«¶m˲,˲ „†¬ iš¦iš¦iš¦iš¦iš¦iš¦išfY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY–eY@hÈ*@@ÇqÇq$ER$Çr, YÈ@R,År4Gs4Çs<Çs@BDFHJLNPRT>’ "š™9Ž��‘’“”•@@OggS T•˜ ˆ­ÿÿÿÿÿ­­­¬©¨¤§­¬±§œ ÊÌ4öê»B6¬§�^aÎ<ì-›WÒ\R~/¯g?ý´žw8‚Å>FF¾û_έ�þ­§¯‚›Ç�ãxõˆþäËûó¼ÑmÏË–cþuϤP y½J·×ub5¯K×�µE‹lµÔ‘ ²àõ4hÙtf�ÎßoÔÍóøiŸ�ÑÞíÿQœ™ªªòJu%ÉÚ—ú¾î/~r×ú^3º»¥|Üýâ>ž:( ŽÊ1"†(\ëÙš¤¾€�"8ÈK…¤u]®t‚`©ÎEˆœ¨ªáÕ÷Wf>IR2eŠu’¬Å€ÓªL¨Î<ã�+é$‡^JY5ŽQ¨ëlŒµÄpžüîj-G9ÍTDJJ‹¨8;;ëQ‰ª.I†Î¡ä1ªã¼É<§Å—Më–vÛ�¯�Çwu¾ûÞºÖsWŒ—=7Dk¢Æ$ÝQÓÛÿ£ËY­“¿GmŠûíCú^É[EI`÷¬¼| Jd‘ħ(UWãê*¢­ï¼¿˜ÛD?�Õbø=Ù«Ó7úÌxê²"Ñ–=DXûaŠø¬¦˜å§(¥€·ŽôI阅çXáS«/ó¼×“‹Ì8vwÜyf�/´C¢b±Ñ‘Röãp �šÑákø¿uÌž]Ol?ßÌfU>W©ãOça+û*ÿóšF"—ðëzÏf”ŽÀLû¥ö Ý¡„G‹ç®ŽñÙòÙÏw‰l6ÍW?ëˆãÜ�h—Kú~ü§G–4ÊçíIwjòs±ÂGí%¶¬YÌê×Ä Š_Q¼ï�ðÊÅé-t pÍ2Û‡_?ÈF¶ÖùÏw¹Þý&‡Ì=¾ÛÁi»__ÅÐÄ;Ÿzµ�Ê_ÇRýGŸž7:Q;ö“°gÞrÓÌÀ ­I–Ý›;¿ ¹½VyD�@«ˆÅ,Šéo>®Ã™*ƒŠl¡~Á3pꡤS¹QM¸—_öÌÛ&›`ßëÑÅyˆ¦Güü&¥&¨°¢éoµvQàcïjµÃýUu¾*.¯ÓZMÎ$šš-md?ŸM$–íVÓÞ›GŒl#ÇÅ$5;иåÿwÕ‚åº_ÔçHÄ´L"96¾©9®M2>ê–¤[ïnà’¤ÃZãü£QÚÁS?½9ñãÇRæ@wOÏÚ´Íæcs&b<Ó$´�|WîØÃR®ýr°Ò@¶Ùç;J‰¶s&‡Â¾Y'~ßnD¹Ât÷iÁó ×nû«e¡µ¿&÷½`u'‹¼"QÊ‹î­~鉾Ÿ¬ðÚƒ#k*¸~¹³ðþ8¹*¤ûtYéÝyW•vøéÚ^²¤a=Ñ-6– /lòÓþú{?S˜ ¾€¶ry'),ƒËï´4˜y3åG©Y¼íUU±Gôy=Ъ�Yq®÷ê-x?¼Ÿã\¿¹ªK99Þ5oŸâ2ÉYÚx^ëYŒ„F)©¢»]Únä ƒ°u2� [ªûCJŸ7ÙvÓTÊ/̽û.Çù;ü»C-ìæ¿ê²Oø(.{´]à¾ÁN?T ç’÷¸~ßUQo-|O\t§'xºVÊ�Nû雞d$ç…Ãô8:ûß³×5xvëåïÖdËtþ#cíÍõ{ò¡y}ÏÍ¢fp¹fÙƒþ–Nm}otÍŒê3‘ºÊó:¤93á·|œLý¬óT´Ašr #=­ö*<˲×ÊRŸƒ )F‰)u6}ù�áâXªF¾—z�ÉqŸ÷Q`â߇×6ÐÁ)Ï_ÔúÎs‘tC­né’-ø†¬xγâB¼4\îú0`Âá…ì[ õÚ¿t¾÷¾É†e cóÆ+}„j®=XvçxVz÷åíÖyíÙø/Ë„”z£¿±Èº¿µq/¹ùõçJ~¾kr�FjUd®JÙèÁ€&eXá·8#éÈt9[b¢Ñ5²–Ø•/ìDðs™ƒù;NôH2/¿2üÔ&Oš„xÞ„ýÓh«‘gàÃÝ�]V؂Ѡà.î‡T;é«Úz›½5y—O \öÒSëBêÕæo~( ©aÝ•÷>îMç›w#Ž�w'ßÇôε^õO±¾î·èÝuN=«·*‹¸§H;*º—ÃCvôRóÊ8œb’‰W—åÏ41¶–é¥àúVæ=à�¯ºY‹Ž_¹ù3‚Ṻ+¢ÕÎ ÷PžÔ^Rf7î4ñWmиÓÑW#ÙpÛñˆœ!©„úð—ï©y}¾“�?¶·ÔÁ°jFuDêÂMÇÙzx·‹äÙ€%¦„é|½ðøÀ�(×›_G&³¨uo=?_ó0xÑõ–wÕƒÒþu»¡ £œs]†-œ–]‘²÷*—tñ—íÊœµ‚cf¢é†tMÒáÉÀ�(öCåþ­NX•Š®œk[ñ_pRŒ|hÔÃãJMHÙÅ{©Ê3AÝxªEßfMŽl�þù�áÕëÂ.Šé]J8»dü—*©¿²ÿÑX»éËTÓ3‹þB“Úgü2¨pœž…'E‡ú|yöfyz=üMùCmi9ÿæ=$^:/k½².)FßÚÿZ‚xõ¹çßÜêjÒ»˜&· ` 6§ö/ô{Þ¥·FRW|¸Üí†]š¾ñ`—8ߊhÚg¥EÑýpjg®·J_ñÉÃ/â&-ÃYo»¯bl<¸eP<¨6±ËWOvVî¯áµï怙TâÂHž+¬7wõ Xš+»ëå“ù?ôYxæ½Å@†MÜOEÍûÛdŸMd·Þó—>‡âV>KÖßZ êñÎ2_u*ç³ä*÷‘O-ýƒªMÁMx&ýçïæÙé9§îœÒ2Ò´ñ‘)Ÿ/!Ï“^b–ÚGhnæâª¯‘Ù›î9‘Ý­œ7´l,>;Æy õÙ}«¹ E'ħµìÍÉ+§™üO£ŠÆs½<îìžý);¯ z™Àta�ŠzCµ×÷ZñðêpO7êmû«÷<®,ój˜ç¿á±Qž¯õñº.‰õý:³ÞïsÎI“ÆyÒ¬�>Ñ¡”E”#Í&9¶ãÿâͰÖlçRj“Ì_8gð ol¬ÔËu§oéRCྜߪ9Ò™ªgÈ;—ëùŸ=á—œÊQ ·i|oýìÀ+¯ÃŽHŸ9ò­=yò÷3f`� dö–Ú/dêuÛyë Í’÷€sõ8zÿ÷oƒáž~úªx7ï}üŸ_Ãùø?ìÞ#å—áŸÞ0½ÿãÖäÖáG×¥.,Z׺GÜß•c0G”í Ñ©ëQ«'G&fõÛ é@¤ž­jY_‰ð¯¼” ¿ú@=ÿ¯«†Çsi÷˜M)÷ãªÚ{+�ÆÙ¸Y×ÐL¥E¯ ßÇ1©„¯¼þáQO÷ûbpLæZ0XpìË[ L4™À½Îû&ß<†~7ýï�ñgóóM¼¬Cã~qý¢P+ïý~7üË—÷/G^ß°ÿæüÛÏKõ›}ݧ{u¤.¦jVÝû˜¿ãöxµîÐ;ïñyÜÑ­§o¼·)�Û—·FïñŠÝÍ“L¿pÚcwô ã¤í¥*úŠšíþÙNÓŸæRu¾SÇ{ôÛg¡­{¥/è§êË©þVkÖÐï' $cò‚KØt½F[§ŒÛ¡§tãs—×ÿý?úù×e85>þWì»—?v^e£õ¢{gÇ]>u³öÞýû£_¥õßþô0 µ•—l7«ycë®øã"ðòôâê³?[_ËUÃg‡N ¾á“¤$\Þ!{‰�µ´¨…©5Óg\ΔáEg�Úk±œéø¾qSzþU_åÙxvíƒañÀL;ó‹9/Ô�²®ÛøÌü)Èß:�îL¶Ã ÙeF×åæn" É>‰]°µø<�‹k`�üô¯…à¹þ6¸–?üa{ø¥ö«ÒÅÇ\�O›è€êÝíúµy÷Ù�89wâ�žïÒïËO¢ƒÐŸ&Õ§ÒÁ¬ÇGœÛ7-ÒýwøDºNƒ!nˆãæê~cZÇO³d+3/²âúýceG‡^¯ù¼œëÄbÜ8½èÓ°ú\Ø@qÝe°þHóäq¡s{甆żé¢ÏÇŸÝÿû—³›B|;ecÿÖG™82ãŒ×þ´‡èð—QR8_ÇüB÷_�Âá�¿|’ã\ßåh@ˆÙc-yÄ:Êl­<,èN‘â-£¸aŽã¤êŸÔ‘/RÕÚÙÙ‡µý¤15äò²}äêÜgï©aʉöÁuPRóE'p¹IʺÕN–«ü²±,×ûàLúb5`1ODmÇq*mA‚BÄ+D Yí6«"Ýþý?Ì`Úòàl:«c¾+õñ� Ðëþ‹¶!·þKÏ÷¸-Zy_9ŸéÍÝgv]À BëQcöfí׳L›ÂsÆV÷};"œêéÞ0*Zƒ«�P¥ÐE†óŒñI1Ø3}ϥ鄜2S\²ªj&»í¦[ïÃn×ôјÍÚ:µV4cöp%ü–4Îýh3Jª†Öê¥õN«ø¸/��º¶vX«EY¨®¦óߺ¨ñW=¸~ùÈ�ÕZëõ‡?V*µÔ™ÿæÑméG}wŸçyžçyžÝÝòPOéã­�^źW®{T¼û!Š8 ­ÙBÆeµvÞ¤™6X„ç$²6Wí¿óýø#ôÇGù~n/@JpA�|Ü-Ï=²nD!õëëSÿ'¬CIPö'Zùçq”kã¢k™ka³è¸o†{µß¼¿ß, »õÐÿMhÈuÚ6 ʦR`û°¬h18;´±Nz×v/ ¾±lw þ¨ç{·~èÆ®ÝÅ/�­Å¨T`oyÙ±¥Dh ôôò¨åUÖ®mõ|<{zDß=n‹ÍiÕ{Ô«vûÑ ÛUŠ9*m⌋š£½Í©Òï[9Ô­¨Ý›‰ÚzÊÑ{ÕÛyþ´"º‡çÇuý»ÍM¢-+|—åEôoüÿë+R }À¦¥cøÿo›¨Þ�žw)Ò¦òÎ;ÝúM·ÿü]÷ÕOggS@T•˜ �ξÿÿÿßÿÿÿEÿÿÿ“ÿÿÿzÿÿÿ»Ú¬¤O¦?ÐÆ´ Äüá* #øÊ`[d=º% ;úlÐo?ñ£žv¶î€õ¯�ûx¯ÇçívŸ½/�oݬ'Ÿ=Õ{š4€{vl+õÁçOµÃ;ø¢ÏÏ«qj-�ñ®ØØ‰·�°JÞ<Ë×Wq’’BÈÔz`4Ãs=*Jm–|t0óØ®è¹æšï9ÕÓ‹hpBãR¸øñÀJ€¾¿4(@Žs!…>6½ kò¾;päó§[ßîsdà8€�ÀŸ �¯î»Q€¨¿Š¦@»Êu>»T)²€0EQ»*P÷Ý¡%u_ÌY^L©‡˜”ËOýüü{´ÂuW(×(#¬rJ$\õ£ 8/å�Ñ代�@Q¿7hù°Þ£�]ÈHNÃ.ÿ�&û¸é³™Û|›{Òž³VϺL4ÆG~¿R­þúÊ_<¹[š®`9ãZ_ÈæÈ=i®_��VÐTüнÛ㇃£ä=Õß#¾øÿþ�ÝÇü¥Ð™›cþÞÅgiåòZŽî¸WüªÿGÕ™_ ô¤¦§l™\B{ãÕ�I$Ñ®r"`™aÂsÅè€90:'Æ…’æyÛ"ü'™CM·ŸWÓá6„»*8Aÿ%©ˆ±Bÿg ¼ë¦X#0¿þÇNM,´SJB[mž3m4iÞ4†×©º�ó¯ëû2šìÜ5ãé>ܦue’ß›ç?îtJß?o‹9šáq™‹Ç§(ëó~X…çó×¶ëñ<Ý¿&?Ÿ>×ö×­O^_ïy¦Ýt¾ïtûÏýz¹¬¯×þ”ßÓßw5ºÿ÷ËúpŠT³¼Lƒ¿fûý³ÊÜr~ñqï²®FÇþ2Þêk6?—_1tñã=Týqßí»c/*‡÷TŸ 3ÝOc�õµ5Ìé¿»ºýº¯®ªºï¶S8¦k»ººàÜ�¯S¥sø}ÕPæð2ô˜ Ÿ,X9Y Í}—ç4ŸKëØ}Œ0(׳ߒC\�0š~±q˜ô�Ž6¸»{Mäe°'„ºçã@†�, aÊÀ�Þœø%–SÙ•Â*=4öŠÓöÿ‚1/g•¤Z¦WÁ"'û™•àÚçáT…û ÌõözંÆI�þó[5P¹¿ÎQÈ£¿\ØëSWp0×£Q·µ`¹ûê½€×Çê ÷hMÄ'ØÌ€àä@Ôv8Wö°¢¬WtÝß»hÑ¢†¢Eg'�À,wNY„Tí„"DV!¿ƒÖÛÅ÷jÖyïJmG7&ýÔÀXP�ÏíniM8~<ýv€ ¼ëË{€-ÀT½¯‘‡àvõk&ÀÓH,@)åF’$d¤…Ö‘ëöoŽúàÆêkÍŸ6CW3¯Ê%SB|`Ú»ÕwÜ´ã{âßÝ+úÆú®¶_Ÿ¿I´îŽÌýÿ€gØôÜMzø�»©Ð[нiïØñ�J:»Ü=.SÓ1ìÑ•W ü½¬øý%—‘[êÐĪÿ‡Ùð0¶ýÿ‹>äÐ'ߣ ”!&Àj©© $ú¾oþ?R—zÄ þß$ûã$oyJ7Ìt¦ýBožÄ§YÜ(í³ åÛÓÄ*pÌ_ç}þ¨6=˜ÿÆ·’xäã°Þ)>Q½û�x�E<èÛ¢VP°ÞÍLJZýésÃ÷9±í £ƒu‹ùñOÔ8˜Ÿã—k.@8ÿš¥kc%i½î/meëî›_]8l àB•qd�ìÏ»ëeÿ÷ǤÉòÔfz�›]ÅY”¯WM¶´��o’ú�mÝkz÷ÈçîÆ� Í)Ó:hÿ\WW——ûÏõ’×ÈuƵ›rU–^Ô’ðA Ðü@—ÿ¹^sÁ“dP�3po}èx z½(à÷¸”¢^Æw z�RÖÒtóvü:¹Ã‹Ë±¿ÃüØkȽÂÑ[Œ¦¿A¦ ¶Ûþ¦€RqªNWX»£l[cÞìÄ%2£)ea‡E]#bX?ÐÎ `‹˜I�ÛÎ ù„Ö0ˆÜàöéÝ�Ïî|Ïn}ûÖ ZoLеÛ»ïËŽøéæ ùÃUÐðY�$ÍÚdqÓíZ耼*MÜü¤Ÿkˆi¯; :7°¾)ÞYÑý �¿Ÿ,…€0Å€ñt{¥{ þÍTén¨?ºVàï,àmÜGnñ”¡xð˜X„M ÂêÃwÁ èïsV�Q¤šú÷Ç~û敟¯oe�Ä󀊻f$P€�Ú7ßûA³ÛÐ*ršúò—¢¦êL þ· ñqð €cH`Ç-â®çZïf?×=>UMù˜ºç’ Ë·/e:�½�²qÀ� ¿uûYy´+ŽšËuFšßÖó®läÒbª¹ø~ä­€-ôÎa…õ!Üÿú}Mú FÊ»†�UR’ ˆö}ëü2w…|ûΧŒΘýÖ»a“ ú­º¬Íþ™R/Ë)ÔÖŸñ¾Ò¯–½ÿ+x‚å•ùàzËMÂ&ô,^͹|LÊʼ›tön·D ¸þ.ÿ`xÖŒ÷®º›S "rE³Ùfð¹T"“R›änÿ³Šlô)1¢mTúz{®êq�÷3)S 3š3Ky ’�>#añ„qwûU‹@ÀÈ ÓúÝ–º&ßiÆ`Ïê6À€$%¤ë¾ëÑ0+Ñ�ô$Z4wöC8!š,V=‡˜XñóÍ]OÈL Á·°Ê7›‹1�+¸që»°×þµì°ŒæyÞçÕ¬Ïô³òæâ°-õD‚’ú–2"ùeŒ•Œ\¶™/^º× ô··1ÓÿäEÐg¿DÃdžk0¼ûv¹¼–•32½Zƒdtl+ƒ—òÎÂ5!gZÌ2nŠd9Ÿ4¹´Uœ&Åxø÷×s?Çyb¥¬roÔ‡´|U¾ñÓòºëíS÷M[«ƒ´&NºÂIzù^>óñ–dO÷ưÕ6�6ÇÏõÞÙ.ñqš?�±ËCa.—Ø­‹ëÊã÷çž‹ñÿü%üý*-°PÎ%eÙîød9]ÿþÿ{ÔTP¨ÎãÌèêŽþÉÁªi8–û¼´÷ëÆ—õ`Š�ø~ ƒaÀ�]±–?�â†1ªej\ë•ÑŸ$˜2^ø‹üÚŒX]<ú:˜ÃúRËf醭‰Ü±.×Bœg2Q~xÔ€ª ¸‰ˆ¶›^x ÜÅà ö±?¥juŸÒɪü¥¥Ìw÷ €Þlí×ãpÚ2;Ú;Uñ€q+5Ï©k¾E§ãsä52Ä?‡S"âqÉ“$YLE¿ÿÊ�÷I.ïÎø’Ð"þ=!»ÎÚ PÑ�½w=Dþãüߣ�œ€yèò¢€w¶-?ƒY„£þóØ €^ ËNƒ¦¿RrË —ÕpÏøkÀFþ»P4€p¾ Üî� š?pJ�WæDºØª?­€X;¡Í]Ÿì³K7.½dèñÆÇˆ[‹„�`³äûëVSmôÙté‹rô»Fä«jöÓoª,µ¦¢y.*ê[�Œd—$/tQOY¹ëƒðŠ;QEG“A/àL¹}û-[_}œ’$/»Yá›Ê›{ÅþBì1ú'Ðï|qÓ§¹˜ `2§"ç߯ü(¶ý«œÓÌzdÇ·èÛ§¶ï�£Öb4=¿Ð¦A뻺bi’Ôܺ2ðïgnt‚Öž&¾§p�¶*ÝlkGªŠB&õþD ‰Ah̽âøàpÐ.Ë‚/s qâß›îIUª„%�Ò츢¹[�^ߘ ¤ Àð~A pKxlƒŸ?•ã…ù_ 0�m<SHe&>è\Él�Û!"LF(ÎÅÛ ¡¿fMæÜƒd}Ô»¿h-we»h»9õÐÙf.�mEaC&<-£-K ¶L.#°mÛv ’I-øœLÍI´jæ÷ü‡™ôRS:–¸QÈ(Øõ°I"»>•U’«>³:›Ö·�š6-§çãRþöÔ. AUÔêam5Þ<ßÛîÍoÓL6”“‹Œ”V4‘1½Ýâ¨Öîo¯çyJ¢¦Nâ¾�üñÙ˜fÛv­âóq]«á¾Ùg€ú~Wá~½@ÎUòÊÝÚ†v6Ã?ðØ6‹M…û>Ô þüÉÎBž"üû oüø/�Jù½s¸ÐÖ~_¬Ë—c¡rû|)Ÿ.f®XÖìT7[¿š§Yû¶ß…e]VÜQ|ÓVWÊÞè›ø9ÒØ´CVæÒ7¢=­þ0�²m”GEeÇú°ïzÌšB…åÃ9©wpŽÙÄ‹våÍ/�Õî4¤Á©cÚ-Ç:]àAwÕN�þ¨‚hÍCGk˜õq¡�#�_1}MÝÀ �ÄíŸê¥`»Àîö¿ô~D!jvã/Ÿ7 \G|ú›«f_õC@UE˜ø<£;Ò@#�û�=û>ÈòPI¡èOÞö|Xpß *¿½( ‹@TÖ_‡@~<ˆ úÏPºˆ*Ýdð¨´BfäR)b¢QÐ¯Ž G6*@ìï�£–R!Ò‡±­dìW7L$F‹„y÷¡Õ¼üCÅ3‚T¿mA‹I8ò±&bèìc׺ªtkÞû½ÚJÒÑwa³8%ðq“;½G»?{ƒ¿—ã‡!Û·YK‘{èJߘFƒw>r#~‚°à3=ŒZÇòÐw•Fn¦Úk M™Ì®ÈCoqÝK'Vi’Ãb“ø SÛº¹– ™ÈAÈ�ÆÀSèWÌ’ñÅ.Ùèpc�üöCµíy™ró.àÓµ?<’ø[çÆ-Fq`ÿÉêÝï¥çƒNZ²û›®ÑÎOÿ>œk{~e _¬Ù÷tfó†=,$ÄSÓ³ü‡½¿½éÀ…‰â”ëüŸÍÍ…i*Æÿ¥¾wÓKnk½õƒ¯�ÜûÚ! N�}÷’ò&oýƒ¶dÃ�Ñß©—$<âñâÂúž;6íÅUŸG.“H3�ËÕó{¸=.Ïüº:¶«Ú–¥¨q±7!öëÓö˜ä©&m5ëk3¼õúXò2¶0„šäæG]XŠdª¬~Àà&M6O|þUû{0X½¥ƒ¹µãÌ’,Ë׸ÑSøeÿËõ*OggS@2T•˜ `òmpÿÿÿÈÿÿÿ½ÿÿÿíÿÿÿíÿÿÿù^ø«Êúps‰ü-` õH›ÌÌ� “°§6vω>Æ’Áº˜ŽÛ=À œµÝ|Ú…gB¯ÀH+ ð…O擵 È4( ‘²)Òõ›Ögã× äõþxÿè¢�KaÊ_ã³!äVEý£fW¤>²æ„x|Û³OŸøCD<áˆyA… „)*€„¸|<þ`8(àÅâmÛ=E "€2zrËñ€Oýúw+ôÝTÕÜë~e!Šj¥(È}­ Ó4©_¢E¨Ÿ� ¿W�<$ôaªÔ¼Q °CQ[Mœë…Óýü ·G ÇŸdß÷Ó4]5<Òšh­–�i�;¦NX•Rä ZÕ®µÂÙJydÍÞ„)¢Ëdõa“I!=k&-ì¯ü¢Ç‰Y<ç•«�Þqß=R[õB«×D×]’xµÈ\7R»�S­ì}ç�Gº—VUXôTD)»;;Å`üñ;¬Pâj?îðt=ß‘[²xHÜü«t|Ë/oñA³käÚ ,VeÛÏX;�‚onqïÒÆ½ t[3•_s…þ3ñgµ¡ïœ?:cb#‡ó_¬ñ‚åé¥Y}{ÁjawJy=2ÿÍ;ú­�¢ÝIåñ¥¿*ïýk¿Æ¨Ý–Ii†* ‹À ²–XÆüz‡¯ñ±¾£ò³{E­è Lþ—_‚ê½7ª�sT\”dI}ÓÈjŠb4gƒæ¦.K¸ëVúÎÄ�(Š@[�°�ù’röYHž´˜õ óoå‚~PX‘ihp…,cq£^%�{uª^Œ–‘Á|Gõ”p[«‰4{o�mü3ïäÓó4î†0feǼnz,‹¡ÜoTˆµã}·ÉlÞÚÓ]X�ÖË!¡ŸV++]h› Y—;j  …à•§ŸU™Å+Ý¿­jyÆZ¯Wðó�PÆÈªyœ>ŒùfÓ ©“ö»þ¨hÙÀ´Æü®:­{Ò9Çxæ<“ÑæÕ%[(Œx’×ËÿçàÇ)»tjòUÑQ…«Ëï>�—E*˜¯Ö×ï´:l_åæû8¸è|,¢mWõK7¼.Ùvó|\æÄdµUãâr¿œwÅÞß›m[½^å’î�õû¢ÆbK¤ÿ,Ôâ*ì €¾¶_mäþ}Mä,‘ŽÆà3´ÛÏ09·Ѐ[[sÚ Lßb³×Ñ{-#æ%Ã�Óžœ­#øŒ\úbMµ?dÒV»òP"Ž’‡å‹ˆz#-0ìÒn½0DdUÔù®êÂh})u™�D®´Ïv �È­Ünå¡Ý[W¨É—å_ß—jªBn6úç ÍmÓçt8E#0èÝö˳×�š:á z4çv¨Šu¿rt®#îw�ÎlP@_œ˜e¦F­%€Ôñ¯é‹;詘�iË› x>k‡ÇÿÿÒ8áÄOwxФ˜ßx@�¦ hXg@,h™™‰tŒ¸k${݉« ²ìn½ä€šê¼Š¹;Å\ÝrÇUhû¦«ZJ‚©–€î…»ÿÔ0\ÿ¨Ÿ5=¨ÍÖ‘�~(-ûk›Ÿ§ÆÉõ7CÓô�yˆ+‰x>—¢XØ¡è#�Í¥ëlØÉ8(Âìõ³Áóóq•p7+o7àp³„–xrŠ++Bo8 ¯|)ÁéF�f¼Íi¡Õ�õÖâßÒõÓf:™a§ÓŒwp^¼;˜½î©W?æÏ7Hº:½)ñ23û/Ps¥¬·8]öñ~'ðöKv4ó mšFñz‹ãŒL[¸c«õj²9¿óQ~Æ×¹Ý�{ŒíߺÚDŽËˆ™Ù5÷œwR5­í‹rÊìâP_©Ò¯þëüÍ*kT G•`ŠD|Q…Jý®½WôžœcL_š÷˜¦<ø[áÖ¢–1ˆéÖû-oÝŹ´ŽJîg}è*ªÿ昶>¿Œ*´¸ÓÖ·örDRRÃ1r‚�›2ªÇø‚dÒ5ôß?‹ÙŸ¾)Q€¾:=b$ƒ„ ¬ˆµÉ{⊱ƒ? Àj�¤dT 1JR‹�>ž �W¡»½Ž¿V†|à ³^~gÒ¨O`ŠÇæ§»€5ïÞr¸ÿ² ˆØÇ{#ŒE +_@%à«Éåï ŽÒºN…¢­¼Ã£éãåùˆñ>ƒÂÇ”[ôs¾¨)V‡‚÷ ‰ê~c>egDßGNù�œ²Û•r(ÍßÔu´R(¡vÈ•®¦åxRŠ»m©9ÒrÞn°ïû¡öÅsó¸cÌåkLäâÍõdL•M¯õòçõ Év¥q©š8I»áQn¿ûõfe­µ7��ûd89EmxV_Kâ (@U§Òxœ:ULÉŒ>ý@vTµt~ÊÎÌOþSŠÏ5ì‚@� �´«Ma€Òl%­QM¬«E-ëæfê³_þzV‰vZoÓ¡½ºˆ;ñ·²DŒXÒ{¿ç økáÄŒÁˆGßÈ�MÔ W±Üö+[£Z/©U�°M¸°T„SQ™×á—7Ï.¤=_ÔÁ¤mã¼³¯¬_Ÿk-˜­ ûW�Zè‹:˜—€»ÓñÝßý­SbF{¨ÓRîwâo¶–ï´„ÜkÅäèP×~!Û"å­åLýö6|ñ3gïÇ%�‚PT”x½U=WIjÕòñ~U½zMn€J?²ÔT h'kƒÔ›œP`£tŸÌ?Ffã‘`™¨ùr·Áv[€p%ÿãR4 @èÑç4ÁÝ4N½çJàT(x/}5àPkí¼ROã_ Ï1â) /?Î#Ñ‘ÿBæÅÈûZùyXV§øy¯Ô«õR¯yYEa®®.åYj¯ÒuCM½€‘…‹`Y¼ü—¦´ôÂ. Ûh ð�#Hq˜}ªËo?Ÿ„)¢ªøì0¢czuéù6}x%…b1Ô·€…!ÌMcç¾í�ÇÕ¤.^cμ#“ü$J¿Ý~·cŸÚs§t½˜ÊŽØxåÍu8mÄÒXõíKþtù~s‚b:…²Ã(ŒO�ò;JÜ �ËCò±€…·IêØ¤˜à{ïj?®ýÖU‡ÓÌBkõnµ[¿Ähô$:ÁO7O_>%îœff©Ð ÑÁs>«I¹¹U]µ­V)}#@òq!u޸غÚ� *ÒäàèÝ Q÷ÿ[u©ä´ HK W–’ ú‹¢»²ÔÅáéµ ‰´™çÝœ§²d�»ï!öŒШ\±µæóUh¶Ô·äÄOx„¹*wæx¡+pÕ0¢÷[Úô¾—dBØ1/„|UÔðL|)Û?µ¥”‹AúÍ%q*­¤(Á ½âB~•éŸe°rgáýþi]ƒá&úhµ¬²&#²_i¼­U"ǘ&Ïj×€ƒdqýÛÿ¿È¦)q>F(üóTŒç¨µ'ìg¼6+;„d”HQë&ÌÂo> Ñlµ«Wg}lN"{þß_qX¦åäå÷yÍ×ÒÌpÀa@¦ù\ÌbüîÜóžñ³Ê2 ÃiwÞ÷5ó9´Çä¶íÛ¯×|�éXzñ’yS+e{ns[eMç€@á"+¾œ•mŒø0؃‰GßHž¡~`žmZ¹ :i—uÔ].ŒÃ—Òܘ�cÐ;mnû³±j "hÇýG.Œ-lŒ ^Y‹'ß’*J9‰(Kë/›Žÿ”êKî,ÛªAÀËVÇ@¡>‚ÿ� ÄÄ[£Ö*¨ß%xf Çú âîTÉ E¥÷µ¦"DfÅåª]˜ÇîÀ®¬©xã[À‰k8Žé=—ï¬ ä¶Qñfó}»6�3Ž˜Up²žÿ‡�ýKé*ß—¯ð�ðœgõ/À¡Xp(¼„CEä€ L5ïE«"¢¼ß/:=‹‘f9}²¯RZœ¥M+¦á%¢V�<� (@-¯Ó´ZTUë�¨&2@$½©™ƒÃhª(ª¹²ïWöéÔÇn&Ì*çA5™QqJIÄ2X²¯y9¿=ôè’¿tÉϳ0ÑþüÞ ðo¬£]Ó.«G£Œƒ%I¥ÑãÌ›&´<Ô�@GH7– *î:=z÷œÓŽ‹Àž ¶–XVrë`_vÀ¾y/±Ošb*vŒká˜mÎI²¹„Ä{¯L¿l@>Î/‚ú1™PïÛÏ_\/Ç8­ksœôLiê_V`õ÷½åÛH;vçæÿÙ÷¸ˆ©i�³'÷^G œHiÉÌV³ôãŒr/‹‚ýíN�t¹Â—6¼sª'³¾õ',!Æ� ã²++�—ÿ©­kÿrRnàóð:㵄…�hõ[˜|Ý�S|K£ÁEE´4Kâ  À€ L:Êô{ÔZè§¡,—ÜhÊv9¿(Ö„¾JbY8@?t÷/;³²Ò‰·óóp™ðÙÚ�, $ ÀÀ ^ëÿw»îFrQ$"A� �T¾O¶£Ÿåm]ÄS'-§è÷©X¼»Y†zIW!ذžü[>W«àÀIZƒ†CÝ]Á îüiR¨“›0§í †geÂ.ZÜ�îø³ý†}Á;—;5—Cþµ²3‘DaQÑû7QÁDweN¤³ob‘œnì˜ígR;`2l%•ÖÍfRw2ðº:¥J‘f€¼Ëê“ó­Ï½½UÖ”Èe•·Õñ½ÊDÖÌ4E'Ëàg‘®á�èm06ø$u3è½93N톛¥ùøÙ¾û�1^3›:ošöü ‡m›~n¬Õºñ~¢‰¬ï·Ëõ5üÖþ<Çëu’¥2$ó €€ëŸ,ùz|Ð^‰íbÎ7ê¹ôv-övsývtQÛÚöIFôjt‘y›‘™= ^”¡lŽ ?I ˜¾è­{0Ì ˜üMÜ5U?«›G”é‡ýè> uÛÌa¸*>/<…óEüßq p ÑÉ î»n¿(4Eù°•Ììg@»ù>8nëÊþÔtP>r#ÕMš¤¾\ÑõÀù'ÿ^c ›†&¡q»Ĩá̼Ü/5^£¶§0“Gx5(@Î_u½®–5Â96­{€Òà¬z–”vP“ ÀP_¦5ÿþ*Z„ Që¯ÿçxK*,Á0 ,åuD àû�â€á�­ëÖZ÷¼hx\°Ô¨ŒTsÇ3XмÇá¼ûj­óÔx€Z‘çš[Ð *¨VarÏ.¤çaÇiúp„>£’€* JùÕA©!¨ÒÝç)Ú^ˆ1ò|ëÎ"Àò8�×î+[ߜ֪ÊʪóòxQUPýwbþðåç#:S7uxÓ@ú£èD ªªµK\~ôyŒ´XE}ñ¥–�úÄÞ*J«Ð3Z"JLAŠHÆüÂ…wê»ÚsÁjg78d®Ë-ýÈŸÒ3Bõ=šø† ÀìŠÃ�Œýªñƒkw INK íl™åiÒºòµïC~ä.dû”HO8Þâ- ºŒý?AêSSqù¶ñ@€)@† Úí?I/L ¿Cú £�uÇ•úû“CÕE-8d?±9}›|)B¶$ÕÖŸ&ÒºàeÊ5ž>× ›ã”G̪RK˜Ž†ŽeŠ €œÕŸüK]Þ_�Gàl)ìùÞÐlóÿE'�I=¡Ì…ïK� ÓÅ»/rEú%=nýùÇ8Ë©ã�` PbB³Ÿ:LÕ %‰Î4S�ݲÓVl)ªz*IÜp:çâSEaô{W©7KV"�xìÇ›üò²àíùêwQdî4ÏcqÒÞ˜"˜ŸÃ$¡ôvâÞõ¡ ·2aÖ ö<êÙòHÐh†ŒáJÌw´À/oÍtÔ²÷•íÃC ÌÿRÍw-µ¯Yø´P�U ®E7E$’Ú`u[X< è‹j1Å ð’—ʃUrã2'”&%úμ�k9?ïk§ˆÐ¼>ðIƒxEdgšøkö^Hi[¡Ùö !^²sn†TnPDeÆ›uâ½�ŠÕpÝ=wëïîðëwu3ÎO΃½}¨QÞyY¸äñ¶2ÒžßØ^ýö¾KõIþ5'z¢Œ—]Ö�Ø¥ZP*OggS@BT•˜ ìŒÿÿÿÿÿÿÿÿ!ÿÿÿÿ)ÿÿÿÿ)^Øká3Å ½‚>°sVæJjä>Åå\¾(q\«C½´ãè³›ts�φ@Æõ ØóÓû>åÕÔò[‚\…PÇ鬯[= w¾núP‡äüe,&òŠ^‚s"*ë¿A¤W ÙÃãQ÷o¯ž HMšnP�bïéð�Ôž XfÇ\{×?cUTXûs}Ýzµ§ãõ�Ÿ(Ž @ ÅÊ#�—ÐÀ(/hy‹0­Ok@K+"(e­—ìÅôA2èÞƒñŸ Ź–•z< @Õ:G‰@3 ÑiÊšÛ�ë´_î7çꆑ³–Ô”C¥Àyê^S¨­{梓 ûo˶-¯5ë^ûhU$K©—ÕÔéÒ¯êÊ¿üéÖ5ÀÌŒb\5fj�0HÕ£ "gÎZ�¾|þW´ôš•1—ç³û/¡£WÝÃõð °6bRië¼þ9GÓÌZë¿t €±¬‰×¾Z¾P™)_k[‹!v#‘p†(°»D*–X­UC3SS0œä×àÈù_ƒÑÞTqŒ²âàÓG ßp(A絸_À=$ÚEÑPÅ !¨Ÿr©Þ± ðV97›žJüx6Åܱ»Tî÷îë5>šŒt¾‰Š�O¨d¹÷�-o¤ ÑjZÚ‰Õ(·Š;¨èã�‘vîVL4 ¬[Ó2î9½QÝù)²ÝÊ�üBs$·ˆnBá‡ó»TÕùc|Ö×jÔ�°2®WŠã�¯5˜’jóè²Ühƒ9[IÑ(sÍ«si,9Ó]Dmâ%Fÿ7¨ø¼ËtWEÆU2-äOô¨W{­ŒõO—iM:d@7–7ŒÇ§×û3< oy_¤×�›þr>Ø µÅÓÆž9ïÞþ‚Óür¨ í%——½{Òb ·Í–š½›œ+) Š^B¥}RIgO“~9ýB,66F/©ÕÃfL× à–ÖîØö§=ñ b"ìSŠÕ^CYßR=šì hµÿçg'€pîwx«?!9ÇòY\¡[UnåUšT±ß°ÄXDr†JükxÛ¨P›3‰ÿ_'�Î’LÆ8%‘@ư—îËÕ’‡ !8„VŒ�ÿ�ŸNGúåyšé¯O…e¿ÿÌê~Ëá¾R)Ê´ˆ„¸B¹ÿo¶+·†Ë’Ó˜€)¸Á�~rj˜ý—Oh0›õ¤ž[܆ŸêÅöïËZ ~²eñÌÄ�Bjž°)ùÛ¹g€ÊßîAHŠufæ!UöÙ·1Gtòï³z Œæ rDȈs­©³¿}s™¦Ûó„×@¾qû«wíJ\\€Ó>Q—\pôÙX5n¾п~¡cÂÓ¯–\É­ÊðÏR+àå¿; qÛ²™Ö§u^ÄXcj »I§Èt’¾è ¦tP]·cQM8lÌùÇ Pê׆œ~¶'Çîl†^–�=ÙV$ª ,À»OT¤öWU€¡(Ö¬Tv*ˆví HuV40Ó�ð’ïg3ïw®*�"rZÁ=ÃñLõ–Çuhaj˪<HGÑÀ’è t÷å ÃÓK‹Zó¼4q¶DDÅxzÞED@…5Ž˜Â àŽË˜D’x” ÔètŽ=D 5Ž`ÿíÓÍqgÙtO-Æo3ªøC‡c�¾�µÉ…Æb~~,fzD‹’¤´Ò4bšk÷¬Í4$蓾իàh:e­a{ÇÔ× 5'óc‚à'KÍ2¡#7ùÊc�v§—�ÄÜSw¯›üˆªG†€zg³wõ�¾“ùHj‡ÔQùgIBûO·—Ø®ÇF™lâÙ–ñ¹=÷—X²ögG¥ëùiKnN9d÷ºQÛæ�vô/€m<~ Å}R8Ñg™@8N«mêß|&ãÌç"?<4¿{Lõ�y—›Û}p›7h½‰?¾å<ñ±é7×cPɲÛl–ùØ?oM‚íåÒ/ç%�çÄÊ÷'΢äEz$³'ýµãÉ„¯Õù÷+÷�¾> Û4ò \kÉð—ƒ–ä2hf€ét?ïöì¯aÈ|ƒ€E ’>ä†Hëj §óñO¦nµLi=dáÆ{g/ m#¶1�Iëi¦ÿZå/-×ã» 1s|0êú }°XÈÆý G…à�¸–aâø×È=†B]ä)"CٻʙÙ8ç6΀�ƒ‰窥éü»B·&v“>Qý‡u8êAULÛt;qL=æ „Oª‡]ó9c}_ô£Pç<¾×n-jðw;¡O$B¡³‘]^¤–tSO¼cêR‹"j‘¸~ )–VCÜ2§1>æk‚`ÊÂ/õNâû5ŠÜI«`�ãß;cá°DMÄxåJG;ZÌ(U·:/ÊßúüX0M¨‹üNÝëµ�Bi´Õíܼ.¹‘ê tx¶f¥»¿¾;®Bì#ͰÝ,O:~©ë´®ò#¢õ¿Gün²tÃátX¶ý#"Š¢ÌŸ®Ql›æ7¯‹ïñ}s&¸,Š£D­q>-£O×eëøBtªW·.! è6£•œlÖÐ »h�hh ×6[›;Ø×Ö¿€“¥˜Rþ=8¦ùÅøC5™Ù„3Fã©§ñÅ­H *^蛃K0h€Å_'_Aˆ˜á*é"Oâò�sÖ*##âÈpnò˜ÂÉžýÙ?®Š@D×­–È×Çߎ‚Z…á_}1( Ùø¬aã*ú[Îì qWC2z8€ö_¨z�„ÔççŸø+{M5¼|ýákÅÙJíÍ¿ä<+h0Yçîiý�>Pg¼bz­-5�n¨8ê©s$ï¸Õ¬UX]û)´ @1y™B´;¸„‚·‡¢‰(ét¯çyøóV-y¶*v˜n;�”Ç× àa€®sÖ@�3@\a¡=¿zì¾Í3‹ýš&Î=©GEƒ3Ÿå~y>CDJÛ\¡8Ù¾>@¡½6ªÀ­ `&�dÒ\>ûH@UQQ©Ód/ˆˆ(è�sorþÉ„Q•ÞzK†Î=Q@1’Œ[.ñÛF¤ÉäŒÏâ�)‘ÀÜ«¬®2™WÆêßÒâß®~:‡Çã;�[RLQM 0üúPJäüYéŘ8¨‚ÜæüLúRT‚6þ¡9å«3Ñôžçά.Íí(Ó½mÛAË¥b©®øM!›‡ªo´¤=¯çÝPÇf�u¨ÅeT3éŸè*§(ópHé&ºžH‡ÝNŒ‘â°;õÉÕÕšlûðÉ—œà¥‚½±þÃcHhõsä�/Éú-V¾p«ù g»¿ª:íM&ÿš¸Rž{‘~jÓ5}~݇Ô[÷JævJ8.iÓ}»ÝJí‘\ˆåw”Ûð¥d5š©Aiÿ¿ü'çº0<õ­ÙløÕÿ�¹ë4Þ݆Է(°«�Íçt�_:î‹–Õè°s`˼ Þüù²¸»�õDz·Äg|�S[ý·»Y°]Ƈ³@2¸·×ÑpDtD:fFß ŸˆÛynÅÂpBæ ÒPr¦ÕKšüŒ|Œ9ǯÛy—)W9Âó¥Õ†hD퉕 Ì>‡§iÎHer©­£ðÉ^¼!Š=‚›î¿ #d™ÌÅ’ÞŽfò¼2iP¤ ì<˜äÊj aI96ƒmsò}3ãÝw‚ ”?“µ5¥‡½‡»˜”ߤZSƒÑ*³£=Sü_8Ç`~=gy�T™Â–ç]ã~gŽPÂú¡”�¿#~) 0R£Õ€ët¿†qt,ùæy –nŸþn/÷®îr‡Y�Åý*`ºá@Z\¸… ¨¾Ø«Ê3®É´$¨ä�à™Ðæ<4`òw}ª*—Ô„M§��«Èüä1~½†Ù«n£|´~è=ˆ¥~è™ åO ²¹Ñ#è+ù~�@]Ôõ¯:È=€ˆ¦öõBÇú»sE£œ·"ZzQѱ›ƒ¾*‘ªºDЩðŽV@©’Ná~K½ Yjíz ¡•ÔLÁÆüÒ™½Øž!ˆ[V�òÄ�Ýa–/·Ý* *èí ´DDÔyº'Ç�C�W >†©�¿1(&¨<8;DËä2qì 8Å7 €J=¤²'ˆ…$†ç’íp¨œiÞ¿"Ä5x€Ž˜³$&öò$TTTë»ÎJÍ—Üÿ®íà ò{Ø€þ™Ï¿¾ó4ª¦ê ç;ÑQC—Þ)V¾,o,†‚ªêËÝgŽP…š!UæÄTɼ3P{}êÔTy  )ô*B‘jZçÎi_Q`„=P.`!"Ÿå霪ô0grcú÷«vqÍû u3m1âš +Ýç$Ýcëêé$CmË�ÐÂõSéІ±nŽ÷«Sié©Ð4*zàRû©=Ï5¿½‡'i¹í—ð©Áxülno>­È_3icô>ÞNeP¬_ËJ(§ë±wJ ±€ Î]¤< …¯DeÿͶ֥8/mÂ6]Ék7 I´¿�-ö©„Øf”´ŒÿOÄu÷üx}­°;¿ÅäZ¨5|î�µK¦¹õκj)ÖÏÅ®_rŠÏ;w­½I—A¯öú_U�£&„C ¥{ˇ×"¹ó˜‹‹ƒ%¼ÉkøÚ!FŒ�Q˜SEÉ:wl{NÌ«q†W¾È5vŒ F–¦5à9—r˜ðPS"~ A«=J¼Ì¦n'Ju~íý“%ä-«ÆBЧ�°ÚJâ¨àÃT`mLñ}D÷%ØŠ7(ømqk•Œµ­�ÞÛÓˆ*µáôojχ3œ”në’ €Æ’1‚/bTÁ´weÖ¼³_·hQ±Õ­qµ¿"BŠŒÒFxí©AŸßÈ}5Õp%CIªì¤h†‹ó†×îßœNü]0Årkžîã) ÐÜ~z;î>RÉWo ’O´*J�qS�n¹ù ô²"i[­bL(ï«õrcá=ݺ‡ÿŽuø2üfæ¾[´SHð?A�Ý›Ôëš[œËb%9ÊyÇØÂ1bùÕÀué²^®>¡º &lÝ”ó �r_0ðš�Ö7ð•7üýù2Š›#Û&¹Ã`‹(m;²ˆÚÎXÜ*„»¬>Á¿uŸ]“ÂF.x.æ×„ݽ–F˜:籈­Ç†È/Qf–LSçºã!º__›}¶=¦ùÍø� îÙ3ÙK*GÑÙÑaY,ÁÑŸ¨ÒOggSST•˜ ì.Ú"ÿÿÿÿ ÿÿÿöÿÿÿÿް§¨¦£¼ÞØ«ä3ˆ‡¢ÚLò"øLÔC-ef B`ÈTÎc¥Òôiƒ|#,Ö�}½Õ}V¥ÿyäìhjÿ«mÔÑ5§ø¬#nlÕ_’´·Ž úáÔúhSÍNo�×S÷l§Örî¦[Pékk-"Âý/J´¸€ õO¯º®¯‰<ê^µBÞ¦¥Ùl¼EuÜd©©Å×1çdý×µ.Õ›¢Æ1…)@ôƒðîè °¯ÔÔø9¨* ñkîßgÐŽ¿n^Érã¹[1U165ò£6? ÅPa!€ˆ…ÄŽZE;ëò®·¾R$‡z˜ÙÔ*ÍÌSÿ2ÔŠI¯K€0­µ‹T¡¸À* š Åzgv5UxjtÎ�ÐGÕ¹¨©(ðYU3cÑÀ©µV‹! Hmÿ6­C­P10Í çq} QÖTµ*Î"ƒŠ’­¥-¦¡JZ¦vWœk�”5�Å”P- t1,²¬ ”�‡�„„hb¿[ª¢ÒX†%¥ÿVLû˜Ë»s¾�C¢jjŠHn„–?J«¨ŠjFçU: s€«ð^-ù[iÉ÷ë·¿ÝC±a¬Æõwù÷”q),Ú¥MŠyÛ¹s«ÛjÿáϤ§'˜âø[8:}´©™OÎ-Ñ¿~ÃJ‰Ã[¡þùŸ—q1D1ð@·�)¸‰éÃ�~ùÙŽ«ç¿ÇMD+ î<�elk/ ¢ |Wÿþ"¿,y·ßqâj¡¤ âÉú¨á¡2:–­qsÿ¸v\­Èp>…Q6 ÙosO4 ¡”î%Õ²² …¦¸²M’Ÿ9\šö~öàööçôÁbTyö5ê‹!ÞÁº£3ó\McEG:¯@ЬW¤‰);¸ù(÷¤3A8éM]A‰Æ(PT¿Øž° ßÐ0eÿuè ~(à ŒÈŠp»b(\d«êëßP}Pò=QÆS÷VIljô>}Ak5y2½o¹’V:']w¤ß}\# ѽøˆU¬VgJVÑ~GÌ’Àzn¢)0 „iÓrŒp�>wÔÜ-YmìRsE”ÜZFeÄ #Š„q·áo!ûí�7åW¡+­+sJbðZ‘Rì¹�o ‘`s.IÒ¨vmŽK=q“•J/uŸ'±B{ŽÁÒþÜ,8Z1‡{°ÈANÇã½ì2_¨ 5m^¼�…f wJiã5ÒÉ© Ч‡ñA}V*xÖ†cW†Dcûw]¢ú5NSìôûÄ™^dziô®¢ä¶ÙbÒ Ÿ[핾îÂÅÿò}ÕN§ Uæü½vö¥Š¨@e³R8SU0Xh0ºÁìL)ÌRª†¬C6·ñïÊ¿�~eùªÒKSã¦K}¥Y÷œ™T™DšÝÍ Àwã¶âÞÕ{¬¹Ø@%pFÏ ¨… ¶(¦Îµ}Bki2Añã–)?¼1]³)¸Þ*”ÏÌŸ¹%©k–Wؘ߆áãñPª@Ñÿ—ÚõJ;Ë\¿rÓz„UÄþôÕ$28lß8ýóùÎ)d‹`åéSO¼‰ºŠÓpÈŒ*”jßýæ´‰PYª*µÔ³ß§_Ò;ŽÃë'¥Cš,^T;Zj°–?TUU•FʹäãsTíö4åÍW UŽ´X¾Ž¹´(jˆ•4®PUäöG¯‘¬höiÕ »—õ§vüæagâXç�“v•Î%¢Xˆ)@„i¨ZºFÈC‰¾¨ ô¶¢º.( ‚"ˆôJוÈIç’bÿ)ÊSqCE%r42ÓXN TÕÕbA JïߣöLÛå=yY ½,�C*€(VÇ®*d­>’žVÕÿ�ˆ!‚�ÎÊZ‡0³f38ᄠȈ›õ ñË£Š¶ÁU›ãW·ÂLI/$Ëçïj¿n²ƒyþ6:â·—WZ“ž›)læˆ,œ}ù•cÏ}¢]Lø„ C##OL4àÅ¢.›�‘½Íðƒ{ìBN¹NÇ:üy¿Úï+ŽÑm´gÎÑe0žŠàytZGúºN!gL7~˜#á¿S°Õ!aÉèv‰œröš{Þ:Xë¨a/¹[;²|y_´f­éL},^®1¤|-¾Pî®Kæü“™t§`¶¼Ÿtþ:Þ:ùoÚxÍ—=îÌ.¹Kù…ÉùyFïuÐÅz�@¢öFAP©‰½®ûÔ7(âÊñ>ˆQ±½µÆüĦú”,ÆY¼¨í®ø¸dA�@ffùŠW²Èª®š”åÀ v?]ósË9oýsÕázŽ>}�lN]æµP5v}2ž9É$EÌûŠRpÄþ¸³ÄÓ«êÆ;s®‰F=0$££©Ö›¨½’ ‚å¨õ‹×’ahT{uÿ×ÄÖkâQ�¹|Ô ªÉ,šêsÙ¾Ž£ jÚIoÚ<5l Ðþ¶‹q¿¯p7(ÅâœZâ}ñÒ¡±#b®A ÖŒÖ6ê# c2Q•Kº¸È¤ÁÊ­”úT88ø7EüšãnÚÈãgÿË>ˆ#ï’—�ˆçÛü-CïÈÝNùåzÞ»ã.ãfXöI‡�i@´äëÇfèSîè!=ÖîïVU Ógäï{€8n»Õ­n^Ïß~÷·¹õæöµ™7<�ƒÞÜ’uïnnè™Ïœv¹úl+=·›¨P‡Ò�ÝZû«/ý¼§NkOä7×RŠÐey.Úé×K/³ÐóÙæ¿STŠÓxgWDºË¸®Aõ{µ>á3¶†ën�“™Ó8<@AÄ­ëpCÀ@ADø'žä sŽ*ÐÇc®º*Kb?Ž»ÜŸ9iÂâͪ¡Ïæ(r]ç3�Ç,|f¿­�—QS…DK9ë‹¢T‡¹ˆì bvªØ‹˜Ôç82õ¿yÔ%ZÞâ°Ö új»×,ú¦þ\Ù=@§†CP~ÚnUɽ{ãYEéZôeå¤üjmb˜V‹š ]7z}i²:ÈꬼôÆ»ª·h V‹!f¥ºh_�6hý{‘d�""Ò}¼UFÌš`HzÇT¹½éÆÏ»yGüY‡¥¶0æKõ·ý,s·Mý.õÈ@¾9vm×üo�·[æf<ÕÀûŽÇ=îì>ž§ù’·F¬ÞU)î!˜ÒvâAK.j}<‚�$ԢĮ Õ•jl jEÆü˜ÚÎðëVTXÃfyÙLVûïÞ…ÂVÐ e¶­Êð™…ë�Æf7ïY•Ù]‹s «Ww›n×ÄêŽ÷v÷¯Õ ·ÔY…Fiº0‰ª £4ŸNœlÛƒébäîÌ|ÖÊõ¹œ�‰ÒÕy¸~ãu±o;ÙßvÙÔßÕvLêÚœ>þø_¦×ûstMyºî·½¶ãTv]{x»Úت½ã²S¹6õzs;ï-Îõ•¾OjWPÝä8àvXû'³ùŒ-ŠùÇνÄdÏÖV¿¼Ëä~<þÔ3£VôÏ Ë.ÁdRÿpùíX/ãˬ\ºór¥{Íùû·×¹ÈýÃþÅòŽ/Qà>Ÿúg­ï^Y"ý'Œäº?�«†Äo»èý¼{;݈Û_ù/à#½óÂÎ�KLsÁÛ#C×<ýÜáuM"�Rï·ø¯§)z÷xö0™â¦ƒŸ÷Õ3,)?9fÝQ—zZ:|Î ª½/à´¡: T?wçl¸ÛjùýÍ]{|Ë dòƒ©€·ÍÜ™�ãÓYÆúÁ:?â†Æ‡ûËH_OÝð �‡wný�ýqåŠ%"cC«³÷ŽÜåÚ/K Ô¡"Ue/'• S�²ôÊêI:´|¸VÛd€Àd•Þ0$ÃOe”¯šR®aqž¤ü‘Ril†Á N ŽŠ¸ÛsB\7]CÜâð?�*s/{�Ðwʃ·ÖØ©'‚gB3¥Ÿ5ø3®íqn,wͺ²$ŽãîÈ]Âɼ ¬.fb=¦_·”{ŒB–ëwÜ—¹šÃRc“ö–Ú—XÛ�cÐJ»xU‡�§ªÔ¦�È’¥´–*­¥Å0Vt5]—’Âjjè˜2ÞºeônWCµP[‘ƒðB”’~†¾[Á8š*V"» ¹=òô¤“:MüExœd ŒgŸÎ~õ¤|VždŽ¥ôoïèW¸\LÔñKNp–²TRÊ¢8�ѱ:fs³nÊgtþÌ“˜‚8/¶õdO­ŠË£’ºh0Ë­sÌ�›ý7:v9¶²ñàØÎKêü‡­ NÒ”�G½e &j„ƒ½\³×«¦iA`D¼8Ã<î/rø®…¸ÀÊt« âb»}Kg‹·Ä¤)½³Z·á1 pžñßožv+²H"ªap–œÿL ÌÎxÎÂy`ЄZ á-ÿg“UÜ÷Ÿ¤(Òc§Ïv®&úëC8Élöâ¦Ô?)®~GÉ|Ï„.L;ÀqÅïÂYÏzÛ=¯Ïø ºÄyìHs„„p°�n³x¡°ƒK–²ÒÅÍöú*Ïþ—?—ûT%íþiÛäÅÐn Š^9ªè¢Öšþ~ Ý­Ú>îZ¿üÃúÜ·¿Îþ›ô;ö~�æ—¢ÞoZúÏ� ×ȵ=²=ŒÄªyö´ÔŠÅæ`3œ]CÓjµZÕn:Ú­ªbq’Nœ8±ˆUM«iµŒq;ž9úï™ËÜçoܾ“Þß/ºkŸl±‡…‹‡F�¿‹É%Á ‹â�Òk ´òñÖ”z¶t¶†ÉCŒ# çI•sâÌ7b  ö·ÿïš*Ú»ü¿]UOggS_T•˜  ¬°ÿÿÿÿo±§¬«·¶ÆÆÊÂÆÐÌËtæFB¬.3µ`Fþr³y.¾J7NQ÷Å™£/jc+v¿g�^ˆ>þiæ»Ó0òæêQºu®‚F}ø6-Š©Ø¬88ªb±[¬é“Pq´Ù-v«Lý]§ìÞ‚¨ozÚÕ©…=³@¿äàŠ½7k��ÝA®åqÅ0-�­TË•i\".WŸc)ï¼0ƒ‘@â 8à’s¤Õ\ç‰AÎ%œ]f/^N|œÛûàÐÁ£~lï³åãCÝ\cFŽÕìmµ£?t<õëõbÿvÌz ˆKê·ç1ý´ÂÁpºÖjU«Ý@{¢ØLÊ)c–  î4ü‰{ÅñO¯«”Ça©™ûîÚØìûÍTj‡f¬V2Á¯s«¼»øhí?“{ú§M’ÖepuÐhŽ Ãx˜xAR“7É Ç�2>?üùoòç«Êç±â¹ÉÒì%¿§ï?Ò´-8Ÿà‚ª9ÆeÃÇ×Çþü#Æunã–áÓù$×°èµßœ¿ü€í²1elˆ�ý-Cý¿n¦õuO)õ<ô篌¸±\ÈÙþÏåã-SÓŽ[ء๿°ûM»þ0�d&Ž¡¯ zôÖ�þª}æ¦eìSoû龺œ¶Œ|?"ò�xÍ”ÿ=>äÙÚȰœé‰µ¬ŽÐòña_>¿UÍY“&I�ÁÇI99k;Níã�M_}R”[';;]{ÞN•*5¤–WyÝkßžþúÅã=èõ^»–µ•De�Š Ÿž²7)* B.s4Mâÿ3O«€€¨Šæx…¯¡fQ½éÌlôöÝhŠ;èq—zµY™%d ¨®Z$QmÓúe×Mž2R~‘g‡aÖ¬Ô¨Ò¢+¦×ßaueÍÊb¥•65ÕòëÊtœ¨îpª¨±õ´‚‚¨ —}®±XëeÍ»-¿ åE†QcYŒUc�E-*æ8¯–­KêMþÏ—Fk„móÇ™­G�™�ÎVsíêm¨±j,ñì–L—¨˜åWS±Š�L'�!I@‘—–xZ,ÎùU>n+cý9–siÏ�úÿiçѯ.ÏΖ¸ßßõ™\hTß8ÛÙÃòœ¯~Ü«$M[Ú®©£|þµ4…ß…£/Ÿ8¦ÿÜ´½�ïž˙^¼€ä¿+7Ùóý·óþ•oØIÝü+=öÚßòƒƒ.ÆÍ`šj³Þœ™Kã–ýÆ©�.‰sÀ�V³oØ!é­67:Ü·Çh-,ÕØ20j1—èÙœ�ÏXíBûÃMÍ.Î}öLd{Ý·UÑɳúÐ…ç.•qʺ¾}Zqƒ( ±•±¯œÏC“†X¹¾¾®oïÃS&¨+ B0�M ë{yÀ•\xtºÊÂD+™ ÿ“ŸÕu½vþ×*¢JUÕS×û븆Œ^,ræÝKÌ7$”®éxÙsKåò7:>?š`‚(fU³×MÛï£ö®{âhBôn#Î:=÷v¡[h=DDßmVûQbRiALÂ,%»µFû}½%C﹌î©ü¿ †Ê�`ؓ۟�y­´ììw¨rxT:�möa¶²¢\žµd9«þ¼œ�ѸÒM-»2Y+GþQª/4C ›ŒÍŸî^nÑQDºm¡:â'K¶]ÏÙZ–Œ³øác×xîUáSOý1 ŠAº�ÿåð¯{în¥îöb{ùcº;�÷û'©TÁK˜/l›§/¶\Tæ\rôüz³ã÷?=éRaÎH:Ó-̺c\1ë(ùα‡SÝ\*^N $¥“¿YŸÁ‡ÖÕK¦Îƒ d÷û³ srY©ž.U§8]êQÓv¶†yÊ)|—"3u‰J'f%V�ÇÏÕûü/r³�¶ŸD~·j´¿ú”m†kûóë4ï–¢Wöx¾ì¶»ZëütÙ°yܾ‘1G®’µ:<÷¼Ý”Ó b÷/‡¡ýgX ŒeT¡/3ÍxoÍ@|Àá§„8 Iq5[)4 îuèzéÚ¬û飒åG¯ç8ñõTùGêÿÐ||©Ô‘í:T)éýË"ù"³ë›¾ëì°¾Xt‰ ©Úœ2‰óy âć-bü^YÃ럫…„ÆBÐJ—ÉjRXž­ïHÌÐõøÏÍTÉoO¼3cZFƒøÌš£E«uÍ/¼v^™z7ÿÂæ–úÏùÌd/ñWWþ²ÿ–i®æ³1S³ÿ>LæõvYlÓ€Š?Gí«ä©ˆ=’StÏÁð3ßËÂ*m¤Ö�KáãÍÔŸÓ¯9WÞoïÒ›¶*zçú;¯Î‘)õÙeèA‡.¤�¡ J¾ S::X»®é—û&ßÉUÖ¾‡;¿+ý8MÞðdx˜ÄÔ/5y�òL/î21Ð>dXAxöðްK<¯F—˜va4gˆwi:û¬o%NÃâÈ�éþr_‡‡e¡‘ âÔM˜/èÂVÛjT»úB/]¿Ë«?þóÇ~/©7ÍÆý½ä†Š\*yÃçÏw÷?2Ó²‡Ð ÏLJ¥�W-Bœé=ó UN '�á¢gÙ€@A~–;Èw¡câÈçžÞiU|šéìã[n.Là?–þÁsWÒžý;ÕåªÛyJ{‡ãÑžY{õ>&xÇADeÖ_ÌT›Ý\Øø’�š\×Ö Ä3SùÚ–°DþÆaÀ7“ÐÅ{ì¹ ˆW }ík,ïF>]T¨o¢l‡ZÔoø·n4ÇÇ_‡¯»ÚÁ›Ì¾¹]>º™§ÔåWftj>ä ¼O2-Ó­åçiÍ4 T8¦§zÊ46ðd1/»Ï¾Y´^м%To׸è,‘稦¨B±k•­z|x€bÆžÂ|ÓÔõØÇ�ÁÎûüŽeè¯3ܺHºfÔ¶¨à 3¸aàà2ë(1á:NÜa"ÛLÜI÷£ç?ét�8Þ€šåFp§à£æˆuU-}_ßë&éÿ–ÝÛéÝ‹ºlüÄíj׿­£½{é�ezáÛrQ{Uº¯Ù«:gNì¿î€9 vÓ?Ûs§Ï° (œ�¿›þ$eÄר¿ñQ¯Ù¿žç×øÄi‰Ñö©ÚÉïàkàKw/©úÝæ}\ΘQy ›]ýÜ�³Å“™}ø1"_‡qE^ôÈDÉïÊ›·ÿíi?mÝ]Yc åj¯±ÉYV®oñ§²zm¢”ÂímvüW?|]™£Ë?ùù¤Æ¸^½èãùõŠÏ^Ÿe<Õç¿ÿ“è2ÊŒ´N­_³k”?:˜Ðzæ¹m {Éïê°+SD(§Z¹'›[Z½<§æÌ”W|Ɉc」凷½µ&Øv޽éŸïöÜ„´ Ÿœæ'Ð(’xõÍA�11Ó‹ÃäôñÕ/ÒßÕql/výÁÉ ”:“ý6¿Ÿ\¤˜&’‘Æ¿5�Ijóþ¾ï»& ùê�/D1}¼5Ÿ¿&àl=i…˜�ƒ×}á§ÿ¸½Í,ǧöϽìµÃN7Ù¿ýü_‰ÕÎ~4LÖ?õ^—ÿO«Ô[>ö%#eøC†TÕÅñ•ÎÑàN½ªÊìæ’KBZއã!#ßÙ{ZÔÀX·›e';û®�Wäy¬£ Thêy<á9þ‹†px…t_Ð[›¤‚ï¥ßÑ�_…8áS]`5ü‚½RF—Lè‰Bvô»OóŸ¨1øÂnoÊ÷ÌÙ“u¨¿­ñ<-oÀŒ3 ùl�åM ½£éßOÏ6yyôÃøu�3èÉ °Ug¬‹s¨£Ï?ñúûü�nKvu!4(ý#��‘­f¾ìgþ?RXŒ„ÕídÙ¢×zE_PQÍŠr¯Òô0m!=mÕß…ɳÙQ^�EwܾýålWa°³c¿¯ÌÑái㨠§I4³‘<š¼Rî[{ÄPÿÐ8Øú§îµÓÐKÃk.öÇä·ÿ™A¸ÂÅâ~†Æ}h׿üȵî?¿ÑÔ®=åY»žµ³öñYYw×8㛇÷)»ß¹pq…É^ó«qí«ðö5 î×Ä÷¢bn̰È9|”ß>ÕË{#œHàü KÅšÆgptˆ¤S7èï�Áª”¾ß\tYÄ(–ã•Ïч) ïÿÇqnŠz÷ vý*í¥½„×ðxáêzÄV‘D; pø‡-¥¯Ï�žù¿ß�_ã‹]òÝןþÏó>êOù--rú²®Ãõ‘ýüøz­//^‡Jnv6kýã6}žó¢G­ñã,g'¼¿¢©Ç0±ÿzÍÓðümæë¯—P«lÀ”€Z½*Ÿ8Õ«6K“ˆYýÁßtXÖ‡æ+ׇ1{s¹²À^:Qlq# l­«Œ\-WžÈÇ]7¥éÕ/wº›]�N.wÿ-þ§�_¥áø@“3ÈÏ;ßšÒ:éão¯á]4Cö„dÖ…XXä]C×üC)¥× ö¯·¦Ýÿ¯÷~ÄÇ ×/Œx�|ýÇÿÞê¿Âj¿Å†Óܾž×ùæÜëU‹>�Èóˆ@n½Ÿ?¯ES·^q›Z3­Ð®çùïI·&Ðn¾º�¸î>uo|¤KÍØÄK£‹‘Ïa÷t¯'5Ô^t~ ×Z«IS?÷6T¤q�ÛR5$ê‚›Sò¿Á˜Mwqzš¾½Eh–ž²47ñœ�Ï;¹…úÖÈM —ÙЫ=—Áiý/@C¼¹Ä«,w¾.ncÓÄ÷ü+ Éä âÏœ:‘h›æ(‰¿Q{ýå¿>~é�Ü«½x{ãË-ëÓ§­ŒéP¹îϬ\ù[§YÍ£„.¯ êÑW›ýý|ê|õ÷W ©Ì5—OFíœ#¦Ô°º{èÐ'%úÒ¤à£Í·ÓÙr«²ræªZHÙdC.‘Ÿ?ÙÙÎíåˆ}fÊ5R~�àŠPP‹rþ�˜žÐ¬^Ù\ñæ.yó°éË{§l¼"L#L6Ó¬4OÞÔüÄi{Ò­ÇB8WÔH7Ôøü»úõz½åj‡õOâu‡r¶cn{¡î6®>¾ýÏÿ‰~}h/ç?hüз«#wYçü¬Üû™Þ›ˆÿþ"#ùçÓ9÷¿vYƒÕ ]��,y‰v_ÙÖ…u\¿Ýzc¾õ±z¿íN_ï5Ã�Gõ‹Vy÷ëüÉíç-ƒ..‘Gw\6²Ùâ;¹Õ|…�œÕ›³Å æ A¦¸'„8ᅧ…b' *àHšo¿X÷ëjýõº¿™óÕ.H{ÕVf‘]™ÃÔ7Aó�EϹçÞŠ9æÞ/¼8ÅËof{ß°›û OggS@lT•˜ ðnîFÁºÉ¹°Ê´­¬§¬«¿Áÿÿÿäÿÿÿ‹4Ýêký®³Xt“=Lü ½n¬p>÷êîý¥cÃâ·»SsÓ›µ–›Ô[ˆüŸhÀõñ‹¦˜ÿór�çú¹T¼Ø7n…Ç´f½ÿªùÔLâ¦X” e]@ýÉÞÏ¥²ú|•&kM.½šõZîj¾†Ä;] ‚Ø™+LùQéã1‰™7¼œéÑ浑@¶ðU‹a:QÜïˆ&÷v¯Y2åçT-€íñøæñLÓ�°¬qõÚ½w´™>­¬“±_É0u�¢ú|öùV?s‡Gz¹WÀ™½´#ç7KëçHiåqu O¤ÉéÝå_«ã ðÉÇGíï§8ã¯ñ…ŠÓÒütŠ¿"=|–ÈôWŒqd*M•< 㪡‹ú'œ+q(;ô*ÿ¥ÆXÐN÷ûrü÷¶ˆåÓ·/lÿ¡Ç�þO ;¿âU(Ž_€W�;N—užQ\›ñØöÇaò­}Ÿv¾Ñ(À sœþÝi¡�÷ïŽükÐñô&úv J|s¦ù²Ù{�k¢PO¸&Äaê¬d :N$‚Ž?»È_ðeñ‹ðÎ<_æYæ5¤xpÃLó)‚)Îò+Ê-õc­Çô­ú¾=®ëͽªÝù²;~«ÙáAõoÎu(Ä›OþB*ËOãp~¶þ�SÏv=dé·]æPæénþó½åæ~)Sý‡½�™_lW(æý‹õt‰%Þ„ÆÊFלåñ¥ ¥�/äÏÏNYôzxñÓfS.�ý‘¾©sw²]u¨fŸï½;ËÀdçú8S¶;º¹ÏÛ:±²ä°ù ™ØX Ÿ‘†r–[O«¥84 òÂɬS[µ¸«öt£$Õa#Oý ljÊ="�$”â°Àº0Ïþ|öÛ#ÿÚîý×&þrÅûº�·ôÁŸzb]âÛ¯F¥kï&­î^¸¹Ê­ú×ùÓ²n¼oñ`‰lÉçîʪiqεÖ «CqŒ�È<ÂÙšn‰cZ[æMÄs^8}4{{ ã;æQ6�~.\†­í›,ÿrÿº³!}f×éRÄQT”VºCÔÝ8(òòÙpoq†g�ù9-ô’r±jÝN‰ÿP½�o»ùµÅ:Û4oÓÝ ÉÍ€8çß°yªU‘ºú?ʶı�…éÉ¡ßâùbZ#[Æúà�=þ—ŸF•/Ž#ã}7úo§FPÿÿ®Çã3ÿÍÌ roáò ®È”¯  ®H¿üÂ4X{1Glá’}Ê÷£ZG)ÓÒ©W*†^í•áv÷6TØþwëüZݹç;¤âÇ»£Vàu~5bqÁ3gúx\jùfS$±WJœÐº×CîyÅöˆ2åøÖÕ¶¾ö›I³÷ôh~ƒ ÉÍÞçüàn‰ä°Á²ÿ†R~ÚdäÎä ÿ~9‹nº‘§”·j;}ôYÇû›øgyBÁoàm×0Ì ¡ËqTÐC(z¢:Ÿ¤ €@yé²xyNÈÄÖÜ÷rÎ}�sëɳ¸Ûë~âÚpíøöTwK‚™½;/ÃÄ4‚†,¦¨Ð˜ÿ°ª^OêR…—§Ôuõt“n�aG¿_Œ~�ÿ¿vCe.›sÓ|ÆŽãú á›yÖ‘,39$Ï nëúuÛ–ËW ËÈO Ô÷½j»ŸÌ¤n½jý×ßáÀñÿuSÜ×Àpª LÍ^“s{Iãä…øýüSÐÇ'Û– ŽÈóEðû�oÏ) Ú·ÞglFó7 fÄãÌÒ½Á:mŽTñ»o"±á3´d´„jPôp�i·Ö1¯œUo…—e–vž-5Gþ9®â"wÛ‡ßþês{c]SÙ@ôs?ˆjyw+)Ø›íÍìBg®÷ÁVç–�4›å5pM°÷~«×oå„A/Û …lÝhþÿ„®Ôƛ˜â™þöÏ?u³ã¦æXK˜ z»+DBz�Ú‚áôù;Ûê´|žle½vÅ\ÜoãõwÞ“ ÙÃßÏÃôq�Ashš÷È*ucÿAô/ÿáÆº¾”òæ@±õ§FöÏ>ô‡ç!íï§iÕ_¾r3æ_“‘Ex§B,Nö(€ì¥Nz>æX—õ¾ÞÚ\öÈZ×é1þp×H f’Ö[œ 0=Ý7šï 7}S²èŸXo¶½Ð‘=ˆ>ÎÕ)_–<õ™eÞjî´ K©§ŸÕÏLv§ÛhþGgš ÷…#¡:PüòÑC§¾�#E–õ ÜØÓ YçéiBNZtÁüéûµcÿ¸ ¶¦ˆþ3üYý,á-…¬O×ya¿8ø½h˜p0€ë»oÑ#•oF^0I©u��œö-àVrÎ>~ªõ»ëèÞÌ?3îEöçáu¿¥uX–T2ršKÛ¯cÜ–;µ[òT©o•_þéæA»k×Ö¿ù&ºRÅÉ僯+.É'ÏÇöR4(„¨AD/Þ¬/Ñ÷š`þø¾ú: æÅ8 pPò € -Ým°.Èúï¡¢Ì&¨’?E�¾µ2H:�i-Ú ‘º¸?kÖ«'Õ­Ôì¦O¡|©vð D•‰(R‹%ƒf)… DÛ£ý¶ª7>Œ½Ê|Þ>½¾Ò'"H¶ŽÄ+) @…cr,ÿãÖ Ó ïŒ>_‘8bd×Ð*'Å;EÎ8ãñx£>=¹Ý{þ”ÞáÇVãõý©eè¸:Žlg²�ºÇ·z�‹|Õ±—Þ 'ˆŒÍàCþ�‹°8=«�U©8ÉWyS÷!Îæô_ý§&SAç Ò"Ê([�{7ÿbÐÓ|é�âÍüm¡§�&röL#�îÄ�iô&¢ÙmÁ~(oAñ«»ùf7p½V ’ae\cØ chÁ§9óëþ½ßÏÛÿƧäP<áöøÕl±äÕüï5½&»QY®zóö¾Ê*8NÞãc„0*!ý<<ÖÐUʲá×} >›úö$Ê[4ò—i�ž L…ãMP:‘ó˜µ0\xŸ˜& (¢@ŠÀØÈ»ø“¼ûÅÍŸ×ízœ6øP?>«ÝÚÍ×¶ë7ùï»å#æãêÏ9JÅn/Ú\I?ÕÆ¯ükÜÆ£ÉÊ>½~ÇûÓ�—m´ ý}®ëýÖ Û´¬>]ñ*N»ô[¯¶iÑoھϲÍöxÝþ‹mü¨.Z¥EWþêSzúݲ©[hï‡u`’“j/p{lÜr8Y¥U)ç*WyÝyvN¦ .dF G ‹S{x9Z¿³�j¨ÕÓG�î1=ÇÕÙés¼áýñëcæÑµÃfýÊ^ò“@Œ:ÊøL•\WªT~ìêÚ¤7;Ä…1\£sÄVêÓÔYÒWÝ$fò™¡æ3<ªÖ²gÛímgý5_îЈ…K;/õ£8UŸz&Àâ±óï@ÜV�¡fû·ÿ=VýuŽ0ߣÈ;EïE*×mËÍ ÷욥Ç_íi+¨RÎË3·=ù$VÇþ¼U*¨d`—誗YÿÚ»‡MPPp‚¿þà P ³¡æ¦n<þ¾<…¤yÓ>„úù‹ïª€‚Nƒ™E~>TZLaˆ ­1ÔϳkU1 Saè-?è½hmqœ¬¡!�ÕQ¦<šEZ –wkìA?ü_o/ýfÍÛ¨ÔUTä¨Õ*N¾v� <@Up wÖ,<ÿÞY2²¬¤³î¬R¸aŠø…÷˜9ò߉ð°ýáë ™Sä¦1}iø\—ËüÖ|Jo\žOÍEÆW#æC`fgÈ•—è;©¿Ãý¶d]/ߘ&7¦ÈÕ…~(}±Â�vgb+îûU5Þßkàk蜹MäyÜþÕïÓqŒÒW—-0­Î4®ìûï¾KÑm-Áàš#m\gY¹3¶F÷¦]ÑÜU¾ý(4Úiʈ[ý jö>m& 6É=G¸ óJ½{¬öÖg0h›`vø'º1ŸméqÒmåÐÍ“¯~u¾”¢÷ÿ{_ºrW|ƌ¾Æl9²X9§n©Þ¿òìßH±Üÿ2úG­¦s’$Ç^Xä‚“é"ÓrW¤U|ú×ö;]ï#ÿØÎû¬Ì†õ¡ê.¿^�‹)Û›#Ž„!Kܲúus9”…K¬F±Ó,«ÏéúZNçë6ò.‰Ò1-£Øù­Äqg®¬ÀúBH$ºtXZ´8� h…ùºs·O×~¨pß”Œwi™�Ot“W­Ì�^EñlšìòoJ*OggS@€T•˜ d`—½ÿÿÿ½ÿÿÿøÿÿÿüÿÿÿÿ&ÿÿÿÿ4Þø[ì=#nð£½Æç‡©åÛú7öñƘ8¨žË¾øt+)§.…x·—ZÿÔy€;Jíùû¾pQCé<6zŠU+À ûlŠí#é†Z�6m¦öÿÿÓd½ö¶&ôøcöÈ*ˆ:}ÞÐç†�«Å[ÓB‚Þ’þóΔÙ+Å1µULuzªY÷ÑS[€>¸™ÞµHšæ~?“!’ãKϪY\Ì :ÿÃ5’g7W@E!*ˆëަ"7¤?í+a𹻂x ¥€ØþCx0r$:ú�¥ç×ĸŸ£êUEžºÇÝ“MƒÊÌó�‘òŒ¡ÖâÊ6¦+ª�ŽÌúò¤¼b†1$ÈB~Š|Â>³ûiÄU¯8v£;)Фs©!)€C…VÙ€©¥g~·joº÷|Òà«8Ô�î^ÒÑõ‹D@0€R,ûäýO·ªZç²¥0£îZ»šþï΂ž{«4t§áD”`SM SHÉÚ7î½J}¿®Áa\vîÕƒïxW¯ L{zÐ  %¬?ië¥ÖI3ÍIþLÍì÷“• é]ZG¼ú]Qh{c4�:ü ˆ|çu?=WŸÙ{?o:‚L›[«ÿz«¡Ý§½½*w­><§æö–=,·äjxØÅÅŽîÈ�,žÓ«s–ágJ¾úl_yò·Ò/0ÉùжýêÞܯÿ$“ ±ó°5�öãf¼Vku¦ž_¾fƒŸÅ–i K¢­¤$ ɇÇdÒÅú4d÷üÉCö…Lƒ:•¨›àª{'×3˜IÑ ŒW]ɯ0~Çâë;«|ÈÑ"`ðŽ&+â¸&ùÉ­’€ÑÈ"•´²n ²eS,@‚îµ_>[Üh­õB€CrSÜÇ÷ÛCˆÕ=—ä×s{ŒÑ´ /x¾c+4ß ·¥Ì�Äù½õÑ$]àÀRIÌXÈ~ji¬â\>Ù˜1;®ÒúKüÊ�| ù‡EÍ£T¹žäÝ®eŸ?óŽâÿ‰ɆºûØÑâ:Œ÷%Èìýª› Z”7ú’œ-NjϵYËÀ½YuŒvã³Ü�î¿þÍèE^'ÉùY�ÿwÙ6ÃíTßã6+Ò4¾íwyݯjž³{ïÀ†Hãê(Áœ·÷ÿùŸÄY (TÔêY’°TÜ2�±³w¸ÊRF£´“.€+ן ò’�êhbÿòÿ ‹I3—Œ*ÿO}»˜RüåÖ·y1 ~¸xq“­ikˉÑNjÿ¹–†ï¦Ê³_þè[Õm„ŽÔ�×õñ7‘{Ä15op?"‚“Â>UOôiAÛ<Ö Ù¤¸Ï|î€JU�ÍÆ7¶ÏPe¶†£¯8´ÿó8=|ý&Ø6yŸœáøw}D²³ vþë²ÛæÑç};·Ÿ·çdF¼ý™åŠì}ìÏÖ‘¦m¢2‰Š”ÿQ§”ù÷Yäàü.§ýqß,hÚó�ϲ<÷ ð¡(’šË@ÅFJ.zæé‹�)™ÔȽAæÿ¾o`ž³Ð×ß•¯º7ϸ Ðùš *ÙóÐ�¦E:åÙ}Ëœl)¤M#wî;öÇ• Æ`š<þ¢ˆ=ÿDTLg‘•c[þ¥Dº%¯ê]k”H”gí¬?5UD¨(ª(RÙ)Ö¾gB¢©dz6Ydt°–eûÒC� {]@ÌIS™�(8t^I”È8âOö¾óØ�õ‹êñtrdVÂÌç†ô0Ïû€Q p"¡¿Úþú�“Ø»÷Ó¿g÷Ç}~RÍ�«©ÕoÍ4~êf±غŸ‹�öx6V‡<ì ¿µ%¤û“K?ãr÷F?ûétüvjO�M[ô×N9"gÒ.vHé¸÷þùm*šà|ßÞA!÷j%(wíÙãýäÞó7ȬdSŒ~7„“–v:áÐ5%߇7/Ÿâ·Òµ,Ǥõà tø|Õ¿wMžßXUÐî2f�>wØâ¹Xî¡ço+b+¹ÖFŽÝuE*‰Ø<¾á@uCJܯ˜ó`à :Ê|ÑeYŸ‰7mâ &íæäMP<‰=FŽß®š$HlçNŽ@§‘T’•°Vž¯ÇæüsÊÛ?ªýÃŽPÂèd@PÕó'! ç#WY¹Þ'—^‚i5(ž-}ý(�?Ç*^ $dÂÖ×Tpî à­ Ÿ3žâ­5íølØv¦úÚe‘vsð5Hè}d%ÇBF%XýW¨Ëü™ò}ƒè½ž¡×ÔÿñÉ[+�½>3WýœþŒqÁ»ü"õ¤‘UÇ ”á)\v>A¾ðχcä7Øæ'~HO~Õ¨÷yl�âr{ŠZ_MqV‚V°ÛÝh®t˜»0œäÎÆzG¯­ûßÑ5ÌáïóûKÝÒÀ“* êr®EuŠ�ËKœhÖÀ±‘¡Ý¿Újاíÿ< ñ¿=m_å`Ìbîw'Û4ṳ̀ Jw�îÔí$Ó$’{=Û�lÂqÉ�>¤4ß^ëmÌ_ˆ6“›Öd#8³ÆÃeù p�Hg³GQ½…µÜ)¾È[Ô3ʇ˜dJDWþšŠ‡„'¸¾Ê¨Ú‰Ãk™üÆ`žT~!ãÞ,Óö¸À92o¶zûT‰ÖDóUÕ»?7 Fô°…×ão4þ½›¨ KhÖ^|ò£"U½’ÿÍR’oû#ÿͼÍÖ~Ο$ ³¥V‰ÁK¾î‹¤ü×Got!o~xzýËãX0™êcßèFᢠæP¡B¡;Üôo×È Àwî°Pò·ï JU!R籑ûãÀæÌê�|׈,úï˜iÄæU'w¼æÉ©/•FïÙr¿ƒ›’TûPBZ 4b[fU˜ÿÔ=ÝsµKq*¢š´#Hj=ÈÞÔá¨öÀ·ßÕ÷ñÑ5ÒŸãs§£GP‹¾î+¹îmC D •=!UQ"]d%Håµß`$ö'ˆ”"9‰D�chc¡,ìØ\È€ZR�hÌ_S2�Øu¡RÌmü®>öNN ‰*ÍN˜8ꂃŸvÛ°‡Ú|‹C3•Íj¶î|IöÞ“ô¨«Üä÷¼(?™Y§Ö•:çzÞ„{d}g\3� Ó×>ÈQŒ²cÚdÜ�š]Í"Å4 ­MG »w°‰šë‰ ½ê+œ‰W벭ĺϭò©­ÍÅ;T6=ÎNAñ ¬=ÌŠ½âÇÒ¶÷•öÙ[ëâ' ‹©Ý÷©[“ÝMËÕM|j«$6ý žTrHÅ–N�6Vìð¢QúŽÌÍ©ä~:tɹû™;�›ŠY^üB÷Lm»<é>S[–šÆ°Ù�‘ðýãqÚ N @‚‚a;§/¢ pëK'Ñ»RŽþD%B݃¸}�δK²¨ ›Ñ�à¨9X†! Ø*:Óm3˜t†P©¨)žø®‰ 3»ðLà˜ÖbeQ…¦piî9¯«xŸØz’ Á>“`:˜‚}"N/_‹CÈýbÀ†àß�¸–APY‡Öi+�à‹Ø�F–ÑmPÌêß|m+ëå•· Í"À¯§1ûѲ~Ý«D²“íy88i‚=Òd–dÍc§~™“Œ�.Žo`+®ÚÀÝœ$à£q¾  ¶Ã]þÌÚþòëUJªbùмç§v·Ý5a{ÇŒÔÙ¯q7[•ÎŒRsXµ¶ m̺¤EÓj�ïæKAŠ’JxЪwžs]L�ßløîç@þ!?ú Ï›Éf»DêîŽêŒÂâùª::ºÔf�¬îpQhgî#®íÆgîRÎ ±÷cì‚Ä­7m’¯N&NÖ÷îrí£öÿ5ÁM/Ç‹‡]‹ÃqcdR@Ãà#ýܯ;•ò‹Ì¹ä½¸Ë»¼b`™~ýàå¿çÃÓíK5÷ÿ¹[¹mˆ0@Ôø›‰� 1�k’KlQÐФ—Þ,K¥Þmᢶów(D2„}«–[uPAù+@6íËžjD´¹P‰ßk>»¥629Ïqõ%ñ‹¿ÈV‚j”ù‘>ËWì÷ÏJ¦©ž¤¦ÒSJ\ü¿í½Sº›’z3Èzÿ=ÓhùÁ©aµ¦ÖÇqŠ”©ÆR ºÖ†úèú„ïšÔyäó L_ó5S€h‰ÆhA¸nÄö¾tµN¿“ðdäM½¢)!…lt¬‚3ÎJF.|X"\· T%1zŒáÎWU=Õ«ž–œlõIm%dBÑN·®0‰–rwD�$2/áíœ~|=Œhß  .5•:…C�bâÌŽƒ¢ÙÒMˆ<_ög�REç1%˜çÃ| .!‹1fËYBÒ¸ÑN•‘}§„HHaçvM2{¶ÄâFAj>V iwÿÍwh½YÚ»~)ƒîú�lC�H†$€eyºÝ"Æ�‹ùgãúzyз¥ÒßX”,'?©Œ'Õ¿>8�¯î†½e/§©Ô±›7)¹.¥Ïüßêßéöz=o-™ hFD>ýÀ#íÿ3qálªÍDçBýyÓŒ[ûª³ú$_Ž´‚8OP�uÏ×(}ÒGÔ¸××ûÁéÜI¼·#ìÎÞñǘkvBž«j™Nè„2ÕvËw¾×ý ô!÷9V&¡¿¿Î·]× ÜEõí{?8YSk{!½ãGT½'° {Gß™Œ:p°û2õÏôˆŸ�‰ƒŽØ»Ð„9Ünø­liIR@[­µ™´ÇXèT‘•A]VfcJ(cèLÔ~¼y—n’¸Â|‰#50`Y”Ä€$‚Ífs˜H›æ%“uðr5—¿5Ò¥MkmÀX”ËÈSërNÉÀIIŽ¥ÑPuD²½Lñzõƒ¾?×o™-Uò‹‘vôÊŸ“e®S¤ݜ߄ûdB�6Ĭ�¬S¤�ô¾]×.60²UfÆ[^¾·Òô¶LÌ€]'Åi¶Ø,ìœ3ALÇCîü篳ˆÍá¹"�³ÇoÖ¬¹øâ8úÖù/sq€5_�Q“Ç/Å,—[ö­¬ÀFn§ôml^\]¼ªcÁ˜?Ö�§¢?ßâû÷ŠÂ#qÏJ.ÝI±Ë夜ÔË\ŒZŽuoËæxÏþt²‹ -Óêqû펿j“V§M*ÍóòŒ3XʧU“7ža(\Ö5ó{J£È•éõmŸ«yÕ átØ.í"Qøº�o‘×ç(‡VáÊT0ñÈEñ“Ú³ú ìdãV_.®‹ ^©;¹{`Ô "³ÉôÝÀ5ð€~’•y0¤5j—ãùÌå醨RH»ÿþ!á¿q ¡RU=…á¯öß�ħ]Ö3[þjç ŽŸ+ô-2ÝúÜå?ÿˆRÇÑÉZäÿ´[âU¤ùÒÒè7qó©8‹«d练¨O5 ÞÉYiu浕?æ–¯9ˆ“ÿOò©[Þ>Ô¦&H ¯‚DtÏÊ ÚÔ€ZOnÒf“V.!€‰-àT=è{@H–Ú¬¾.õ²Z÷[­Z5ïQ«H#}t¼ÌÚ=¨""Â( «€Ì›½p¼™¼€…ÞñR¯J8/õáì†Ú**ªRç3ˆ,íõÃÚ¢ÛÈd§‰Êý¹Äzu‰…B½ˆ‘�³ úDQž4Ôª(�É OL“ í õJ'ûÛu]ÈÚž1Õ'P £fçÏCm ì’#iÉéÇÆŽ@6 +ºÔâ½<¦OËJëõ|¸�©QÓ�üZ"CÎêjNÓ‘UÕA]ïo1Ÿ�Ô† ô¼áé´xÒVÔü^™$~KœÝ 2À´§4w„À¾Ò±·âè?ÍEöAlãFvÉiôÓxú *"-KV!oÕIKòÕ¯ûªçöç ^††íãŠÝx~ä–•¬ñvV…ÎçÇ‹^ŸèÉs�k©ñ»¨úßòN•)Óør7È礊±¥÷ñÆüšvø$kˆ¥¨Qƒþ2;aҡщÿíµøfwF�3x»I3}œr2¯w);'vôÏDÄ„=Ÿ¾I÷_�+ºù» )˜–tάøtñˆg÷¿õá½ eÍ/5oÃÆafÖW±ˆ$62Y`P®N¢ƒwi“¤8õ3œËlö_zþµ Î�6jj=Ø6”=+¯×Òd°é÷šJ3¦ò³Ø ²v³©Rqª¡ŽÂ¨ÀHE&> l�¶„×÷�\:eTMÍ�,ö*î]•ÄU˜(m^ÜÖYrWRÙüÀ#­Ù²Åž²#¿ÈôåÂ;œ‚:Þ•ë Íê¸ëõµµ_¾ k'ØkZÑë_Ö¿ßl‚ÝWY+àÝË;¸÷ÒòÆÖOÀ[5ÝЃÿ^?¯ÞÂ×äàäT³s½ÛõîNýâí¨Cv“…ä!e}1þ?ü¦˜j9ЬênÎ*}Ù­.ˆŠôøxR”™#·{ë;$p%Ñ–ðÌzdï¸}ýÚÀiÔ%Ù‚’“¸¹M‰óîcã v»n¾ ½³Å¿ÕUy˜=ë~·Œ ÷'œkÏÏf”–æJ~ng¬ùu_(Y~�Ë}t«ªTšloŠÿwË|ŸÅh_ª£(>v´ÑÃ0�YP€Œ‰ãÝ+ë¾—*üÃñòýýò‰mÚw²_ŒìD¨3á7¯&8fBÎÿpC‘²@\OggS@�T•˜ Œ­pÿÿÿÿ#ÿÿÿÿ&ÿÿÿÿ,ÿÿÿÿ)>¹ÛùGÐ$¬Lúx >Ë¦ÖØ"˜5ã“9˜ Çèëís.Lw Ɖê$p¼çñ·G(êîjï†'þ´;98�Îp¸ÂGKá½ÒÎ~¤Š:pá›Ú¶^ƉflÚ *`ç'ž,W©i/¢Ö5St…<7½œ:Ìk¿^;‚€Tͧße-E;Õ©!Ù§[šyˆyÙòh ¾&»‰Õðå4€-û¡¢*7ÕŸ£ÈÖ“=tv2'㤊ªh*GeªH«:{ U²·wf�fõÍ2 XÑ¥ûoÎO“"¨ó’Ç~ {‰IwG:4ºÐÅö‡Ã UØ'·AÃ0„^^Ü1†½/CzŒUQÓ²b£6£Ÿ/55r7RjàJ¯QP õ袈fô¬BÍòLbšo�OnõY­ôgº%8;‹4jòfƒFP×L½wD:¶üéï¢Øt”#Ïß�&¡E©UD£›@‡ç*_êÂÕ€E‰P ‹Ü‰m*ÔW!9 0^6Îû¾žÈ�ÇÇ„ek{äü,‡¨è.‰ƒ.ìŠÅðÕÑ`HÒŸ5jþ¿ÂMéã�ú <Áw´îh Éï%ü’ÿ§Dn=ù'÷»g5Þçê¿~OŒ4êùïÓ•º1ßµ0'³3|õjŽ·ö1$Ìþk…Ã…À0ߟ½‡D®f¼y"FýÕŒ‘êè̱L‰Ià|]•„s±w¼÷lêºÔŽïÙa³ø–`µ.8ãJ™Ûà*Ûï£ÿú^ veÑ÷½=×-:öç/àÛaœçRºóZ:ýõö躰Ÿ]_LdÇTVòNûOÐ ®û3 E9"âv{û¥’Jcd�À¾ß�\îW?‘�ôYzM~Ã䪒zEÉI£ YZÐ<gßO�>½~Y Eý¾ÚÎÇØh\þ¯íp©ÃÆs¢—Y€·d~ŽÄ@ÜÛñ¸?’åµ5ÒÐUjwJÚøÕ@õÝ«+oNØtšhÞW–�¼ô¯;‡Š*Ψê;ž§VÞúcT´úô°�ÆIÐÜÌíþW¯}è÷Ýbì皇¤5þywÖælÞ*ÝðºßF]�­yßß\®ËÊgüÂ�4)-*Ñå甲¨ê¿ )Æz•”ç×p©jíc{çî—µV î61VÃTŠiï�m´ž+ÔXíÆPA°ã_rW³M•ðþRylLšwÕU|Ô÷سòÔN(êÌð­�µ&I.ŽKJÃ:åÿrm^pFz‹)%€»­CeV/ð�h2êôóÍ!V�šY�TœÛ2齟~ãkéøä`÷DHŠB|‘ýjàýæ¹ùw¼”óN"¬íŠÃ»ËC¸Ý>8Ð7[0PÊÊ0ù[†ÞW~¢€êù׳«á¡d�­ØŽ�X^ÞaÅ…¾Ø•WT/ˆ†µÈyòw�GhàÉÄ#¤) Ú®Þ³rPèZ+úØœQ5Ê;à©HkBQ~©ñgR½Ôo÷ꀂZÛÕBÆ´oáÑ®—±â´ä\[e=‘ÿüG°~²c‚óV�[²C@ãOï�ü*8iÚ闆鬴°ÔÞ8³®Þ?A²UTF"¤£™²J×Òõú@ª›T‡v'åßÌ­ã ·ÞYí3�˜õ�<Öq…?~>$AT@» ’ˆ©RÕΦíæIG½·S©t¶H?ßNW Œl�2ý6›ìvs=Æf8 ŸfŒÍ]Kk—�5aê¼(Ù>l¨ÁÊߟNåÚPwfÏœÇ}‹ëÍ•ÝÍù¡¯u©¿lá´Ï±VÙ‡×ëÏÀ‰Þ×`¢-îá³Dþ{`u^-õ|ê u%*Ïûôqž¿yµª½øÚ\…?{{„t©9d�xÛ{kL Ù'ÞËÚÚ8^Vûçmt!Iª*k4t·\#?œv'Fˆµ÷µ “÷ƒ†âÙ„ºNÞLßœ�…Ç?L.ö&.~é[ð+èæœ&œ3xÿóÍãQ$DÛ)5§Šß–äM©õãÜ_4›r"ɪNUÖÏS}#ªÕ›Q °Ž�ÕQRÓððAŸ‡Å×±J£u Çé¨éÑ’_¥R<ç�éìs˜/õ(’m¶žycúú²ækÅŽ�-ЊDõReCœXa¡žýéjÔ«:ú{v6‚û^®US­‘tMª¢qoQˆH§:èÉgãcf&*Àõ}c÷bvžþÕn*vp_t�µÌÀ¤ê1óñøö˜©–ûó–¨%ÔµLH½B:®I1¥xÕéÄ©óýŒ$bÞ‚+Aü[•VÊ¿0×}‰`©�a®gÂÔ’(ÈSŸ²:R£zé/™­ÃxR¦—”&¨9%€×þª¦ÐG©ÈW7�‚lÞ|³Ú\]é)ÂÁ;E®E%woÿëu®ÆoÙõOÒ×›€µ/0vÊÔµzÝï~‡è¯2»—ß¹«�e¥}4pŸŸ‹]º”)A»Ûœ³qðéÃâŽ�©Ýê‚Ääh¶§ÀíŽØõû¶¡OM<ˆDMÏÍ?ïË( >?p¼¾i½µ©•øµkD�‰” \ua#¯IÙ‹ÙWîêËI^½û|wc®�(¼ôSJ‰ˆï¹F{­êJÁcs¼ž�{šD:íÝ¡>^h½¡Ý²¹¶ÚÕ£ãâ„[#+�Þr´~Ñó¥³rê¸.»{år¶ŸÔÈT2º–�™©/ßäŽ�ºÖ=$ym‹·�÷àªAû�VÓYéÚL˰Xm‰ƒê‹~˜ºÚ;HíroàHØq̤û®ðµo#‘¾SFÓ<¹Gµ¹åâ¿O­/Âð^æzóNb4ÁÒžû~wê«æz-±bu�ü†½­$·kÌÅ&X-ÇÀÛëŸRoéÏ¿˜qí©“CÎEÉÛ}›pô㾟åö^ë•mÏž•üKX¼�oxL;É+ÉÍ¿ú�w›XÈI‘¬f£FÏÿŸÓêt¿]Óh!·ˆÎӌɰ)2ûy»6‡fHUšùÿ=úÅäHs·mvÊò§N×�J÷ˆ�Œìä�y¾J–,B¿ÇŠüäKŽH½ö˜Œg/SG9²äøú’I+4_•Ão�Öùý•Õ“ÒÈŸt7u¦Ë;Òaî¬|?JC.Øæ1c*UXçhÍ‘÷³ &EåP˜Ú…¢¨ÎÄÜñ—}WˆaÃ5çÈÁK9fPÍ5Çíx8ýRó(£…‰HÆuѨS‚ã<€ Jç ±OZG´g¤‹<õ÷ª8AçŽ8ލÊToj1xTaŸ3¡ÖžæðƒÊ+�Y 9“€>v¸œ*+†ià/ {•Vaê%‰ûWçûw÷ów¨$í­((³]K*Úªü�¹TU¤Ö-{È mú&�jã—‡Œ¦¢&-SG`bõ…íÓ‰ê¢)tH+$~€¤$Ñ­åØáÝfàá³×þŒ ÕÖ^×ÚGºwû °¼]¦_LÏw[ÃùÕe¯c*î¸òO9Œ¯¼ý4¸¿¡®’ÛPŒZ#Ìmq¼ ý‡ËÃæ‚»QïÊ,¸¯_±^'VväøºG,6&û1ýÌ]d…CЦå“Ì¢Úk’µlôw—8)eÌï<Ôþz5OÜ߇¼´ÎŽÒÈ>6Œ!“¾³-™O†JfNÕ¯ Ï¥";~Ì÷cc7„�;ˆëw¨¿·åuõZùVóÖ°ï¨4®¿™ºªvñ–1¦¡žd½Ü;bü1+kê� n‚gÐ�¶Mš¹Ç´ãFÔP„ˆgèɵ�Pˆ.‘‹4wåijvÏø<¹’P��ÿöš*�_õÍ^÷‡º\nuþïFÜÔø®}bòXwì•ïeœOŒþ%ðÑñe“¬Ö„�‘¦Tl}¥†�ÌÆ³Cø¥KwÃ"ØuA¿Zd™Z“îÔ4hõdiÒŒJh÷xIú¼_u ÁU·›®z×î”x®yü�.Î*&ÍDc¯ËÚ Âp.¸öìÅ…®óÜÙìHçÖã\ƒ[L1¿;aK Á�9â:ënB]½·Q§‚—J÷ Ãhy¯)UöŸï~­ÏXüØX´�é¬|ÛºÀ?œåÙbpæ¿ÖÅöž+×íí.!½¼ÏòX¥[áá©¿¿ÿ÷ól®=-y‹ë·Î¾Ó‡ J* ¹2kÊÊ~ ¦Ÿ£à�¥jÇÌ�¾?ë)e�ÃΕÓÀ’ÝéHpÊÒîÄSíY'…¶†j¾å+C›ÔK’�Ûô|XçÝ\}º[ž7S6GÃÉ-§i¸_ kï�úWæ_r¬ë‰ñ�]±¨WÒœåøñ&lª˜ñ+OggS@ T•˜ ?oOÓÿÿÿÿ$ÿÿÿÿ5ÿÿÿÿ.ÿÿÿÿ1žù;‰wà3�÷ÒwâW …�X�Q ¯˜~ÖþzÀIgøñëDù8î*M¢ÿ‘Ã/i 8§4ÍÜYmþÛ”T”!Là»ÆûõÓ‰�(œHèêÁ¤´Ž:;yâÕn0Oµ~JŠ·Š6P]/'y•Ò Û²Ì ÑUkåp�æAPäÜZA°¯�²k%0†Çq¦F2¥'rå‹ÄïK—BÜ¿{YjqôÙ"‚èË¥£"‚À+‰¬' >?êB‘&‚ª¨´°ï�ZÁ4‹x|ô‡Â}ó_?“IÖᜠApz¯  `Øsõ�#@r$¯w¹êeæ©3ÛçöýˆÒÓUµW‘€ÈiðÏU·‘�u9M<™åœN:¢@�$;€œæŠŠêɬµ@Ø1ÊêÕù™Æš_1Û¿CñæÛ‰‰Ì÷F÷=U‘ ÔjšG½wf¨<‚¸®ÅÐ^9‡5_uUž� F¿ÿô¿ƒà�jœG\©"0ÒJ¨J/†<:^£ôËJ,·óAÚ ]­g8øGj½mUŽ^/‡+;¡¥—P}›°`±0$° >»/þ¿ú›Ô¦ºâ+}Sý¤ [LÞ÷Ž@#|P„åˤ’‡C|=ò{~é2^)„ªžõg}×\«£f„¥ÁéBµÚT‡3.纹¥Í÷›¾›ì¢Ç­ÐìîÜ]ù÷çep¨2µxÀ?ñ@~xªð[˜oÍTóJ®çØ—ÏæÏ¸:1¹UÖ¾¹î�=•±ù-GÍoò�={u%®ëæé„Ž.9mm¢!rqþ¦öá7â¸é#&Ö3HÌÙ\—™OÀ3δíëua×ÕÍ"«ÌzƒE*�Ò K4X*“ÑO™ìV·OnYÝv¢²RuC)¨¾½&.?�kþƒfÙe¹'ïcJQ�^œjÛÍøÝN-¢åP]Õ-¡±‚ì–qØu2ÐøWz/É /Ù¬ß 8XöeͺG�År4¢3äÌ*»³oÈÀ4±¤ßîCJTOwiô§#>TÕØ°áN>ð7æouÝTêï&Â3÷ËЩäb),…P(§ÌÝÇš�ýDø†‡ÉmgkSUþùwÆÕF Ç Á¯fäÏK’oœMïÏ›úÑ>’ÅŽ4£ío$*ÿ^)ß+Gþ|ÂýŸ�ó�¢ÃLçsu�m«çŠUfÞ'œÜ"ãÍR7ÎõÝ}†ÕL ú–BabÌëå”Å_Eç9u•ëv¡ªìþþç\4' ¶]®oýø?O¹‚öŽ·&£ìpJgÎÕ¹vt+û³ðœ­ä‡ÞŠJ´f9m÷¹=õ@» %�nÍ •,wvqççwù~ÖHxŒ·!ÎØ=¬¾VéeWdìG”És\3×¾:‡fn?.Ö¸—rö7Ü3˜¥šFšñºä3ŒylU@bÞùÛ‚WÂ&s™½-|}Àƒ)Y©Îû=[,êK »jȰñê£ý Ó�vŽ„¼‹nÏ‚ø5Cu~¥ÒWÏì«e ŠOòœðè`wCpµR¡wïíè 5EÛá7‘,²‰õ�s| =$!² S(*ÔVõäïÔ²²D§Ëw!„’*5mí]†µr•*•ÔÏÆúñS¦ ³2Q‘ì…ˆ3œŠPT®™£C8k;ª©¢Ýù…èï©]8ÑÙUªˆÂÕý €ðn ªÄ8Nh|zEõŒáX€¬RÖIªªÓ茢ñ|ÆA¾_ŽŽ³ñrüuùý¼ 1 y€z¹K�:e¤“,Ž|d¨‚œ(âÆ«%+zò÷üd‘CÀ>©Y!ã±Õ®¬ü,TËkýE BÓ”æ£õ@D·ˆr8RQ=¼UÚ,E�ˆ™çJ“e©Ö:3éëê¥F)‚h{„"²€dBjìÀl´ŠH…]ªR»jÓÁlÏtý¦E:¼Šž¤)ÀFœhì%-ÞíØ; é œÈ©‚Ø;?8ü­Ž*3L e ‹ïXÊ—ƒN@Ø 4}iÁ»ieG“Á›“l­… gš¾#§KLÄg&±ÉðÛ*ºíÖïò|ÞZ‘é«R½Zg­™AÌž¼ 9üS'5\7zÕ×ï8¸0Ä NÖ§�xWØ·èy4'¹´Ôwùq¯˜]ã¿â\YåòYÎoïËÚ{æ!�¸è[7l3xý€ßìÝ|Ž:Ù¦A~j ÇTÏ~èžjßhÉqæ’bƒOþ5J\«W&Ï­\Üç_³¦«@V^ܘä…Ó\Ô:�e9À >ݯÂqôaÝZìÑ^|¾µ{_5�Œ7´¦Þ¨úaÆß3/ VÈ©+’*K h`-'÷ƒDɾÞI—™ÊdÏ›ŽœP{…¾ä´Û]CîÑÎô–D~!ï³ÓÓúçǃtÆkr\À9JÖ9ëÕÕµù',öup¨åó6æj W+Ô .•6ÒþV/žŠJ[¹Òf=µŒ1 v‹Œ5›¾ŽP5üÒ]ì6²¾>ÏŒCXª3æ»xÑç »ü»ÖÇ3AÛ]ÏW“ø†G‚"÷ú,><üQöî¹þcs�î~ÞÓCÉï…CøaÏååƒÔïVDû¿PŠú;“ϬM'«Ê›—ÕKøg˺EpåZÅ©‹Ý-_°z;nÏòa»ß‹¤¦$‚ºöK’´¡– _×$cþéþEÏóîò*“Ïœ…âÚ‡ ;-;6‘�4«ÒKt»·f†V/Ôrzi»½Ç×�µ�³7–k]¤�°¼ºžûmò¯dFpp®Šûüóߞί,¹KÑ&}SçdIß.Yr!Ì[1Ãß.ý¥ð½ÔûGàUd°“c;Æ9~¸6÷RyÏc™.Uê×¶l&¾ù;ÉGºŽ ía�ÊÞ�^AŒÀ£‚Û1é½Êå[Ç…ê1=åHW6î$á[5º)ˆÿdþ{_˜F} MîB–vU@ÙO‡-EùëdX$1!%;X»ÿ€õα´›8Iÿ}ëp«z…ˆ¶V6ÜjfñÚU$ÆÝ(Âi�&Ó§å޼#© €SEC÷üÝß9ûÚ3¢ÛþÓú 'ÛÍÏ£²/ƒÐê¨vŸg(o J;�²LJN˪˜YŸFò�ðŠ¨”¸N¡Gµ#»ë£ ÒÔ âèh¢Î1%Tâ¿!ø—€j­ám˜ë×lvÑ+Ä™žVg׿¸d$.:·‚ ªŒŒtK½|5³uèaõÜbU\]¾;e•GÉ&ƒ ±…ãdê*J‰GDN~� L€ 2˜Q\Î9®ìÓ1‡ì½ï�ž°ËKþΞ"¢U³§ÔÕë ‡� X úß�‡oýFJ}ØZ––`¯8“ËtK·È¼¾5ÑÉ:¦úíø¸žªd”ÑÑPhÍp­ßO7£èy~LnÒ€Hƒƒs €¼c¯z²8w%W±î Ç­Wg«¸þ|o~ëêzFCã[-hø‰J“[ïaW>=6éµù.ܼžâÇç™ad§IP¾´Ú,"!Œ ;¿ÄL¼WnºOêæ {..ÎåeÜ[»óûãh§žôI±Né9HÖèݬ•É÷z¦Oô”S�Éé7ã;èJ» Qâ¥ç&ðèõ­ô Fi:«ãþ¹Eeèä¹ñÕ.¾•EÅ€Ê$æêÿÎ '$è7Å»2}P¯P:ý‰ú]}yXÌ`¦âuyÙvcšºù‘à#â—Kï�ò¿4L=†…ßö¡Åfç@åá}™4µ�Å•õþð‘”ÍŸ.ÿ½ƒÑY ®™ìî4Á´‰ê§w! ësßZÊ,È•‰…çM¯å 97W}"µ«ä" Ó§×Üà>WÓWûk­ü÷S¤/ ŠÊ{ß:]‰öˆy¬ÁGÛô…x’ìA™ËÅÚðTo�m”ÝÿÏ^ú@¾O.Øò/“¤ý›÷íÙ—mFˆÉKA´·½/‰‹jSK¾—~˜8ô×½"í1輚¹j¶LÄ?Î  8E„Q;Æ_0¡§Ð9¼æÇH@Mþ§ô4úc¿°¼-¿eÎ0aº�¶®ŸÅòbíN]ÓmŸø_uô§ÏúÝm+l1¡ý]ÌnÆm¶Õʈ1Ž˜ ÅW¯œ×+1ÉÇü€ÌUYö¡±f_5 ¬÷£_¹ðÎ3 ˜h±��ݰÙ;].Ú wcc÷6S÷õ*}J¸Mã|zþv«{šI´~ûŠÔOæéeCìS4n|xݯ}á“CˆÚv¥×\rús>ú~Õµíïñï80ƒ›þåÁd8èSØÞÀÀ4pµ)ÞE馟Ù–žéÛ’�„< ì�À9³wàgÐÄ’lgD5œ(Þ«~ÞÔPê!CøÇ©|œÜphQš ,o�-CHíâ-€ë¶LÓ›v� ™lqêgÇÆîšˆÑ“fè,/=ÿŽü=2‡ŠC]ë?; §F¢òìpå(ªî´1„h0£†F¡õê™7±‹éo™h#^ }ë-2d482™«æ-« nÇqê:)Eé(J æ+¿&„Vç<;•ì* rd}âwwЂ®Òr ¢ˆè UY@Uqª(ËÑCyr Æ9£s5\TPQaTA® &°C¤ÍþÇ«SPÄ”SÇqr©Y‘œm?œÖò|6Ûýû屨�÷ó?ôV3BëÔN¯_=}=P¬©£…<^; 1ݺå¼QP€2»lÝ(€_„XË",Qˆ'ª@)©™}UåQ~¥Â�kåšš©[—@Œñ|]¨’nê½ÂÞ’¤R³§Ýå  ÀQP .@ L†"n4w´Jþû�O;.ÿ/èd5¹ÄÖ=ÀñÙzl’bS²é´êà vCÿ>×,9¼Ú}jüjE­'Ëõ]hÑúýø¦¡™¼öŒ% X‹v™òÿUí»arráýÐ?MŽŠ¤ÚûŽeêÐfEËŽ‚÷¾oñ­!üû»n‹0ú‹êöÿFå6ƒ¸G{I< ò¾1¥Qù±úúÿâרû:ùã²öÊ¢—5³Ëù¬ÄÀèY؆4Z)…Žq¡]a�u£³=Š'lÚt®dóÍ‹™.pf“�1x^ ³ù^,Õå·h  ·*ýi}°êùÕdˆ«UžŸ�•Ч¥ Æ÷2øu�VšyÔÝÈë Ø ³©c¹Ï–îóVF5ÍãDG€ˆàH4ž"ðB;²ÿƒpædîVmü4NB£ X唳f9侜̹æçÂàÌL«™^ož·ÉuÿKˆø5Ù’ r[›ì4Ï·Ø9;̾ËoÝ>ûùHÉKDn8ú·�Ò­Ï0—2ë2¨1.Å®€øj‡Ž&üÆ5ß_ ¸¸ƒ®lÅ‚&Ë�£x„+›ùþF}‘¬.ðÃÏÎÌñ]áÏBµ{…ß: ‰¦E²§¼­‚š:�ŠÙ„™êšr˜ÖÅ_ÿ÷Ïêüü]ï<�ú¤/ááz¹˜un@œ5Ëó«ñ·žn#1QÁW‡7–µ2«,ø±û¾€¥Cä£ãw·×/×®§ö/ocò5Ý·$¾ï›�W.Z"!jâ-gkΛQ.ÅVß’›vÞÔË»gl·Dbx¨rgÄoMÓïW—gzX·¿zH].ÿ²½fÝûÚl2aE¬ 2~za³jÀ°£j‚Ç<¾ò~Jæd“OggS@°T•˜ ôHª#ÿÿÿÿ8ÿÿÿÿFÿÿÿÿCÿÿÿÿPžù[ñgª.ˆÁän‡� h€-xH"q�çGMŽ{ÕËþ‹ÙÒëv@–)[¢mõÏœì±{*º6 ÿ”l}BàÑ:ööfŠN‘8�v8;ŽÄŸÛ=hñŒ›+,7éÇŽ½J.Ñýv‹t£|·u�öÇÑAŠCªÐMÞY{º¨?DW¡ Ľ ïsâ*èÇŒÇ#€N X¥¨«›A§FêT•“êΩ1€8ðt˜j€‰f¿NOµ¢8ªï÷\2ô%U¦¤pQE¡Šêäȹ÷zÔ}?�4THçó׈¨®ÅPU‘•0Mèu'¤PC(ÆCDåE¤%ê$Úƒ*(4U÷ž–k—’Z%Ê9AÒf«Û;fý<[�ƒs-)²èÒ+'r 9¹% ¦Çj˜¥îÃÁ}¸ÝÌdUGÖTrý$#¼ŽoL8EjàÁÕ\cšU`n­¡²Ô$ $JäöRÈ™@³e‡€‡öÈö¸ÕØ~åЂÀŽu@T 5Oéüg&!�(.ÈP†ÀÞ�MÝsa w_.Û+eì©m³-÷þãðm¿t4q›~w#` é]À&GÄùª�ÝÞñÿ>nÛþû¶d[>ç=ÿÛØ#¡ö¼ºïq2e=JhNʘ ŸD�ónâ@Éß}1ø';öû=´ÀüòµÇýþÌ{iî6ù<ÄU}Q_K¾�Sß&eû5SD¦*ãgÓ»H¬ š)íÂh�IpÝê+ÊÛ7¬ã÷DÈþ¦R\4Ýx±N+ =JôÕŽf'¾Â+î±Y\D}_ŠA¤çôßöïK®”õJ55ñ‰0¿Ût6y¿ß.†yUxŠæeC9¯ÏEðŸÄUÔm„�-dÚi‹Plú™ý¸ 6=¹¹ÃôXã ”‚>©Gy…E�ŒSݬÏ<Ã÷ÅÊÿ#ýÕ=HcÃãØ¡ß d‰Ï©+¤žV«÷þµõšÿ«“�W&…ßK£'ðݤ!"®V¼5wÄ^�j{gÛGʼn^-"ÆI&{ˆ®gÓßÏ/âå³1Ä6ã’ì%Z·2Ÿ`©Ñ;¬h±xYÑÐŽuúy7ÏÙŸ3Têþ»‰¤:l€O�|�Þ{ Lº!‘÷ÏÖâKŤênA%zZýùpÑÃKÑ÷’>ËYOo«8 ˆâ‰ïV U8{(š6)t¾�ÑZqtÀy¬ÙÖ’¦/˜ÿ¯‡ÿ`Ï ¼ ü¶ýqµÆ«é‘õòfsu‘:�«U:‰?ì£äßàã¸.eªXu . u¯XÞoÉR-x|˜¢/¶·ÕØçíB¼«CÄÝê‡&ëÑô•ØÏs¹½Z!šÉ£Ÿ˜Ýñãè–?â{ƒi K“†ê(_#Y”ùß}÷mÜEyó[òÍ©½î¦¨lö‘|�è¾Â c9~Ûg›¡ŸÏw¦}Íù¶v¨ Üü«hùu©HI›5 ~ùÛá3B6åöŠHÿ=hݯÆË¿ˆˆS,lAîådõ…è\"CÈ•Ÿy¶Õ�á×¥�,ÿëT�ÕüÕÐlá fö¤£ÂßÓ'Êe½ê}—ÿçSÜ{õKg Ð<™–Áh­JÎÆ´Þ?ÙRvK‹1«¡‡Ï|t›@—)ãÃeºØ B ²u#Ô×±1Ì�ßwpÂݧ uœé­pÐa…˜¬ú™ßQo*{•šÔ!ˆŒŸï4-‘3 xÝÅ4DDE…zÂqM �¹ª¦© Ÿ‡yÑX"†ºúØâùw:1‘ M%”µZü;=é’»'^7=>¤³”uÎiN¾ÿûÒ˜òz;“x:¯cjX¬¦«Š¾Šáä1)þªdÅPÌ* ³#»"²m8.Òb`€˜bºóÐàþ¤Ñ9@\ÈÇN?ÙÑaW£½På4·@ÄMÙ�Çâ�—Ñ�R"ñÑzŸ¨ >7¶•ýe�gäó\-Lª"=coŽ£€…“�:°¤‹€Ï )ò Y%öóüëXßPkß-ª¯Ê&¤Ã6zû Ö/Ú¬™;œhªäËØI»!4$Î¥wŽnÁ„ù+ŸaÅÞY ÿÕJ3ÃÃîÒ;ÃÄÞWÏÖbÊÿy-Ù§Èèõÿ5ž`èi†˜‘g8™¼²j >³wõ1~²sT�ù¯H*mL¦ã3JEßΫŸe{cçuCýg‹“dT’p&oô„ÓÒb겪ElzÙE¼¨¿]Íå{�ù;¬ƒù÷ý#ß'ܺ*?²]sõœ²v&A}[Üä+×tß×’žâ"7�2”=r°uø®sµ]•ð/¢-lÒ¿Ï~ÿûŒÛï°Æ;:áiý_Ïaû§^”Y¿ëT»¿y¦ûîVâ²éZÿjSP¶eÇ6?•›ö?õ4äȆË÷?e�òaìÜäÔž«•‰æ~­”~º.ˆ®�ŠZ�I6Nï|]Ýh©¡n®XÌ÷~z…bÁHßΉ©Žfpo¬èu$�’Þ��óÝ„í÷é[Ò1W5m[ìŠ{ñsðáUº»»£±wzÞïÏY”�èjðïÜjb�ivöKc•ƒ�ncmþxØQ¸ÆùÉ}@Iê´¯î[{uõn³$1Ūžµ¸ÇV2ª´,,•T7tÚ’…¥HÈŠ–µ‘> Á¢ƒf’ÏfŠRí¥äF_ö·ö<71_{È—ið�o’S(’«cùy~i2GëÙÙëÌ­ðÐûéuá}Ž÷ÞïÏ÷™—­[V¯�ästóÅ9g3Ö„ì]8¥¯j]µ.Ϫïp_]ÉæÈÊ�}ò‚ën¼±¤"ݪ›éNøä¿8D)­`£ŸŒR¦Ci‰Fc²W•‹ºâ$ÿ˜|ý™ µG 2al^é»pÛ`FÐ=2�¹‰x†xÀƒ=²âµŒÆ�_º£2´kàå?ÇÎHëëxü÷÷¸ÚÞŠZ! Bd�+“®ôÎ ßÆ!‹8˜\A'9­‡g…ëbaHÃSþ†Ä»¿;Uf+Ì<�Íy²zLJ·>Ò'ê¹ú¹Óóp»xõ…Þ]¥~�¿=ÔXŠ*�XÉSÍ–|ïã]¿wu’£N¡×£ ãý:åº1 Šô�.R¾=ÏIhi<>²/â¼»`ܨÒúW3=)Q^û«[Þ{çKt8†->>¸Lcèl˜lùjºA6cM›IoËÕ©„ ÿ¿d[¯ž‹Hº…ˆ¬i”4I¿³iõ‹qáänPŒ‘g.F`³áýÝÄ÷æ=/Â=Dm¤ÛœÔ� òžÞâž+Ò„ëã“——m{N®Ûö‡*œâåšûX­¤éç’çÝ%^G­í¡Ÿ¦²¶¹Zó§5pû,êЮcùƒK@:œœ¿í¦ÅÄÒ> L4‰eåµ§A®¸àãPžX~È wÒs,:Ç?ß9r>3_\̵õõðn½ÀÅnä#wWy—Vøã*§�a fíÊh­Tóª*έF¤Ÿ·®Êh¯ìuB ç° _® œ­}Äü!a3|¹¼ã¸ÛmM7{ûl¬ç”YÕ}vvTå;*XÉ®S|{�¾¹ÙZÛ*žëÏëë;›5§%�Ïf0BYq�›ÞËYNøºb'|å§)a+ Tݯÿ|K®Ûè°îíì‚ÑÉÒXms½¿ïÚ~‰:P$¨ÕrëÊhÍLTe§!FïÇÀÈoqŠÛ}>Ð=ù§AÕôø/þO�ßgk»n½Ïž®%k¥Ê}ø�«Ì)ç–2U¹Ë{2Sª.�4ÅñôøÓžeO6aú �J!˜½.˜Vç"OG¾ÌÅÇûEâ›–ÔkÅ“ª›6;¡>ÜÎA¶Öæ-¡¢7Ç»xèg—9ÜÇÈ²Ž˜ø+|Yù„x¼°5nÆ},ÚÞ®{�ñ*�ö”^Ù;¸{„?4Æs‹rKĺÁ|y­fúûë÷MK_ê*WAäp©zE·8þã_àöÄ×R¯Æ¡Nc0ÙRƒ#ï“TzÝ’pv?�ÙÎÆ¶PuøO+8ô2̳¬‘ÿlNùƒ¶*ŽôÂÖ³Ð@¤Sê‚ÄÑzL'¤¶ï†VŽw£ºúä©nN/Ç“È÷F\(Riõ¦E˜ãœ‚r猠šåz÷ìÎÛÁ *ôñé$n»”ÈñȘI?´¼‘zL8Ô)E¥àa‘WeŠWÑBPQ¥&™1¤ë ˆ+<c-Sa†’ŸÆ‡©ÒNq”&J_†®DU€ƒ¢GM=ݵ:Q#˜X,vAÑe±€ªjÞ׿׽'�î£jîUÎ;P¶¿Ç¾!†b”7´>*µ ª§FÜþ÷÷—ºfF\çÇé­ç Ê‘@ÿ·ºël½¨¢‹?óÐ}!Ðû¤ÒäÞíTi­ ÎÁJ©`ÿýûkWrO­8À£*øå¸[q¸ê‘cúY$¢çšT®•lŸ^u[Tj ýÓtÃÝÍn±M{î–Z ÏóÞ"�çW7–„QT1"zVûªŠ$! T¬—€@�@—=„/t5“[ì„çÇ’aÍ�ÓoçUEÛö9ækïÿ×(‹�zíÒy-Ï=hÙŽ&R¯®éýyUÇǩۺ9§Ñ (jT´Ö×õv_}$å"ÚÔé²ú/ƒöɧϕ­Ú �“n�OD�Rd9�.S£fþ£ê”*¹¸ÜèS½û5uÛsÒ�ò/«ï†‡ñÆnŽTX©LÍÜÂ$\xEßb%ÿxÉXìw.ÛVéŽ÷¾ šäà¹ùá§õ&ÎÜÙG4T® Æû†ù>Ó›!Ü7#)¯o½:7ñþb9|@©JT™«7pí];\ÎîeüÅzå|{œSã ×|Jºø0½ÏÄú{†9÷ÉÙ§oÏ€2¦’û“¼®kŽúû£[@}kk¸µ«9«ËAa¡ŸéZe�5`)Óý‚yÇ€„w¿[G| ð˜$ìKs±Žš ~r“ïÿ¯�çr¿B:~EÔ/‰«µþÄQæóÈ©ÏH`+ô@ÍùÁ‡-¥âÚC\ºï±†÷긢V—@ª|ÌÈ×ÿCþnU†Ø[9YÞ„ü¼§ÎÙ–bÖöa.λ Â¯ÿ„gºK¦ïåÈêÜNpqzß[‘ü7¥ÌS•i8ÛKŸ�{Äõ�ÉêžvþÕ�&{Irðþ¶ãÞgØÐÙØÃê!#ÇÒá¨s D‰²ío!þ³^½c4Æ'O¨_â©´U²™êSÐYÿý&ŽÝïˉþò{�•ì´óT�Þ$Óô��’t¾ê�*•prq@̽t—Ãä“\åv£Ã—Ña›L剘 ª²…ªZšŽvçK¸K!„d•$í–©S¶ùa6…qo·C‚¥F†¡AxÂ�=òì'6 ö@½Ì}ƒÑjtœØ+)#!ËOggS@ÀT•˜ "þ‡‚ÿÿÿÿ ÿÿÿÿÿÿÿÿ(ÿÿÿÿ!>ÙÛùgÐ ÀänåAG`L íÐM•Û£ÌÒpµB�Ûã@ÇÌ+Sôɾ~�Õ@z†Ì“+»zÒ÷а¬(~ÿwA1ùà#¶tM6KgEÙW³aðg{N/2dÖÊQµy>µ‚‹Q˯â:Ægt‚šu(ðÄ]¤ RóY¯t*ª>} à�YEErî÷xm/Pƒy.‡J@µG»þPCÒɧ$€ ¢íp!8 ¹FE�P¨MéÓVÄP}PŹ&I@´Fu¾Rü¯ö¹–Š‘Ó�*-PC½ëéPá²7²6‚ ˜H­ÇâŽQë²Åcïî•Ù@Ìþ凧¸ÏCôRC‰YÜâ}ùç,€H-*¨(ök[+SQõ€²}î×1 ¦9‹;5qW ™ø­©RÔÜÿê A$èîÐÖåÛ‚Ò®V[ߤìIµ,=5òÚs,ÒuE‘ÑQ;Õpê”e’ q5¦óñÒb­9<àHêaHøñµ9î0™;¤vÑ Jdç¡«(GÍÉE[œ…À°%�{Î=ÑÅ ïÒ|¾wÞ¸[”=€ï™ÜžÍýè<‚^*NØ"Q»ûßÑÄ'Õ”Ú¡…Ÿÿ”EMË?�]½Œ·Ê1ž™k1Ô5µm½m– ›LÕêõÞˆõȯíä@ŽèVø†"Àe¾¦œ%ç÷N T,çbaMÚ‚ÿ`äxE.ß]íšrP¼ñl9ª”Mž}¦ÞàéÛ¿y{.þ4G^_@¿^µÓ/wýz¾«j^²¥B¡9¥ÝÖ«7ˆåè•xÈ70z’_cÄ_<®OvšY¼Fà C÷?ó›l6.‹èwÚu*FZ»E /œ†«m.kz§´öê9xŘìÿ0ÅÊmî3�]¢G™]Ï#\ßûÅ—t£ádžßésŒHr%B�À „ çðÊüªžïKêP€†�‡Ì:\׆^Òûï¶d,eøï©ú·/�Zo£Ý¥xû©ËÁ‰�ûûëíÌ/Å[¢²FÈ@Xœ­á”®v¥~z[EÁy¿ì†‡ kϪu!¹h¼®{çüý›hÀªY%��<€«&ûÊ­Ì,Û{j”„éX«ÎQ²šŠQ8À”˜»ÎBǽÀY€¼þWÒJΨ̲g‡_ÆYÆd˜©År£å2ïùª!®Çz.|]-9¯®J²•·òZa#Q¶Ÿì–SrɱÞÍV�„bÄÅŸr²%~ÚaµL=îýû{¦E]xÃäuüø�á»»æ“ÌF§Æ£r±à›CÛ’¼å Y…ªlWŸ ÷Þ;‡çrÔ^•*MÂa©¾>d^¨_ì�Uçc“f:«Ì9‹Eç§ËéîtP.î\WŸB}­¾7îK*%ãÛ†ÍØzFÀZ¼z)”‹g  .b@\!ú ¾é;Ñ#ÔŒLòþ•V#0�Š8�«çv ¿X Ê‹Ô]¼�Þ|Eë[Ÿÿ„uê³ÈÇUÞ•DXw œG©äÓïHEœÁ(zut[ÁlSdÅ¿µ5©ãršôS‹Kj‰Ð•²}’mïÔÃË�ë?—o}¼~ÕL•�Û´v“¿‚ní‹Jmzù˜MA»FíÍ•ìÉiºÃ�–àn~*]¥çh¢˜5³æJƒ¾Í•óskˆN×RDUDP™vQŽdvPåAÁz4j¨!Eº«G³ "½*ÇC�ƒ7]SäÍabwþ:‡ DžG3—Y_ã©" 5\¹2C2 UÀR”`›œHw¯5óh¼J_(ˆîÙ“ ±(…¢(*·œ®€ÊrsôÞ6Ó0èW©Â^D&×ÐDN†ÈË Ë¢�ÕŒôØ™�N‚{]¡ NLìSï:›X¶�<Ö3Áà¸S*1‡¥(Ä0ýï¸2GDÝD$r€*Ûš E%ûài6p}X)*øòÛµªwΤp.gľ8aÎÌ¶+·ÿE•ópaŽ™×�^z‚ã”Æšeç{¬û–°ùºr9›ôö°Z¦ *Å_vŧ “b?cÊ÷³p÷IÅûwɹÖÙ©ŠzßóÝ¢* IfîOš]ֈ߻ÆunÍš¹E¥Ròä²?ˆXžZäÌÇøï.=¤¿næ™ÿ•Û�¾Lï~û'®ÛK¨m+‹Ý Ìj‡Zœ¯ð\,Ô£;Tã´‡ªû0ïõ–YŸ_¢–YV�H]ÊŒ Ä ‡{žï+Ò›¿ô®V¤bãI3q�þÛªô⥳IKêÜ«zÎ…‡—×D±$L!EÅOÉør�³ö�ÝSçÉëÅ<^aÙE9=œœ?ÕSþ㥠½§]˜Ÿ•Îïc(0{†«Èpƒ=ûœ‡1þ–Æ^:ÂÖ‚ˆÆ²jšGü_¹„·‹49ÉÑ.?…ž‘Ñe/“G¤Jì>˜Ø§=xrUqís¹Eb¢zœ"çPOýðÏUÆ¢@š“Pº:”ÆÊ,�2ÒØq‚TXð�ú½úYˆ¦B‘U�õîZq/+ ½™wS*Ù±>ÒžHù]“Üúæ³ò9¾iöæèÄ8­ÝþÙ¯´’d6�ÅÝÖ^Eˆâì‘fA•Ì^‰ PHÍn·¾Yî ¹©jÕ*C(EíF«{xõ™�buµÕažÄE EëÌWB­ŽˆÖU:¼*Gvîåųé\7cŠ"ˆ Ýû�PLT——®ÚÓJ‹ƒƒ¢‚R™+´Ó1Ÿe–èGÍswú¥>¥¿Tó8®Sôñ= ‡ÓR¯ºzµÒy툠5uzÞP•+}SSœ±öÙ {îK‚ýa"þÄ­íM¿xº×iñEò®'“Yý?3ã¤!°PåÃñQ Z#ÍÉc|{ºñ6vÍÊsïWIÿžÄ }T…û�¶v¿¦mg™éÿ¿zŸr²Ç߃l MôŸ&^Ò�wM}ðÎ÷Ó~%ý��Þ¹, íáPpàp�Y¯¬n]]¢7…èë~L¢ Ëã2-þ%`Ô\µ×°C%b¯é­S[ r^"à Ú¶ÞS\î}bøI^Nå]Iê–Utj:N-O�T¾ç5€{·Ï‰¯‹’ácsq×Ô%“XÙ �´ëÓlmèõLÿ]ꇽè±y”â�ÒU­½\‘¼ç?+‘—|ì‚ ±¿ï¥±ÃJÁèï]’Èx‰;çe+ã/ÚB)@QÆÍj¥‡Ý#+ÖÜ|Pge00X%ÁV(ѲBCÜ„ºúïjyyÃAã­4ÿ¼ïص$ý÷sñ¢NK¾JFL8ºWHÇsˆüóV!ªbRSiâëš�8ޤV2 %w±ä»l€YÛÆ ĨjK7´#ª^B‹SP‘ô_U‡'hÔ5‰’KÞ0Éä¤K¶�vé±C,"ê†À¨.ß5]Z›¼ÌògÕ¥¢2ê»zv¼üõÖ13ª{ý§ßTt0ùrÝ•¯¯öQêÚ:·I '>MÒ[ݳé,>°,»“ç)±Îÿ Þ%>çhÞÚ ÷ Vš!hjW|d#òoÄfyŽ*žÎ¤*DeŸúyl¶`Lf†0'ïÕìIÁ´´'L0zÿ²fñ±ýúLWóÆXò�Î@1m‹wµ¼ˆŠÔR¼¬„‘g¬™vý3ûþ(œù÷m`npMü�™ç¡ÇöQ�¦hÞlþWÔ¡w=J�”�Å·úÝûÆ¿@�×OL‰ÄCÛû“v·ãEt"Ú�ùÏh[@¯¼fž—ÚÇ gÍ)1笢uÌôÓñmÏxE´FK£Jáö™™:{�‰Öâövy*- Õ�J<@[k|û£ Qó̧n:ÎáéR·<¤…Mãµ>ÔS»²C6!sU|æ)Ï·š€©}¯XÏlCôxúü²üûDШ]€¹³Üš�²fê: ˆ©­ËÃ�•P�ëQ§ýêð­{jf¶#B2¿‡„%F—|¼ªùó»ÛÁ@WMPUø=«€Šö!H/'9uAZ2½¿k׌£‘8$B¹ÜÔ xDP@š Q]ÛÑwÝ\÷Œì¾* âc €‚Hæ¼Ô))Î^P×bª%*h狳À¢òsbºÚCgzÐ*À<;0*˜Å#¦¯æí܃JH,¯�3s‰+4ÚÚ1W‡gy}’^~b23�‰ ’§!¦ L•L ã!Í�ÉáÄ%EI’û8Î’Lÿ#ýeß3ìw§Œø•h&Ã=T«~=OäP1޼¹4Œªx°Ø¨7¿3ºÍëOúºÝ¡¨’`w+ûÞ×ÜêÂãÖp%'íÔ)Ðh“Þ&¸˜ýÕß '1Üæ‘î¦ñÌÛð÷Ó¯+ oò†¾š�ŸW=µb³7Œ“ðF9p··M•ü G­³þ¹ýeÙFw»Û½ÊÝH¦f=Ê^ ¹Y|kx{óÞ훉Qÿþ�¯ÒbWÒ�˜¦ÃAH(Æ!ŒÏ}•Ã|ž#Ò¹a •|êÔ4O¼æ~ÓÓíþ=Œ~NÞÞù©?ÎN7Èh~OpOßWx=“¾xþÖ”Œ¿1bL%ªò iÞ1¾’¯‹â#l]kL`~þZ-…Gö‘úèµ–®ó)jxTÒ dÍIF))ÑÀs¦k”¿Fè‚Ýß 9ÿŒŠØa•ãùÝC—c¢Ó*Ž"'ñξވcFúóxê,rd[¸ø4^{›¡`9ò)ã�5®þÙå”ï{=_X_ <"ÆtKêHÉuù@/íŸÇ;ÀcìËIÄù ì`íÜ$ ýþ“~úŽ.½p*Œ£=zÀ†žØß"xs‹¹“Öêö3qINì OggS@ÐT•˜ 4Ðj/ÿÿÿÿÿÿÿÿCÿÿÿÿÿÿÿÿ&þ8\Õ�ƒ{ƒj˜pOþvÌ\IIr¶*n zänbSÝ5?|‰û®¾þemÿ­b´B6 9åÖÕg RV¥¼çP¸ô|±ËþEòÞfÃU¬$Y³ ÝTj„f=EøÖ²t6„"îõ5•€Ñ×y„Ü]kSQ4EEYŽ®Ÿ–nT(¨ûÖÑPÙž3 ql¿÷Æ0ÐHq$² ‘ªˆÖZ>#¢#OIÂS!C!û>ÇiS>>ÏN¸Åço ÅGúÁ((ÁZ¯ý«åy�ÒjÊá1¨i9e*ˆ Ýñw5”sêÔºÕ†h•çwà¼à(àP¾xn|•×´Ô¢†E¬¦XDDÕPÝ[QÐU¢Ã�v¥¯ªR³–ÇI1ó(æñ�=£¤ÍÑqˆgkUÝÅg9<Þ|ÏUR-3sFÆPã¤äó-N»�-Õ¨ënΙë±"â>¾=ymÚŸ)ªãÌ$ôÝ÷þ³$:F|ƒ¸3Ú‡òß=´‰Z$@@¤§ký�9f޵Æ…ÆÓL½TüŸÚ‡c4�z{A{»ÔUé]w;ጰåY•‚ÓGô}ÄÉ‚yÓ'F¬5æ¯4³ÍwµlèªL Î1¯ºPÝCs–îØmv5ЫpÕr!–>/‰ª}\*ÁB0>ù¶•Ÿq¼”•¥×Ó*gŠ02áé¿ߊ¾è.Ü¿œýEV±üfý¢áʬò²h[eíM’çKôàÕ¿®6ÎÕ5'ÐÞ~ÍHDÓn‚Ì�Á»®¼¢ ;³Ýe»þ±E4G‘9Ì.Es˜tÇ,Œ�³äÆ´ÇÄÙ¸Kþ¶ðñÙáðâ_QÑÉÓ>ŧ÷ñÕsîÁ61›ÃJò¥Hÿ§ÒŸB9í>Rܪ‰±*çÓá1Ȳ¸û]œœ süèp\Öµ‚H §GÂ)gÝwÿ­­�ºâq?^| ꋚuqÚ‘­ÔT}<^*Wv7ns·*¾ýÚ#Rw¼?Žñ¾Ž›é} Ùý&Ëõ/hU_È¡¹Ä›ŒQy»Y—Lë!ª%Y.?±ç�þµd¿yKi‡@Ê$,e?ùÕbß:¨j öˆÏÅÞ”'›[:åì¬'Çåœß:<:Ûq»‚íWMVß­òô[.[ÕRªü5Ö ±Ô¤<¶mDc+ %.Æë¾)JÊê+˜[ËøxsÏÅ£¹N’ºŒñ _Réäo÷·°v$¬®rqÔÇJÕ•«Â}œ>+ÊRæd>ÎeòÖus…€ ¸$¥Zéá^}ëÍ_VéωUˆ&7”­Vò»#g3g.2Ï:šïMåæÄ êt=öùN�ªôq¥aPoóB´¾oÏÞÞÌËÌk½ÌQâu|M#+l�ZwWÄ•—‘2#HHÞùwˆæÜ•¾�{Gã�6pÀžÖjnkYï|*O�ðŸ_ƒâý Ì�£3 ë˜Ô­ô|…Cïò$ÿHžPï‹ÎyÐå©_ë»OmGE 35»ST$4¼(Ÿî)C�E×Bµ:(}𪭈0.U!ê€H:éM5^@A7˜ŠŠ &йf‡6µ™rª}j­ ªì=ñ¢ÆRFxdMU)ãù²«©pPSªSë„ta¾•�îÓ»Îûýqvãdu"¢Ö©¦Š:¬‹UçÒ„˜ª–U²?ÿæf6óßéñ`.°ìè@õÛ›pR#Ãí3+…ÖÃQ`y°¬"óôZ,ÚWïy¨*‚�4mŽO§ïB2s¥(̲ù~ו5þH æ]•!.·ŠÉ t÷^{¶ß+©’µÔÅ3 —ä¯Ö?—j¶áåH¨WÅÍŒMÂõT.“ÑýQô÷ø<$pä$SRñ©�1À)€÷FÐ4ø½³ 5–'V¬™·ï´» ÞRSý=“r¸©kÎõÁÜQƒ//ÕþSÇpŒ�¥}�âqúIŸŠ£{tÃM¯AŸ?/o×ïùû4<ëí±ƒ†î42Xâ#ØøÐu#êË+þ5‘È.kñ®É�°[Ý?*d‚QåÝCÎí;Vn7ÓRóß噢’U¹/º1íÚ ­g¡[ÓØ[ù�›*ÎŒ>qÖka§Ù¸LÏó÷†U×Gédšq–c~ÏS|ÏÏ¥ÕK£íKŸ¿ç »|“ŽÚ)Týýì�zÙ�ç´¡6-ÓÅd�l6Õè¢*Ò·3Ñ#³n–ÅÊÁ‚ÿ¸-ì÷6�LŠ¡óP8’6\�_þö�•Ý­i&nÕ¥"k‹–áÌ–ø‡íê&¯D¯à²Ñ\ŸóFþØí3ëN¸Nòýë_~MŠ‹ø «å›)×~Ž4m«�5¿Þ½¥ŒØ¥:icï^?áØ .dv—Ôþ”¤CœI_Ä«CŸ×õp?¯ÅGÉ`ð⹿V�Jd”µf}ûÝŽXàuŒrl²÷LŒž¼ðï„X pOúâÚ4àATCªº§÷ÿÝÐgqáùø9­œpS?8‡[W>T4ù/¤r¦S¡"z}íçukˆç‰ðÛ2â‹Ézþ9T婪Œ\wU*�˜:É|À¬{)Ô×XÓ-�~ë|A¥¶Õ ¤«¼½ÓÐ4dÉV‹›¨ª„{ô�8¥­)Ôô'!çÕ—•lbVþŠæŒ82�t÷müè|ˆôçÛÕoÁ“ƒ†Kv´Qº%§õ\î½â�|Ùû¨Ï)„BTÊ&ë 3–ÝR-µˆª©¨Eu×È“¿Zw9²› ñê^‘G�.ÇYß_æõÌ¿yÙ–w•îÃZ¥+ Š<¢1D½gœÕ9#wm2Õ9ù—©®5BÜ’~e;C+uÌÑÊUš¼q[¬øXƒ:0v]âo6}Ìå«‹ÝŒ£jÊ´§ü³ÙamÅ%Fç7NØwº1S?o£#\| Š—2b§ìí5kUn†´�y\Âü`åܵ¹¤—åÀ=¥§±›Dæ¸òBmÓûéÒu\f7r9üt4iîÿ¿óv£ñ”£°=”G½t®¬ýÜ!>ùpùzuF»�À²{–Å« Eò±ù^és2œ�™|ñ,#8â•ÞÍÞM…¤Vpà¨ï7zYß§zÚȱ°¬¸VÿÒåî–îžõðb9¯àý^^{IJ�€è÷>cBá·¬±ŸÒ­.þ/ãò+âMЧa^ýÚiîSz¡t�Ÿ q9ü{Jyl�ÿ?9A*”â`ICÖk“ÿvDyU{zØéô]L65ø™>ˆà´ÉÁ§_çÝûø´úœóÂòa ‡µN={z6;%úE[ßÈÏææñ®‚þsøTÓ9·�5Û¦¹<‹N�[ Õß]$ç1йàšc&î"•ÓÄ­m˜$‘G�LLŠ÷?ä i }S»‚꽡ÞÄ�,‘³æ!ï¦ï}Z%ÁtÍÎzv8lý½oïÅ–“mj‰ÙÂ¥–cÔa•¶ò¥,zê®dèˆÂmlŠLý[ÛÍŽì$#=QSc–«äòúºuñàh0)Úí]#‹Wf-Þ@“Žg/Ü)p>ñ-µ}lÁ¨ùæ÷~áÍ—?±Ñ¾ÏbìØ{²ÖAR`mEÚ¦ä žù»’׸¸@\÷äïàéz�VX½7$]ˆˆGK#Ñ>ï+,�vz´8–!œ1ÜLþµÛL u†=}>¦Og²ßÂd>ƒ°­Òçµq ×÷ãcôÚÒ)ûУâhe}Fóͪ&àÔ¾ÞZàÔª… Ë«=#»ÿ-)- SW‚ÚBF6À¡«ÇK°JÛmN’ jHV\¸ÿµ·ÒÉ�e(©…‹ _uÎô$:¶vD¢«ªê*¹=^×/zN÷ªMt%q9Þ�Hf{’Èyò¹¨‰)jª�ª "ÂõXf�èät¼˜æCººªêˆ³À)²4À�æ®êF(ÿ–6Ybî{ ,PaRÙÎ>„édá@Å,Käá)ÇwsÊb"�Š¡“!o!u6Ür®Ö�MÜ ·þ4#~ð§‡ÖLYŒb÷«61 ýÐJs– PpJªªGÿ@èL€(N´éÀ{­”Ù¢ëú™˜8vU—]‹Ý©tý3âÐUµÄT sê�÷}hj­¡" tqˆ!9IN –æÐ^Ƹ5¢á¹9B=¢yij„¸¨¶ŽïÓJùã¿ Ù¹¿sr†˜¶èGüú:/kºg–'è4<ŸÖ˜=ºbŠ~Ê hϪ>á~•ƒLêb€gfú·@h8»±ê_QØ#/®ïúO;¡ÖÐ55ÿ?qßLm‰ê)¥ð4Ã×Í÷ÚYäát í"©†å>åØÌòËß´ûžê¡§Yûe¯i˜´Aªÿ·ú;ë­ã¦‹PnðˆÌZÏtûõ”¶ò$fôFmÿ‹/�:1¾ª›S_0ÖìuÕ­0:7üí™t²ÆÜ™-U§aCÆœTí/Y�û|Ï“gšÎIX:õýöÏ= ê¶þ_Ôäybwé1GmøÎ¦ÿô¶ºxõÙŒsxµe·sÖ>°»–ÌM§À´ÍÔ®j†W½ZHôØÔŽÎKªê,KÔ©¯�äV. ä8}ò·ÄÿÝçIßçe)°ÈM‹³*¢‚v’Xd‘8s#•½Å±AŠmq®åIíiþ|lß÷Þ‰×�å:tWº�é[ÔFhÃ|1ª½|•OÔ“»|¿€¤ŠÇ¨£ð$ñMOggSÀàT•˜ ACQÃÿÿÿÿ%ÿÿÿÿ¦¬¯««°§±ÃÈÿÿÿÿ¤¾ù»�ϸ¸ Ò`‚ÉßÎfÆà40ð×ãOŸ®¯Îÿ½jòˆÀÿúõþ¼—Ñ@|lßÜSáu#½~p®¦xŸE¥Î·ZÌñ­"ª×–Þ ž9~~¤(Ô€ðZžž…®•6Æ J‹˜‚%+©JJêömœ+ Î×JF_~,Ì3ÇûÍ�‰÷3£ò:"þð*17àì"eÞ]EÏ*u‘º,¥\ d¥Ž×oòäEADÖ*ÑÚLN‡8•Nyg.U®*A�fœÏ } S�Û²äਠȸ9'«¡¥Œº‹/ý÷ºR¼]§tªi¬gQÏs¡-$·ß*Ù)±*J³þm¿ÿ£¢úæ=ã ¥TÈJÌ�Að­õ³í22ØD¦ºäöld ;@ʹ2¦ €“œOÙ‹‰(˜cµö1BªÚ6:ÑôP f¢î]�ë)Ùh‰ \šüQ>ªfù¼E/auW•K ûýÇó©àú°7vu±Îä~AÒ÷+'»1ÿu ¯%Ý¶Ž‚ú#ëétN²¯ÕOu)hß­…dü‹”&xé½Yþüûîó_/5ßÓm¦çvŠUWýg¬án6ÌߟçšFÝ=bÓÓÖÅ¿ãµÞ<öü´O¤tÍnm¬ÿtI.t†¾Q W§›x_uØ®ðmáS:YµqÞåXj9›U)Û¶bñø¼Ñ¸ôÏIÍ(ã¶…¬ó•”V[ñ£Äb$ÏCS¿ŠsêßGúT®.Px$áË`æ§ŸE‡¨".�s—sì `¬5�Ì_Q€ðw.´ž¢JºªËºwÜœÁɈc}Õ %N¿=¬n.ícüЧN)®Òw×SnÇåîÜö«¯T¼w’¨4Ìžª 9X¢8ë<ÿ ½qÑj™@]òC•ëu›Ì=8¹¼™or @æ´<Ô�ý_‡Ï¥=XÕÿæò……ôið`–Úañô\°%jÄá¢EŸî׌7;“ ­dE_ö#Uݲ¦}jæÊ™.IB­¬ŽøYƘµXM/G]Õsö§ñó˜þ‹§gœnËJæ\ }1¿ sá´Üù1*]ìÂ"­›vNW’Ý SêL6½ƒIšzú¨ëïÞ>e"G›æ>§m,X)?d?3kIS6/]}z>ã•Ŏ|Yì=­Â{°±Æc„‘lòrô/q§vÅgò„]þ«˜ˆö½^€ÛÓ‹V˜=ôxú€¼ú ŽB(µè¸3‘jýÖø» [BL ù>fÜy½ܦ˜‡Í gbh6»ÿ`äÅw—-üý{ßµ=ìMüíëU“¿ø~pþgÎÂ:ÖÙþó“˜×_L‰o{ÿo7Ãúxîÿ0Z»®°žþ8�>1/ÏÎ:7êëx3?¹wZ}Z{ËR›äñkÿ¶s}ÜåQ�gl­‹)ž�Óæ‡Õ]\Óùc4|Ž[ûÖ]_¦Š‰í°¡{Of®WõÔ…ZoOÝ×­�FJjùm›yxV?ª2{ç:{£b1UÌûX Ò¬ë$åkâÌó£5½kwMõÿh 9h³}Ƨútn¿}ö/ì7•OˆŽÑxwfDÏ·5ÝUæœÒ*…@ FÉêW—é�TÉ5ëý?iq\ýÒž�¸88¦i͘z•r 7 9°8rò²òOÄäDu‹•nœÞSÞÏ�+Ù§©�’â1ךexRߪ9 TöÛ©ºÜ~9üüx\ua°ïÓÞÓ¹‹¦[½uÖ¸‰ÿYJ9ŸÄÁù¿[¦[ì’ XÚþåÛŸ””)´ÓÍÜZQ1…˜»âÀPuêYµk‡"*zŠ Ò:Œ³³mYëêª Ê Î¿n·„ëqˆ#ã¶Æ¯=�,†3…³¹:uÏ( òs#Kpn‘dkœ]ÄTÕRl`:è?è¨!†dNUÍ]qƒU-wlÀ&n×o‡Þ�Ä^bT‚º÷Œ”ò‹×õ4ÍÚë}+ �éiÁ¥PÂ8Q¹¢S„ÑÉù8ÈWcò¨…Éqï’|Ã-LË׿˜[B³¹TU©™kžä.Áj'•Ô(ßÓ}�Ò«C¾_Åë¡k¼{ŽÆG‰P× üóo^…›-1>µ¯|úÀP_n�ùBزËÑ�3g¬’o#×:ò{ù¥œWÂé)ERÄïu³‡´Òô¤|¤æ+¸õQÏ÷˜ÎP‚ÁÏ|B ¾7TÞ±•Ý z™$<§Ÿ/ð½—o8º¯ªä[KL-2Ö¿bÎy#ÍÄÉbã…[ݪ]R{Ö·ðGn,[±Î�Å¡î´û3ý «~jËá$àÝ6¯hG§…ZÏ`‘?¹y]ûA�}Å?­~½E'ÌÂí(_o— ‘8¶¸#B]K?ÁIue¢–QÓŠ6y›IKUL‰Ö;–Á?“Ý3Œ:ù0Ñ•2¸Tbòú›2CÁ¯ÏwvÄÏÆ>ÿKZÑoh¢s¢ZLxöö Ì¬ZÚq�·�U–nsʨÜNBe?ă|³‹þ’×G?°àëüÊ?[7|áËO2¶c¯¹ŸÕ ï< )ô  $ê”P$?\”8H2¨\ææ›êƒKÿ°z ¶wàd~eéÜ탳Êv.ó§Ú—ÚâÖñ­-κO²kùi8u9ÿ÷»–þ¢Æ¥y¤ÊU�¬èZ>RC; 7b™yˆot5Á¸ùÊæ$1¹7 yÿòqún‹ñêù�k`u�y�¢* r[úŸ­º|/{ËK¹8–v¦È%ŽyZ¼%,¥ Üççcùªo±‡ÂÇ›=¬�‡SÚ­ž£ù¨l”Ï» £ÿÊXg�‹�º*»öÚö¼,^zŽ·ë˜ñÒη™5­ý�‹ø×+ÒÞ59j¥íO÷)tªÆÜ³hVd½_k­Ë¤Nï3Õ!ÂXéóùª² T §—$‘Ô§wãU=ì£'õÄP×ë/¿4å›sK\rXÖpïKÓ3G:¯êœï»À,/Åã¸KŸ{¶:.Jì9fº¹ò§uî?h)Ü›²še ù+1X¿ØEtׇ{'¶M'p{È=Ž*¸lŸ¿ðñ¶]ë绺yÎ/ƒ1WI·ô†– ‘_Ù÷»9•(jYçXöš{—fÆÔ^HÍ“Ïç›U=³RëÑZ=B.f¢ ì¸wUÁ£?cöYÿ3´ísÅ9g÷{á‚NÊDõßFÈO놨ÜèŸqäŠÎ"MuqÝÔÑÉ?È‚BÛ-×ÍJ“i3 ŽmÇîgÎåmh·jråD/¬Íê*Šlúæw�ÿ,«Å]|UŸA‡îÃo‡½Ð®®Ÿƒ½¤)çK}k¶ìO?¼H-Ï=u·€L­ký<˜n�cm#JŽ¥6óð»�?un�ßô|üýƒ{É>†j­H¦¯x?;©YÖxëÝk%ý _dþ[ ŽÈ˜è_žäî[¾ Ð)l5‚±ðÝïêX7|cÞ½’‡mž‰;L/pQõ Óι7›¯¿®²â„Ïg]ÅYYÛ…½Ôõw¡÷›îr½=øãÑ¿]ùmö?uykn¥~,ÝÿJ>ÌÞ�OUß×^fï·�ÓE懛šÿ•Êýê—S¡–âN’oÜ£(m#!P�ªÒªyèHʦ þ¶ùW7•£õÂú ¯kQƒ+ì£æFæ~Z÷8‹Iìª÷È¿‚¤ywe':�EØ�[ÂßLù®~ÒÜvZ‡0ÏÇHÿׯ{kû~ù>¸gû¢$þÒüáÚ6û¤d¹vÿÁ·õ3Å+ù¿vwÖ”2V[ñù8“G{Cº9U#ÌÕõ„U”íÊ sxÅò©}ÆžéäQh�*‡�)’5U„ñYiì�(<–Ï[g„eW×J‘¹V©$ÿ˜åéŒA’žÒ íýwkÏúŒ‚°5•ZkýŸs�QwŸ´£¶˜E2{®`Ëß]¶þ™¬Dúâ‡ÎtÇÇ©§Üæ¯}ë÷Ôå×i1ð¼a–®¯Cì¾ÔÂò¼ ³5½ãéCò:"uM? g·©«õË�“í켯ìÏ¿§øøÈ“ÝX\É[UÀ¹ðáœ3F.’H-ì€&ðò(˳迡ÃS¼L/×o?r°_ñ,u�í�¤ OœÇÐzø<×­±Vu¶KÞ£‹ú›N{o>AûaBüÙyy”ï{œÞ.ßÃ÷{U^˜ Œï{¢Ï³&l:�÷‡#Aÿ ¡ËïmÌ¡r>�°Ž?{â—Æú¡µÞòU«»éûæqŸßÎtîgçí±ŸÿëùêùqÞ¦ë2ïû1ò¾î¨¬r–]öÆYî®Ì¥‡<¥+¨—{÷ÞÝ-0èùâêÒzF=c[š.1>ió¦ûÏÞÇ 'G0ìüW¾…Ôȃ¤GˆçVüUé©®º“ #æX›¤uåíæ7GHiêH BªœRáŸ~Uÿ¸ôIùy¡Ôrùóɸ1ÿÎï„ï'Ðf8Ÿ»x¼È}-Ü5v¾¿_»úÉ­rÌW¾è£}µ/?ìÿ‘ãþßù±_ó¿>ý‡ý_U×ÇøØË|<õeî_öáÇÑ·Ò”5Ê©¿|;¶~ŸW.«§îTNrz&Yeé:Crò7p?²Ç»ò€ö“_¬{íG�ý|dzU¥è¿é–÷²ýž”¡×«oï�Óî™–;b€�å ÿ§§+’â¿W‘®ìõc̾{.ÖC 4ݾ)×êžI-vªh1?mì?ùŸMw¿{{§*Z\ÉgZk V_ß®*ÍjŒ“€»71íÇGß­q¼Úëì+­ž/Â¬Ï ûJ»¾[û_‹}³#âã­!¡:Xò·ÑLC·2×áW–ßo«ô›ÈEw§méŸëñ’9þÄǺÙÍc·/ͬbQïØþþ‹ÒÞ5ßçµ"›ÄõZ9g·÷DU›­CÕújhFCßðë,„Џ¿ÿt J‹ýß×Í675‡»qïe|Ú€*Ùª>FºÿÏßÍé«ç~ÍfcÝZÇtåª?îUæ�¸^ ÿ›u=tðÉmÅ,?XÛ[€¦ÍÒûzË\KlçS¦©Æpö!ˆ'eOï-E8…[[êtu¢è¿¯?Ÿ)%‚«TE™#*€²¼yíR[qÖqõóô°b%úQÑì©ÏúhR8bqNåAP©œƒŠˆ*¢)Ãn¨¨0-fŠà˜ª€ÔýÐaÎEEEUýªŽºW™Ž*€’è  kY'ZíÍÉ%ú ´Ö÷6¨ê õ•¬5]Ù‰†j¶SšõŒ‘ tÉäÑP£~ó8>ŠWS^Vu¿ô¼¼rÐÿVCúùx•i}¼5ÁÄ í�‹Ok¶Š’�C4)Nq©TÉH 8%�aÒ«w§.œúÂèyûüŽF@±EØ´¤Ö–ê~0ªª ï/xí^¸ËhØÓÎȳp]Û ›ÝÚÓQ@ÂVÔǬæ¬ÿ8æ’‹¹á£]óÐ/êôG÷…Ãú÷]ï¶‚|(uèÙ¸¤‡~¶¯:x‹;ãí‹~DGiwÓË=®ÍÙO4þùþÕi«§¥kŸ˜(ö*®õ3 Ý ÓŸ®š¯Ë¼4ÆM#¨£«qÝó©Oñã 5ÕkÇÆ®¸Áïêã0ÝÃ^iÞ�/<¦\�Ìcá§J–\Y9ÚVކ~Ê{ïVÍÈ»�§I~öÞ±ÏÎëŸø‹iâîXy”Kdâ­Â³Ìјæþ�xæö–DK€Y’ÝB¢™^Ó5�îé*3ø|о Wl­Ð¸=U¯ãœbg (¿=W%ôÉ��j"{lü$aœ‡éÓóüõÌûïZºž M­ôp„¸£×`o³O®På´1¿ ™ßx€d\�@Ö,ÍîH|[ä°“®¬Ÿ¨òè–Ì:zz�ZïZ[µY*Œ>‘ûXý¶[-â/"åkäeÄ'•Gž²J'ĸÊýãH•bKÂG_÷A·ãtmäeî°ºÚ� ¾OOïéѺùIó¹Ûá¨ëç—V‰¯ÿcR›­õŸr!ý&ŠÝ?æXíÛÕL·C�šœ36›úÞµŽzèq 7þ:"ÈÍ/‚GMµêæê¡O Fó.܉é+ž6»êN6JœzCŒvþšó-v¾+ …ûÞ†=CˆR)ûÞŒ¸¯ì“¾¿³„‹I<›ëéôŠÄºý�HãÌ}©ŠÚOõ´�5wu|¾vØö£h ~šÂ$J—vzÑGö.×SD³árµI~þ}¢j,MºÿŒÅÎw×í|¶«ÏyZ/÷Ò­6¯Õçó¡^ ö‰­ß ØvcÍ-ÍÙOÊ?ñ,ìRÆH-dÛfÛòOggSÀðT•˜ cP—ÿÿÿÿ%ÿÿÿÿ6ÿÿÿÿ+ÿÿÿÿ9ܪï¨,dÆ×EÞl¤Ç“372Öö.(w„õm粫„iéH{ŽBÞµùÜËDô^ ¿ÓDÍwÍ_N¡×È,ÚHNέôà‹*ÓÌmB!+ø«V3Pçõ­²ê ‰x‘Ƴ$‰z¾E Ýå\ z¯hKÂ�|qÿdçMéããa|.P¨ÿ ª-±g:žŠ|’ Nì<•U‡¥u†�e_ 편2+?jWm:¢$µ*G;�9Ôú�|Öb{)äÕÜÞž+O÷lrœ¿ÜO9>¢u�:!s ’‹© 5hç¯iÔ‡ÓSUUS¨µFqi²Œ–ÕÅ9F‡mÿH…Ìz=2ÔF {Ÿ+Qü<óÔ1už‘ßùêZ—­{¡£ˆ³bóú†Ë¤¬µhêú$©E$\£¯GšM@³Ôk^ýŠ›?ÈçJÑ}Ƴ]{Ël+*±–7i=á‘?¯Êº<õ¨Uê"UfžYŒ²¼nµ¡ê÷'vuï·æÞÛ¦­æú©Ñb ‚ÙQhÔ† ×¾„f³ýs»�¢+Ë ÃèCz€Š£ÏºKŠ˜V»n›Ð8En¤›ÅΖà#«ð„¡T„¨Ý奈­Í ÿïò�wPX;>ÛNT4ÿ‡`ÌÔ$õ\EBxsó‡kDmdWvi]yoXF“3§&ÛBÿB%{w†½_ÌÅõ3Ü•¿:ò‚N›ÕìL¦>ϰJ¨Nn†3 �|ݳ6�:N$öm…{_¤µ—ZÕû_¬n§7»àw} ÷žÂyRY¼63ùLÍöÞ=â{ßê1°¦Õ^¥o{–Ù®ú|//¦ ßl¶mçªÚ/$VÛøW߈$Œ„±µ�®^~�þî?wÍ¡¢ýëO¥§ÔBH¶ÿcÃõ«^?៛îš�í8©ëv.s_Ûï�>SAs8rÃ�€¾ø¾ø)÷½P™°–?ÙÍ´ñy7Ñô§aêk�YÚÑ#üOž]Þç6ùe6tðôÂEÜ7D04’ ƒhØp»òþ>e×(ݕڪϿ‚Ü£ƒÛ¤Êé«–"Q4Ó+¾�_#ýZOCŒms �|gYêpÛ¬?y�ÈnàÐiðĈžÊS>FÚ‰¥EnÒù>ÀPpÌx œë©;ëâxÙs>æZhƒœü��sï•bIx–QÛä}¬ÃÖ¨S×A-›<Ä$ÜjËMäРT¤÷ÉØöOçãê ZÛl]Í‚Þ}ßÀ•–|Mÿ¸ŸÄ›·áÆ6|1£¾©Z%ñ™½UéŒÉ¸�Ç/ú¹”lZ6²7W‡ÈmŠªž�ÿù¥µÅë½y˜j"êŸ~Da³/¬µ²ò!H¯ñæÒüÿ-T´Z||ËHRàM¸áÚ—v¹`¿!ù™€˜ksÛ3N2kkÆ›<)ÜϨ7#0·bxwKöäà š/½¹3ã‚ Ï8$8Ú5ŸÊ±8Ùæ6PèÁ•¦ÈmO½­H×nrúèÚ!')´OàAáýç·ÇP ÿýšcP�­§‡žþÔ1E" ƒ½²¡Ù13;ë(­)é|»Ñ"’G7*ˆz�Ð2LʤÍzÀÒòŒ}_ó¶ôwÒT¹•²Öá½)'¥7DÑaˆè ûµ] ÕÊÁPs ¬•¬�˜{}Öl× ‰˜«\§ãˆ*|œmBLyÊžVO#g­")Wdçw�íKНgÎWTRE8’n:Ž#Wdƒ !¥¢]QC$�{Õ8-9íD�«¦§Ýލ¬£Ôëtß5Ç7Ρ 9Ç ¹;è*ÒÐx2šËaÉ¢*žÆ„”,ïmÿæÅcC�ê }´Š"ÆX´·=rï$ 1•ÚGŠ LŽƒ¢àÄõ™š8œ�ÖJv7íÔÊL̰æ',‹ÒhO×Õ¹~;è‰AU5 Ä*±ôghƒG%¡^œ•*p’Rg ·ëÀ=Í$Lå~Öò¹8ô¦¶þõ¢åñ<,q{Yoæ„ç¥ê›ïeì˜xÙ#ârmU¼±¬Çÿ> j+/œˆëÎŽÐξ_ÞIé¢ú¸ãâ9ï!*ˆŸ$NL5¶ÖøúÆìªs#Ë'}ó‚ÏX‘ËS=,uθÃ#`ò”IUn¼¹¿Á&}ïNþà”Hß^³a'¯–g û�¹Ï é¬í–7¿X¤8/ïOO€ýùgu”u׬‹˜ºÝ÷jÈýì‹Ìr]±T µÛfõ:i]ÇŽÞ£P…zm9‘Ñ–?Þœ‹Ý*ºGp f~…]Û†ûwOÉŠßKË�*ôóßy~f2Å™V·¾µ2¦9GJ.IÍæÆ\äéÉ8øë—Ý[3®á]ºgþs¤ïëÎÏë¦8ø©À<_TóåÔUþ[T» ¥ÒFVR=£•Žü~¿ÿzö³ÈD²<#]í%Ìl}ér5àTÎÿSck�²ÀNük,¿›Æn/Ý#†$�ÃiN$›NªqáÿèÇ?x³9©š=›D®A6C°Ouy†nþsmDbk2ÄçƒsÂ(ª"µ?ßGûÏÓú屫Y|§ÝSÛ]uUÄbÓ[SÏÙø:M|}‰èc¿ŸžÍ ÒñØ[ùåþê2?žW=êD�×ãjE©ÿžÀç'PË*Øà³<}ךƾÅŽÏŒT)𝏄y_´×³¥Ëª1ø*ozñ>›Õ˜ýN©»ó÷³µ™Öißqkc»CÿñWñtÆ>÷ö¹±´šytl·1gyÁSÇ—¶ì?Œ‡üq{ïýmÝxó�ŸàÚ ÎŽ|.K©…§U’§=£i‚þÜ­gÙ½�}ÀÝÈ[¹W¢¨†n@ÚÓõÿÛ;Ú1­ïSvÇ0ô�õk;Ó¯(lM}þÕ˜;î ~í©ÿ…KMGnÓJ¿P§og1–½\à•Ž({n´RkkiNkWà0â 3cNPéÊÐ.Õi…kò›�ѱNF­’ã>œ�S·.52«Ìå­† ™–Åv6AY�ÇúFm¢Ýõ¡š(语¢ªªÔ¨Pg¿´nok‘¿¢S¼µ¤Ð“UÎJ•Z5ryÑâD˜—oY®/¯qÞÉTQD%™®c^6Ñ,\þ•¨:q]=ì‡ÇñGו.â$âÕspTkö%yæ�FÄ´%:ÝûË2‚èðñù&1g\KÏMó“��e8ÿÝ$Û¾p�8N¿$é ˜[2pšaе$ètÒÜhÂ!'tUqz@DŒZ.Ù{(À‘ë¬á$ë{�!˜…¡cT Ct®1(…NÄA…½wCW^BåÔèlüÇÃÏWCG¥D”Øßë|Rþ›n´r.1<ž)”Ýâf£*û¼ùÈghatì�X=¾ädˆà\„ ¨ð¤0{™Ô'Ç7Œ1¬…é%�÷�Ø…O°§fÄ1D´µP”*;<‘ŸPJXl:Þ=4ófuïSœ¨uœwÎÚÍN7MÝ+¥\4¤�21¼;1Hí¯™û�[7YUÚQe®rv<~î­�M)Z|MUŠ­ÛþürÊrÍ›a÷gBfáM8Xô­.3†¢¶±QßMüãº\Õ%²ÏúÔSd�,“Kû!ZoES‘­P)­'“;«ÍülðM=¿$7¦ý8ÃÂGwTO_TôIû.öý——÷wA½í<‡¾¹R˜“¸Mr›«1�"þ§•¯ö9JOÜüÊHƒ2=¥tMDîúÌýìݸk[ðÙ1Ü+›;t»®ONGák›‰Ã¦~ÿ³ÒœM —ú•=ðu¼TÐ|ˆÿ‹ZÞ™š×YP{¦ÓzwÓ½wóþWä„ééÿ$-ÔzoûÚ¼Y“¹Éúb=³ˆDIéBa iÏ1nLO<þ4iNÈÏJ—eUàn¾ÒßÌ»¹NnEcòìüy²Z/gï±N<$žJ“@v5â·kx�xöü¾ ­‡ëeíÞbn»ÙŒ&Œ—ÎÄ‚7wÞÚé ßDÿÿtà>ÄkåóS%vxl¹9‚ëè >-ÆžG/µø«ü7Ôáæ¡ú³k]Ï#T}fb÷³ê�'KGõ.òƒYÞ{wÓ" èNkŒü\ –³^çZ:Vý3b]íí £Ÿ÷ô‘±¿ü¼åóÕ¾Uú_Ç1ïÅR/㼫G3ºp®À�ë·z-¥¨Qm!)Ú÷öç½¾Öºhu–mÞûâ\†7µ#üÆq¤€ßÐæ5ÀÁmw¸×ƼSž«�œ7`ÞÜÃ�t Ü‹¼É~¥û»Mà@H\?[*�o£ï^”òcÛ�ëÝú5‚ ›I÷ïé Cí]ôdBÄud@ ªù�ú"Šñ¡6ºjRËË•³É TÕþêTq#‘êÕîëcu�•æÙóHOˆSçNÈ�]:5Å|­½öÃ,9˜²dùÁ˜'P‚÷­µf!"Þ’‘úÔ’ÅÇŸëGU§ŠªŠ¹x¹úó͉EÎÀšÊàjž�Å04*-Ä|ç_Á™]J/SÇ4E,(CGÆ•2ä¶'SØÍ˜çó‘è%EA�÷ìérT�PˆœP‘Y¥Î€ ú¦"l :hÂ.qT•>€Õûñç£^ŒpV×ê\˜-E­årFÀ•a/C2øœTT'+‡}ZÆ7æ_%Ëjñ™¦¹ÅOýšrÆbÌ·Æ&Ç8½×ÒŸ‚ꚟ?ÿk‘CÿÞQ�¨Z¦D…©%÷�¢Ðœ òå³³ò0Ô?¥Äõ¤F6 «,V„éy¯ªª¨ÉF®J…¦&Ù*`rÒùqZ œ“ç%2?XL´BÀEPµÑuáóÉöÅ;iï_¬F× lZ+?NPKIFúš4k‹›à¤›ù®ªƒ 1qwofo-gïöÛV$vÓñPUô£~�mŒÌÈÜ£ò ûÕ'õGí¡]jß“zcß³?çTžÌŒ®Ô˜â;šù<öÔÎÏdéÛHM� sàªËTýøšrnü×r/ͦ|ŽBvö€8?ä39Ü ßµîšÛèNJ'ÃF¶<+â1¥ ›ïýßr›áȬûÑÑÐÍÉ8â$e™{8o½°‘¦�dÔlj‰2%ˆ• y¢–Ë(Å·:ïï~ŒjÈú*zŠ ^‰¡†wÖôW(çŽ [²+:“ÝklЭªÿw5·¦1Ÿ…~W)Ë2IÒœÿ*ö›-�ú̇a'Ñ·ï¹í&GOÚŠŠš”�ùq ㈒4Ä´ZØM¸ÔÍ3ïÓV/ìäuÄ“m23/A€ÇãØ}êg:F¶kõuñê¬Û4ZüyÚõØBÎp¶'svf³ˆ{M¼ÑQmm¸/Yc¿ÌwÍ­vß…h69”´ñä’ÇÝâý¬Ÿn Øÿ[KP^­ïÁÔ¶HÒ³‚z)›Öæó –Áî•PXñÔä⯱’rZák…YaA~.ªg ÊËoË"Ð~͈Êb¬4lr–ûJ_“¡Ç‚†Yƪ–�³XWa^é-�T„êmêº%â.uªLðX€C‡V"û�g¢Huuìÿ«’æ€ uVb &¤mÔV÷ñ}½½îÓJWñ=Ù¬v ·_ÜfwsÈm;´½\´P.“”k)�_EQ¡)Ä„OggSÀT•˜ GõÏRÿÿÿÿ"ÿÿÿÿÿÿÿÿÿÿÿÿ 9Üù�¢ª]`ƒï‘·[¯¬xÀ°òû÷•ÚP%ÞÝu¯ëzÃ[/ê<ñ©ÏÝ®ÜqpzK÷�pÇtöL­{™Ó™ÚKz‹ZC•>ð -›–{B*Ü« ¨ æ#k­â5£öËU§¶I•ç³ÒMñ*5¦6'.º¯ÚZ,kïDNYŸZ ýmüÖÛ)A#ÅåcXçb0ÝØ\wzÙ«è#LR¤×ãDRõuù—f€S8€t{Š,„øÆ}±®¼Šh3¥ç(Ѝ¼¢!n8s¡m€Q[çVz9¸ÿÛm+_eþôeA@ h�e8ËJm*eÕ@t/ÏFå<›Q�ž!S( ²ñß«´ µ~íZĉˆ#v �HtÌ�ý¸"FÔF>ú±ïi{8Ìv‡ö@‡D/7 Õbž/_õ¿’‡¢Ç•�úÑ�盜ÅL kAE¯ N‹²ŒÑûÍKq|„œn½ÔlE(¨ÌÀz>L]¿$Ú³,ÂTqÐJ¨vÃ(=Ý‹È"õÙ‰40¢ýèÛ,Ý�\k�CiUy@€¨$¥ÀøÂ& åo§~åO…dHýÉgÎüAû3J½È” �Ž@y¹± OU§Åµ¼Ïɱ69�™H0ÛŸû±2öóñÇm©¬ÔÂæ ,ÎËÉSíumg-Lp^ã8ªÓƒˆW-xšÃ)g½“ º˜AE+–Œßô¬ý좥 ö¼î·Õ´«=6HiÌ}X¸¯»÷7Ò¢Ê7ÄÜþÓ¶×d’û’O”ND:Å_v&ž?“©âÂûМÖ|Ë… †ï•OÄ\öÖÖëÌ\¹|û¶öʸºbÃlŒC;)�¢0nKóÅw6óî �×ÞWƯúkuGš¨9×÷r‹ ˆ‹ŸŠ÷í•'Gݱ ¿þ4›‹-ÔG_�2Ù'‘I¬’Fn±ê܃õïäúsë®'êYõóµ±åi9X}kí+G1¾A»Ù‚aWü‰}¢Å±Æ¾AÕ>o)B� ò݃÷çµ\6¦>@ªW‡«+çÞI! ]½Ýé[ŒÔzZÖ(Íþlì§¶x^`£Ïüw Öøå¼5 [çþ=‹U9UYÆP™xÐg e¤'Wm{�OO¿ ï�m‰•Åüëû?]o8;pk—-|!Suý ¼W•ÉvNúIÖ ¿ý^»šÜVÞ»%5'ñ‡4V·|’&r„OÓý×z8]ýJ÷i�{�˜ÐíÑpžªSb«EâëÈh´.ȲºwP%²jù/“zµ]|hõ¾šÚ±|k _÷„IÉ­ß›´šíô­ñ¶¥¶`]qý”t²Nm{ù£ ¢ÅÅrÃÅ 2´,Zkžt4lcú/sGòú1AÖ)?ÙIš™-Ù{L ¾(œíÏt ÐÀûÈ[ÔgVA ,…sËêÿ/n Q©!Οsê,îÇž.þxœ[-µÂ’épšÙ¡:ñWT¦£ïR‘agªŸD„¢ô>®áAw5ðfÅéì(£§ê¨æ¶¬òÖÓG±ÜSÛ-ÆI”þ®¦:CÕº]+Q/yH©‘°T1n«(U‡/¥P�ùÙ['¨Ç»ç£’xž(ȇwvVEg#~þ-U-Äýá—5U@ÕUª7®�“Ù�¨†(Í:D¥‚S$]ªùE¿@ä­=4 »@%åìuh‡®„þðÿßêQGQ|UPæ¸U*ÚUÚèú?áQê-Ò7OA Ö«fõv©ÙQ/A»¯*µég…£'ÐGŠFÄyjK;Љ1ÿ÷÷Ðí¸š­Hhω�@ufµ`XU)ÿ¬G²v×ì˜aFK&-Ç1Lé¥^}³DiëêÄæA_áÞ¶-8D:Eícò˜Ûtˆ�Õ¥÷Ÿ™RQ ÖžÊî¬NÒ�º*¶£á=Ú UíЯ;#׎ ú:–RË1g`üòÙnÑM?By]´ïšnß®õ«Ü“ïoçj‹¶Oö\Zlº´Å§ ·gî¯+|«Kvâ–ñüê•Éë‰ý£Ü»÷ȆbÚ8§Û˜;^XåŽèÒ½55àIY‘oœŸ»êß|æm?ÐÎÿÒ¨`>™üK�ÖÑñ–; æ(sn' W¹þ� ±üøVTÄ긫|VÃ1¼ÚèŒçk椵TîS ˆd TÌÃu¸cà;Ö¸ä–Òx±?7 )Óú nWI ò“/>{S#næ® ^.FQf2Q†Šé€fk�ÊÑVÞ+‘ ËÉòßîR©��8 ºCªù6˜ÁlsC¾ I³I{æP…kÿíM•"÷éÀýÉÿá«\ˆÖ ü•�t¶”–<2æÀöÒz…‡®5&Þ ç .­›³±ÁK}k;ˆ“0ðŒÅÐuäÂóx-ÕEò>äîÌÞ_ÆYBŸÝÅ“—Ü%óœÂðãèCZ­¯‚«øãyÉä)k2ðÜ’£@ƒŽ�vSŸ7ª+ؽ8 %â:;lƒzžÖU· ¢®=ô²©èœÖ‹Ùû¹ù*–+XH.q¨¯ãlpžåE5×·k‰K yà1ùôeÆqr‡˜÷òˆ‰µóû.%Ê•›zµQ#®´:.“ó=xkØòuÊÎùó>æc•¬\½?éïÁÖé®OÍ;ý[0ŒµþVÃD�¬»®#€òœ�žYv»’a³¹™°Sy•Õ¨#cºÛKa5À¢ºµ«ú�øbí- µHF�ã•î 8Þþ VÀz››Ðjë»`‰íèVàšÀ{¿@ãdÒÖBëÓÊope0ð²·�·�ö 9lþ(\Â�b§¼ƒ¼~6O{ b 7Àt¶~ÿÃêÙ3ÄêÓÔíŽgÚ«ò_†½‡Õ)ŒßFHu&e²©uú!Sv´QsnŒ:M’ªµý x:¦«®^‚�"ŽÔŠ0¹kK¼ô–*U¤Ö2îDM�¤üX�(`ý«�˜ùü}ĤO*‰¬äzwIâ•51ÚÈHæÉ�Õ#urc}w9Ýçæ«Yߤjtâ@N'‹"јt–T‰ã3Ú Ã•Ã³”nõªä——ã¶Ýs�Ü%÷ ųÀìPÅ)>öJÅq�²cªFjí¬®CD©ëœÏWÃA»89yºŒ‹tšƒ5µ°Ä°¶ÑÇ¡þºú˜n×8Þ—´é©ˆˆ¼€"jjæJBìA€d] QU;îãï%øŸSì‰}‡Ñu ˆ¾S©æçkýneâÚ2…Æ0­bFtØ®µ©¶ÅfxU Õ¨]Õ–#°3†£z"5¥öNu)Á°­”JŠÙ±Ó–ˆœJÎ(`*dê¤sF"ÇÓ¬’Q’!ÚÉ’”I±ÿ]œeÝæÛŸª©ƒÓ\M/+üüË}Æ'Ä“Ê&ÿôêNp*A·>êËÎý3‹«akL@?³ã3—È~âÝ1ú3õí–ijn›”ik`/ù´y�ÔÕÝêÏùy“ç Z&oíÞÈÓz°|JK•½Å{yÇ©¹};i;+œ»}lE;¦Î¥Í‡= ª'/÷œ‚\÷ŽmÔ#e�>çÇ‚ôM}µ{ÌaAMÜÕ_£úDÔ�ιZç÷ýòuÞ µ­û‰ñœgtßï ×þ—ÏíÚ#Ô·c»Qq‰òÃÏmÜ&œ݇ZWêt_5v³ÏTBB²ÍHZãÿÕn]êo»Œ/ÌíóàÍu[Ùõ㌴3^„ ;ŽCYzá=3!RjV#ít ÉÉ�ÄÂ÷˜Šö,�‚¥²:©æ]zýC_Û@Áž—qòß3ï¿RîÔ‹aF’É+;%:)ð­“ëÎà@Ï_‘’F¼¿vj1ƒUnãèg6æäëYEÖ©ïï“¥ºI½Ó2GÈäG‚tOÒ8-¥åºþžEÎxìãS¿ùÍ¿4X=ðóc#cµÌ=Çà§¥ãeËá/qŠÄâu†FÏý¾ÿ¦<Ì\gìWŠO�’$›§¬‰;ùs]G‚KIÑÂõê2�_ÛeKñ÷5 ÖSŸUj§Ÿ*{:xUÑ÷Èt¸©À¬§™‰ÂÕÆLjù“&TÎó¹)&½œš¸HuÝgh,Iýv²}iú¥b‰(ˆ:�œ®†E>ªíì¢<ž˜~Æš{™Ø !°1ëxˆá`6±ÙölÀÑ|wÛŸîÀ§Eœ½àе  T&&Þ(܃{ºOt„-Áu~äí™G#Pp¹ -}ÕŒ®Û öÆ |6»�g ,&tKm´&²ñMó—“ìØKBã"‘$½�êI…/Ȧž[+ç )r�Ш~ðƒ–uÒ¨sˆ �D=�.¦ŸGu8ùME�Z'$ ”–&Ó,'è%@{óŸ û(O3‰Èóù¼¤ˆªÐ¹§Šh||ùïÆSOú¿¿U5�H¶ï­DY (À¢Õ4³í5Ì"2 V3\²s?ãýËr¢§Ò<Ê¢£µ{GšK÷¬«Ê 8NõPÄ~ QÔ PCŠºæ"€`è©Z¤õïúr~*ÀS”øÚK²DÔ¹«'zÈ$޶ ûAD5è£Qí—T?CúÌÃÕÇ(ͦ¥€*VS¤àõd JŽÐü6…©@tä©^§:€HIUæ Àce9›!µáJ ¹GyŠIâà�ó|ˆY˜Û®ÂªªŠEo”—ž )…Ì’ypfT €*Ñ\^"@dTœ3‹”H!%�T� _Ý;å(ÀB)°4Ïèt=r Z<ÇLI)F;YY*,†ÛƖúÛSÖã2î.^‘�ø-ïÑ~KOò1Dò‘åDÌ&(>Êz»'WùÁd3i¬Þˆue·ôU&p™2r^Ê9ëyDçÏâû•�ÁGl½ãï†6xì^V@h-2·ç”TMsj{bß–T.'·Ç'É·³n÷�YèÝߤMõ-vbP9Úñ®„Éý«ØÆ¦+ ‚Ë™í ¡f>~ï÷¥¿ñ •AUötq2Þƒ.¿¶(PC>„Ô‘Ñ›‚vÒ×—ë¢à¯_ðß'O0ÑÏ4Ћp@qæ¥_›F]sû5NjpÝì&ƨêöJH–{›UN5?Ø�x„ !7œazíæ¤‘u=ᦻ'…)W’Ì�{B:§4’ÏA•K,Wì¿.yUUÆ5çÑÐÙÜ®(z^¯¸£¶Öê}ïÆôöÖ8’Ñõ–°C�˜@wT¶dà.†(ÀxŸ`4¶@Œ(¬{ve<×_Þ|šõšë]È…fX¼(rU<ÒûLËÆ9ÄZÃ>¹lîË䌗\ù?UtªK•ŧM—ÝY~ßܨôÛ.£¬×OéówcÏÈV+¯Rî;ÔÝFf©²M�þÓÙ(¼’\Üåê&½‚…Ñï7$ç®;þwë\R�¡&½™×”0_§)Ë|‡}w)¥³_ZÜ�|sù1�ß-?ðjžl´|±’Q` ÄÜ¢%�[g+¹��âvõÛmúø6Ó£º¯†#¾Æ×1›bܘ¢ôÎ"ä5f†mn2¶ÌOggSÀT•˜ yé!$ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÞ(œ­Wz-`€ëão¶_Yý!ÉØÂ¨w{é¿×…;(…;‹v¹]‰ex:^«ÓTp}Ðú�A3¬M�GæË„ìÏ ÖW•œZ”¶z2$<µÃîk-dª{�T¡Û'©¼»½U&­=h]Rñ ÙŽ—’-_=޼ª!Y§EAÕ;®Z}Œl¨µÖe³´w+(@é#`ªðþµ¶$8²N ‘€¦82PÐCºŽÒÙÏmªÎãqÚ�ã¡~=èÁrÕšúq�ay^¿¾b|©U"¨øûôǧˆaXVÕ�!Ý Á�ùUýx1‘êäsæìØ��äyZ»Vç3ÇŸ´"bBKDjSåTÐ�ŠC±;YK‘8ŠàT'E¤¯ŒÃŸ3*æQ‘èAÏFEÍËjRÞ”±Ö_%Ub~Ö«½hÿÊ£x &+[›+šãÈûeqë¿§O@Íî{ÐÖž”×~yûÒ3£úœŸú¯NŸQ¤!±ß\kž:¢¯CmÄSú«€Ð…œ8ݦÅ!£ù À"¤©÷G>'{úÑ)¡ûS‹Q•1c>ë*áÓ’'®6‚!x2îÝ�*`(½ÂD®ƒ#ºö]/gtûB/ ¿fúçf´?Q�ŒÑo�fÿ‹½-É×ÐbàkR¦…�:ªèSek™Ö\èë­§ÜÓ‡´6v“'�’´˜íüÒFYêib,UÌÕÖiý<œZwm­L*Ï�"þ)U´ðñµò·P<«Ø\óOò�Æ[Q{% ‰•×®YT—‚¢z×Ĥ»–èA°t× Ñ� t:Ä— �ï·q�Ø«RIàÉ8’º¼Vàì±�üXüâ,E•ÁÜ Tm0ÖÙÈ~dÊG"ÚÖVùS¾Î $Õö—O?Ã¥/ø'‡¢žúã6Ÿs{®¸¡›³�dG<¶—Ù¶4¡ÏR—bs0¬)ëG?e¼hÇÄ�Ñe›"- YýÒÖ"†C€ó˜Î÷?}¼{|n)åÐ\Kyº6qû¦‡è‡³wz€ø²æJ΢˜ãx_µBjo‘õHû9hq¤GqXY§ùUÎ?{ª/Æ–P/N@BÚ!^N!܆ÏRgïÖ~�jØÏ*ƒypC5Ú[é@+?ج…œžœ¾Z”c|ýæ%RiI…~ÉE»}ŠF­ ðjvá DìY•Œ¦v}•z¤ Bu  ²#áTÕ“ ÔïÐæÄTYS¡Ñîá"U–]Ö˜ý ¿¬¸Û[Ùí2ϲMB�tûÏïï+Ù©å;ÍR¥¿SÄߪ5¯•,‰Õ“™×Eþ‹UË©-F™Z<‹Ï„µ]¿W7T'o��Ÿ•Q 1÷D×çËÃÇg«i*Î\é*gŽžœ KéŸã¬NÔb"‚Á2�ãvWòçÒ›ÈÁðˆª- :§N©”bÌË"šaY)L7ŒåPà?:ïóR×ÝW5ªÅRÖ¨ÜǶk˜† ™Ç|iR´/ép@„>VB ?>^»’Ål÷7êEƒÖ¯ÜsÌéóàÛ7�6!$H� ~á7™f-8CÓÂÀÅWÄd÷zþ†bÛÒ$Yá·ÅfõœAÁÎ:{{3e÷ݹÐÿs´åö�üé wÔÿé’N¼üÑMÏ|3í ‘x/žÉÙºð>�²/v“V]E¿¾wms}�?ï…­ãcøÏ‡‡ý¯1àå ¸kÑß@ÑŽ‚8Ào_ w|™ö0Ây©ø÷¤sW4þ]ÃnT­³¢Ù²|ü¬ÿó¹›F×Û�K>AQœÊ‰þ¾}­�Os¨pÒ˜ú»$e’XúÆ:Z�¸Àþ×6¿öwÏHмn½'—wš­.ÒT™Ç9¿+Q³2»>-Õ–šâ¾èÿO6>>Ko6¸�ÒR fj®‚ÿ"_øÞ¡§‰>3¾ÜPÛ©58èQ7Öæ�¿Q¿uTñç_tûúº� ›ñwæ-Ùë„|5�IfCâ�ÐX°¶ c”­±gN.,œ5Qê<‡k´Ñli_¾Ž—qHQSøa¨N|ß)…i}D 5êæën®Ò¢oÿ„¯ DVRÂÉ×pg1ïÜ,TQYªªÒØ%&ÐåЬ h´_vÒ-ùèp_Ê;WÉT+�YVÎ6 ʱ¾›Ôç÷.µáÿgYÍœòZü¨µíp8ˆM6žÍqXž'b\ë‹£¡j�{÷y.|»QI’qVVX)ÅÆ—0y O6?ßq¸ãûØ{Š MýpVóÚÚ%Û;töÂçG¢»ãà !+s¨äI¥á£ÆämÛ”s3‚2Á�2i€Š@ù>þÒN'A!ÆSÕi\‘³.[ýF�Ú= *�p¸*•÷P šú�ªPƒXß§ Å$±eŠfqrQ…ÔIR8L%EÙ“�<ä¡o¿e@µn+µ²*’5CÒˇ�:„}ÖN‰�~ ዊèQjWpæZ©ddôä’•ßÅ·‘uA�“-œ)@@0õrÙ‡ E´+P”ÆÙ(�èé²ò$[\Ñ:zH“Í””Ý *t5*}g b“ýD¢È @XkÓ¬åøR«ª¨PS† SJ¯¦©ížµµŠÊ’iÑzUŸûǵítž;µ+5ªT™åñ<.íéPm5 c¤PÍ¿HžõüŽJ‡”NJ"@Ð3ýP¯à}f?‹W—,é‹À…à5õÖˆUÁlÕC8 ˆÄ…k#4œ›S‰,ýPÛrEnÀ°�¼�Óþ·GçA»ä;JêùüÁªÅÈ9ǵŽ0ƒ¶úp²…o‹ÂáÙKÐÝ›;Wˆ_gÉÞôÒXbŸÉÕ¢h6�nÂ…æK=va¦™÷V+7:¢ÙAò|[fY2'÷#“çç{¹“Š!GÂÉ�¯¾g>4VÐÚ�®ÒÛÄzð)qºëê^¬$ª{$µ¢Xl·ŸÖmò³ÝâÂ8zšN‹<6!›Š>^Q;˜ùñt¡y£ÏÆø‹Ù€Dqü4*È»·ž—ÔH½7s0mLéxþ�"¡»ì:ŽI잎*ì2©˜¸¦›Ð�ûaWÑÞPÔü²Ò:¦S’é•Âr}˜ ’½çn—wúG¼×l@8LÉÔS D°¦ÝãÅgÍ.Ÿ’lRÂ|»Nì_ÿ�è¥yFïœÏ›K«yt/Q8{_¾=]gŃoÛ‚ähý-1i0Qn0äg‡yw«&<}aÍdå6¹XÜo§ÆtN,AÜ?.¨íÏpÜôZÆ�±œ©+ð¯Üõ]xhV>È)U†ý*0l4µ°Bá=:²?�Wþû»^àôw?„ù'U«ðÏt÷v.—öÃXg,ÐH~$ oÏ_Í¿nas±†œ5TV éõsK¬;PD­çÈ� Ü’oá›�½Inz²:ÉFç®K½WÃ=G-¡à¨å{þB\ˆì=ÞcüTÖÞfq¥~O„ÿ1kTϫכêÄáÍôw>mîúñ3kw þ¶Ð¦—õ8•µ3ŽÏ]yÑÅ5\4ݼº£¨˜[mA’6`Ü'’YÝ_¦ðµ�sàvê¾fgrW\ÄÐ.y©þe_Å‚‰~3Ït]æ÷%ðÆ?ãÚ€ ®WÀ,¿ý¿ö£‡f”†6^W)A>º^-Ñ¥ƒ³{j_n ·ñ~1N x7àí²«Þ¢�ÚåÍë ¯JŽOΪþ!&FC’û†@ÿz…še¨ž;[ ]u礘Bß�¨Õñ˜Â“}*ªT×bîtQd~•8-e‚PU¦ÒSº_uFp¤f¢9# å?-;tî-ÑNmDTšº™“áÙÕÏLj Ðú™¿ªªªò@_** ‚ ¢*ôt"ú©* ª‚bdd[yu'�ÇŠõÞTµ‚óCL_{2ý›¦_<û*Üû׺ö(‰¬® ÑyÊ`úKm÷tÂt-áàÅ‚ô˜ÎÇ`xX™¶kXñÑ/}ìX¦Ý%\®}ÒãîQíÄÜîb˜¨½I­RÏÁacÚ"ô®Óo¢­Ž¿­Ã/�yÞhîî¤'ªæàŸìSOn2.sŸТ»üoë¤Á¹áKy($#÷MI§ŸC7ª°¨ +²¢VÏU½Ï×4&Æ'N: „Ÿ-ÂÀ1|ŽúRæ7¨ë¶tœùïH�W4Hï}j�ð/W0N¬ ßI©ÚD9‰”½|±P¡V}¦t²÷×�!ØN I" øNÄ kSâ¿Å§i<Ö£d©ë:x4îZÝñÅI�_»ù­Ã9°-Õm'výEn¬­Ž5Ý’]²ÖA�Â&_ð†®ééíÎ?×2Ï�×ýu½ á±°¶™v|°²›› ;—äÆÜ)}Ê [ú™(£È—Ũa„g­:AëtGžZqºØ(9ty\v³ ©£†ç $µ«Öì*7"¿Éå¡G0Ô)UÉ#óüÿ®Cݺù¹ÁX�ë’ÕŠÿß3¾äâ~4©9?^JYy~>AD”ü¿êº2÷Óõîl9ÿø³Ë%äÙ¢M(ÝšÈfäÊ.¡åÞ®Ï}2á¯ç³l¨æ®ó_%ý[ Yl®Q–±�ªöŒj›HÇ ý½d�h蘀¸HÔã-Nd»ôº¶ßŽòmkÇoU:ï&ÑO³÷Q‹\øâ…�û~YøŠ]N–Ö.dµÒ1 6Ò«mjT6OggSÀ$T•˜ ¾œÆÏÿÿÿòÿÿÿÿ ÿÿÿîÿÿÿýÿÿÿÿ^3·D`oÕ¸&—ào™½Á}@ÚÀP7¨%*O¦¯•H/ Û�ÍP†QR›0üÓxc®D”¨Ë$uŽSkåƒ�ð “×ˤ+09Õ¥H¼½~Æ—p¢hLj7šríÓ+¯ŒïhÜÄ0t’Ì=ª¾2jCÄ7§v´ ºú/âàŠ¯ˆpôktˆ€¢c‘h7÷¥jÔ¾úÚgwž":ûiDºIÞêó*û!|­ÒÚS‚ Ô©‚  bªúÏ{6ÇŠžж$ý¯Ša!†ƒ¹ŠªÉ| TEÙõìb%V ±½îÇ“@†3e'(±£ŒxÕôñO;‹§ùPPCÑœÂÏÏüí }îî×ÇÙlÄâVë9CÇVš‡Žq�¨Í•µ…�i˜ ÚFI$™Ðˆ»:Fª†“˜ÕÑ ?S�Bâ!6¢e[ÁQãøÛTŸEÓÖò¦aEJ(J–Œ‡ˆ+èºÔM©â$Uˆ|K“-‚©móš›-è’ ød²ÀÖ°°8­ò:5EOLæ2Vžê2¶¡ÆÂ+r`Œõ/RVP´Î£÷î(…i Ò÷ž'lè{eþ~ŸŒÒ§<7µÖX£Ù�¶¡F¢Qz±´„zzö#é{uÞháuÐËö4µ�ª]�"W�äìKhÃ%5 'ݯ�З©šÚI1¤z"3=áãÛo¯Œé×hGÝ*"ýÁ•²7e.S _8ÊWïÇ®÷i»ž7Üèuߦ[¡’¾…)>î\›ž¯AG[[h�ç×Õ5Žû§¾ª|„Þn¥»êÅ�{-xÏM ‰¾ö,sHEw‡H¢˜þöÏØ™xû²k•píµáÞ÷ kÑüƒ, ÜDƒ8�8ø °tƒ# Ba/Å 0z@ãrŒ¯kîáv&Žêåž9%I t}Ö*ÑõRĘuš~keJÂ-½÷·G2‘~CRñçtj„J’f d¥ŸÁ˜—nbFÉt9¥Ú&ëš™_Ñëùõ� zÞ _qKŠË˜œ|YƒÕ±r`°ˆ ??Žš·É�á×9×lå뻓²Š]_zeÅ}˦Òré0ZoW²Hý>•ÛÉåŒ�¾¾â£6§§ŸÕë⣷ç_sÅN•¥«WƂŷï`r6œ›“@Q¤ÿÏwUTÚvæùû~¶áûYØö±˜;Êd‰u8ª”y×AîrTa¯›`Ø•±XhæP†Q‚i™?þ<•v&O¬x¡8Óˆu‘„¤èâ[(ŠÕ)»Ç�aÿøké&n(kêö�Ádè¸ÜŸói…ßË}ÿÿl¬0pŽGvÀöt¯]þþ(\•WZ5`‚·2xãŸÁ'`€ëÐâõ_³Ïf®YJ�™l ˜“ý±«?忀øWÀÓ'Á• £Þ"ÿ¨Ûtä/*Èí'U¥NHÔ6Æß"7Ûd¬T*ÂZwexÔ«s ¼‘Š^k°09Hlý6Iý•CDSC`[ÒñxT û÷&Ñw È,³_ÙB rx*Š(D5"i7ë*«üSÝl}Ðbq@($W™ÎE-nø’¿$q&£ž8óöy ÷§¢�ªºeÉÒ§sPÒ½vÙ×4ã)®_¨Œ¡€8¢Ã0?ÔeDRÁqLíX@{rSœC *ˆÈýx„&4œŸÏßi˳Õ4ÍØþ›Î¸`¢xQÑÙÕš "�,xƒå�’Q‡B#;.=+ ŽL®€†"+޳*®.?`y ©i-õáhr"•v¹“�Çã)?G_ÐEaŽÔVGƒrdªOu–•¿ìò³Ç¤àº²¿ÂäÃÆ˜b ‘ÓóJ�³ÃŸPȯ Úª»\  CÖ%Bš'÷£_ñ£lËÿúaÞ{« ¥h]0èè¶KO@WÝÊ·�½Éëé:Q™Íëß½Afä¡ÉjcmþßHÿ¯Äl"¿Ö^׃ïFtÖ¤<�Žæ]Ék­ãÜ×�SXü $¸´êåîÒ4ûß½Uæ–ÀŸYée Û ¸$¤8ôY©J½wNÍþÓÿÿ«‚uÕÖÅmò‚��)h8`c &~(ígDkLðU/ê33(ÜWÀ޵þâÏ­Ù�¥@iôp(1š÷ÓNä7 Êý9`Y«>à ÷ëQ'^�æ5‰«¦} 8Þxxð8«e'µ¤ ÞÄÞ¨>øãyŸ‹Y³ý=(–ºj­&Úždšëk€‘‹d^»¼¨þžŠê¢Mˆ¢¹ÎþóF¡i¦„”-©u$jBäkm®xäxÊÏ-KhœHÂ[a‘Å‹Ù�Ë8¿˜ZÎ=÷{¿¾?‘q( €HKÅÜï—(ö>md /EPUŒ<Ûü‹éª�±GrÔo"Wÿôï!P…t"Û­Yí÷?*ƒ§ª ®§‡d…4��ž*‹<Ä'…ìÆ}ˆtkî­Š(µ+À^ȯæòXæ´§iSJÄ0¶�$ YjÊNä_IX´VŽGzCÑ´9ΘEõìcñt~ÉÕíq°ÔÏ/…aR¨¾Jí"GÖÖR*€“¨h¨ M¿‰u”JË" ̤;¹�L9�)ˆ€¾ï¢-´Ö~áp˜¡] c{9Y)ir�ƒ g( �,%rªECUÏÄaÏÔèeèDTËV\�+{Ž'îÆMNò„å.*§õ–Ùƒ–Ftìž[ÂM’«|Ò³IuŸWDç˜ ªeê_Y§„ü!ƒ _뀀ÒÎéËt.Éú”jO’ëïwZé+ÃÑ%BŽAÞ ¹ÐóLÂìÆ”–Ó ¸\¨ÜV§u¯"ÇàÙí5bµcÛø&9Ï»´[�½¨¯S8þ ”Þǹ}ìMû¹_ÜíßHÙÇ÷÷‹¹š3h}È]þ9Øô …|·7åïª^T²Xoç ù­ú42z½öçÇ=Bšo�fyú%ßõz¨4¦óeh÷ô!¦÷rö%!S— ëJ?_6)]@¹=‡Ë^�ùã~vÜ=ŽYÓæ—�w[hôwëwƒxPpøïAX¡îŸÓ 5¬Ð3çåî®l�¿+%J?é×0ŒŸ ‚¡ŒÄs½»ø<¼õhÃX©7_T­Wîìˆàc3Ø'·àÅI^G_CÊHÚ.hÈBƒšókE”+ŽfÒÄ“Å⎼ø•œ€Øb•˜+�B—×ñ_{ö¼.o¾ÿ&IiMï÷^£_J@;ŽSî}¿vF¢ûÍ×Ï ù;*}À­�6ÒøYF˜kdh„O)%ä*ÓÕ2”öÑèÃIy¿NºñªÊ²ñ¤k«ÆJoÏ]+9Xþ-QG¾]T3<Àò¼uõÞf :˜Â2µeN/›yR¤)Q( Ic¥ÃÓá#Y*]/ð×ocúÂ?Û”–ýÓ‹ç,wï¡ö²ísܶyìʳu¤p1Š�äb5#ž(œÃwz406øƒKæ�h\/!(ýú«·Gß&Ã8¾Á”·ö>þu>k½¢Õä>ˆÇw¨ã­JfEð¼åu~µ FW">†„«}®RÆÛ7Ƀ„·ìûJU¨�eÔH8¥<Å™çY‘QuªÙùVoS[òPʲåÄêÑÖTMÏ@‰3±ÿad¬¼AÒ×ñû²¨“N…áW£È"©„‡+¢û2~|sxqV¥ƒ×ãK!ŠÄT‡à½™ô­³cW óÿáÎ(­YæáȽjA¿Ðh•B_|ý*C 2@z½&ßwçžEŽssø{‚ )Æ}ƒ`GŒ¥—:¥�Þÿbhçzøç1 Û¸¿@ðóÝþJáÏR¾íÖ�„U칭dz5ö'÷hÎÕ¦ëðÍb\[þMÚs k´$ëÇ­%­�¿Ê\Êá¹h¿1ÔÜcë¡;YuÁ¨ Ñ×�rÝðý,ü–ޏ¼UÓ{‹_lq·ÜrïÇ‘¤ïdí6™qŸòžVu—ß´éÉ"wéåñ4îñ°m±'+t¶_Ùß”U¾¼ýF–¿u.òº¨$N&ƒþ{7gI�‚èªòµ!™Ñ„×(_Q3½2™¬ýŽpØ¿Éz€þm8RìuO¯L)Ü•wh ØàÍü]Ñ;A¸^™í[V¾¡Ä+Úžgêh~­1 áåz­êŠþ‡ð�Ž÷¶o«äŠOÆy`yïœÉÒrw›žL4ˆ×]9`æ‡ÑŒÙñ¸xT?E»ñ²Ì !­" UÉK)Dë|w?e9çùà&Œ¢FÁjT|ÑûPˆiž}ÊU®ºªž¾¿šåyÌ.rq¢÷7N=<¿­µ'SÀµ¯Yö¯¾ÜÚ6M¸�ÕYü_á–èÄ*J´ðÐNﯱõ�ñéÖ~÷ñ=íýtÆcü±5`>Ô~ló(rôÑa’M^[ŸÆ&uF2˪­_fÒÎý“Ñ“Ý ¬"YKjPŠY€€™ OggSÀ4T•˜ ¥Çú'ÿÿÿÿ ÿÿÿÿ+ÿÿÿÿÿÿÿÿ+^9<ˆw´Ĺ-x'ƒWþD&8_2¾8ÜË¡še]¨&Þ�c\žÊ=tb”_à˶Çb@T@½x|ÆU+ù¬Vø“êRö¡…ËËvÎÿð$GÎþ;Å/çÍV*Æ1솰ÉöB«µ<²ÕyFØX{Ô�ÝouQ-==¦�\*±šç»(çõND¿Š$Ë,©­æ¤ãà£`SL4·ƒÅ[uôrqX)àфŠr^n)ì�éEóHy>róñ.…hŽh8î).—öêºóK^ÜdÙ“{Z$ Sa�3¤5}Þ¨Ó£|ß•1�Á0C˜§^'ʦ(+÷Û™ ó5»]…õìhW­;¨ïR· ¶%Êk�†çÕ°ÊXÓimVü+ #&Â�™òp^ˆ'÷îâ0üN]M}ÿ’Â\†)‡P¢ª®¦¦¾Í!w4¸x½= Ng¡Y^W-ÄQãËüK¯GmœäfÊåø¨Ì'õ°°½›Ý‚ÎdåÕ¦äåpêo ÿxCú”ÉI—dâl/`óeÜ(¦ ÎN~n~-Y*{yI©ÚÑF¤OÒxžò¶Þm¿Ÿ9JÇ>KÆï½œI °¢Û–zo�ýšÊxüùGoÏ3^9×ГK ¹ OY²Êi"‰öFŽÍ}Ëu— QúÛQÒ±‡¦à hl\=Ù\çÕ˜Tþ¢£ì‰Iò[VäÅN^°†býš'o›xý] ѽ @?ýÕeP­$k‘Jª6ÔQ1 ¯ÀÌÞ\ÔÏ´*Àoåo«|F[cà€ë„™Ûa{›'{¡e”NK}úWÜ´ÝÜ¿ÃëäÈBÙQ•ÿ¥ù˦õ¯ äv�pJíHð‘ àažªØ?Gèç‘ÜÔ€ü‘šËW÷›®N�‡6CG °c¬e%É?uÊ˺“VÎEk•¡¿>Rœšëï]@9ó†Þ8ÙË.ƒd¨¨rÙŠÅpŠ$>âú¸.ty.9÷ß·³¨ÛH³M‘áP¨TAÎ×Á!%’Ôƒ"�Rv•: O‰ÍVx>N®"k­­H­§´dv°Ó'ϵTP™£‚±nqÔâÌšo^wçoydȳ�ìr]å*uÆ!b Õò>¿s¬‹G·sŸ€ºu^ª¤Ó ÎÓ¾Æ,‰¶F6(ºí¶(Ì9*—õp<¨jÓú*üáxÍüŒí¨yr˜ ©ÎQ:éÓ¯ÆÓP‘<œè¬qjœ/©“JžçÀN  Q»àF£C+ý(=Ñ¥º—[-jöd¬¶¥¯�.¾Z ™½6¢¹Í~°ùîº�ô1TD]Ev�>è*ûx@4EñEÀ�0bœ}Òé¢Ó}®ð àùôIõï³c%y¡ ¼duöCܹ'ϛ֋ßDêîgÞ&ýtl'ÐNσ¥Ïs�7¶CŒ*žÚ± šbhç;[��rU|¹Íä-@‘óXYË ü6›\³<Œ�¹ŸÄ¶¨/s~³—©cTþ)ûCt]þü3 æ~};Ù©§Ä¨ªS¿ôh¬7¾Ív!ÌÅJ‡ãB63Þö¬ø :¤ø©×Auk�§^*^K4} ‰_9\Jç.6¥Z>_Pÿ-ÿc�¯—W +d‡wX&yˆ(…ßZG“ P/·v€€º}SÆ+)¶J¾ŽÉ+– Þø;¬�T4`‚7ÒwŸ¡- �÷0‹'™o²Õ`>"j€Häé(Ú̈“5qYÿ~NÏ-÷òÿ³ˆG$@Aa]r~¥V•ä ÁtÛA4òÕFbO8•®K-xô»jëÒ©ð.¼*]kÃß{z‰PyÏPPâè^6;Ñ•Ïé`A£."U{d®§"ðÚµàp²£*h=‘©OLÑš™Z"ªh×C]bbÎl¦(Ò„³¬Ñnå]Q8 D×®ç Bêüàz2�ñˆJ…�i®ˆ8…ô|GT9TQ©@•>’Ñåh.×}üæ½Î45“†âÍ�ÐO¨¬qu£é~‚`® eD.pœ€"ŽY‘ïb¬äxh¯¬Ô˜€ŸUíXwèнçßlv#ÔŒõ¹¯OOôŠkþ¤bE�Øï£íôÊG TÁñ£€ÌÝØ±g©´Í�x"KyeM²FÍÔù®8 âÝ/�úçðîHˆR–x—DfDºjƳÞË¿–*]ÉE@k­Ù“]¯ÈZ¡ÆkÙ™×&Ýê¢B(MÝ9)4$â>Qï;™N™«çO‚€ü÷·oOœ€éÅ»‰Y«»»E ç«tQpîÔµ@;Û¾e ¨88g‰&@öœtŠ¢p¸%r¬õ3ò ÑpŠœ“:÷hîVÍDQŽÚR-ç5 âÔ¾ºA#)àñù¹ü}™ë •6ãõÞqL"@u@™Ü\³ÖØáCÄæ£E¦š¨Î]ï­Q‡=—äˆÊ9÷»³ ÊáÙ]%ð8çž"Yб»×HJ*¢;t„K­åšM•Båv~þŸúU¨ˆSö< �ñêF"1)#UlÄÎ$~P=4DB hEàX†Ô…´zÇ•]ª\ ¬Ô¸î½ É4KíÏOØ»[¦ÒÔÊdqûó©„ö铵²ûå½>ϧeÅâ͛ǜ|Ï„"´0ÙIÎØï8zPu�úH:Íë ¬º²k!Åäbûî=éºUJªÔØ,Ü­ãî-Æ»JÉU¨<…ÎÒps]=Lï œpg¾â ò�†�Óì$&Sðä™As´eUÙÇÍW|68n–ÃB‰…]~æ‘0¾ßü˜+¦®xÁ®T¸ŠÇ'j7(Îì„ú:númEOêžx]žKmiµ�ëV¸Ü¯J•{Í&jîåf}ÆR›µò£‘„‘mÏrÕÆ&; žÔ²Êö_¦`öòŽ¥mÂ?8¾ usF!f,è§ßqõrÎಲÞJR[�«º¿ÈÙêž©uÞ|Ò¯€4%¦s­�,ù]%sÈÔæ¦}¯ç8Ú¾w ‚÷ ëë¼�‘ÞÒyšµ){M�¾ýü/ÑØŸœKLR›×øñw»¨µ"�ië-V¸;<,œ÷�šž…êØ^†4Í1D)ùÃÃùK}\ê$U òSØË°Wi§°tݳ�õ�éM®0ð÷yÓoÏæʧCO•OÃï‹ç=ˆ¯±‚˜K§6èh#¨ˆ3 d�8йŠù¢w*ÉFšÉ®õÅXNÆ®FûòÑ×GËißÁõ¤æ"Åg?¶^¾™Õv¦š]µjGik´õ¿lof^î·þ.•´ÿÔeØ9�÷ßÿœ«1W3øsÍÄ=²gó”JŒ1ω‚«¥û½,p++¹#ÍP_ãR»ïÇw�]ÙM±9Eó‡Så3ùLðñ¼V÷û8<ëýÇ[U–Ÿßš¿d1}.ctÖwú§—+¤š˜¦ OggSÀDT•˜ +²dìÿÿÿÿDÿÿÿÿbÿÿÿÿ_ÿÿÿÿcžÈÛ•�Ð&Ȇ5¾ÈÞ…øŒ·lð»‚t/ò�Ÿ s}uýÕ>À‰ˆM<™ù‡é§üÚ‹àS- ¶Ò<•pÄ“ü?´YµÈò]„{)J|�ñ¾üx­ �RßûÈGk=Õ�÷�]Éõ¿þ¦Ïh®ŽÔeyÈND£[åyT$^:;I R9žU„eÿU*Ü‘€Z³Ç¬%‚@^•çMwÓÿx·«ªT�Î(U˜ zÌýÛ»jhAä2ep:O©¨ q8¼¸¡=/‘Pµê ÑûKz^’>ú]ëßûYÈ«êqdEU™ßå©,þI>Óìó´ÖPTT"s¯N±òãýþ3‹‰üzZ§FâACh½ädžÇ;¡¥.S­9¿]b.ÇÕzµ …kmº=GåÎ×êÀüh !úx'©Y×äö†óÈ™PA£BÎÞ òNÔˆ¢ˆ™>ÒŠ›Ý))ö1¤ùéîý=æÌÔù©Û“Ÿ£èáhgö�ÖÚI´Ã¡@Cv3�ÏÁ·v›Ó[¼IjÒ V£A®L¯@>µ$’Þ“ÑÅ E¥ +:¦sÔaQÕE¾Î#e½]Ôí¸ƒvÛŸå>¿ÏÆý¦µ!ÿ0õDîïÿëà9��Vü˜Á}¿y”9Ü6êOß�ûO‡³‹*Uæt# Ór·¼Ž^_º|âRã�¼FÅ�è׊ðqßeºŒ ½©êc·l8ò$ŒØðQòöÄÏ$’ï¸ÒP+yæØÑôj£fã\†0‹»T£:@ùì›·ñvhÝý9Üß%·¼¾épÿWP #( Ÿ…%ʯbÙ,Ä K§×T%S¯2xíŠË¨kzÈð«TÐ.1»�g˜‡ígÄîvøS3®“û¿ñì³¥}Å5®§Êú_>…”Û;œ~‡½UFIïþìæŸ×=hc@ɺ8Ë·˜Í`KH8bp÷Á Š…)\±—¥Êå!TÜ#òQkÔ4Ý�ÊGVùôDÉ�‚®Á2§*žÜ›Éb]Ö׊¼–¢Ëɺ ±Ÿw%ì.<ÅÖ7)÷zïÅÓ6&ßY‰¿ìDòãû¤9#æ."½ÓÞ>ù"ðô]Á“oošL%Ùä¼È1�º-Ñ}!úü…Ü{ð¼5µNÑl|¯t.�ë\·ÜªXÕ  –õ±^ú¹†+²ò7ì Ý3w|&¯øª gf¤ÁþdÔ.>ƒ|Ãâø¡ =l”rêø°$׬�ÕwÌ­RúË’ع¾×¥ÅT½AGs›rb1A¤ÓÅ /9^`"ñP^,… ßy?qVívn1ÏYº¦jIœCÉ›iœþ3»š¯Ø”(IM÷O¯”'´©1¿ì“̾/F·ÅøÙØ—ð[®k~¯ÎËÝK~ feÌü�x_y�Bã…®j UËUΩ€ Þ¨ÛÚ¯4?À˜ á ìMöW¼/à¶Æï LåÞoï“1dèêJ8…YA}Ü/`ýt}—Û7oq Øwˆ£€†ú<.©îüþ ç–þwK�IE�¸bíúÅõ¢RVœbZ³ˆâ³zÅb6¡ÈÞ¯:G1¡¹u¼¯F]>ïu ½P¨*²V ­�D"o†+®¨{¹ß–'q¿EMœøxæÍÎUDvÿBwXjTjY2ÎGƒBÑEíÌ.¨»ïôŽŠð^…Ȩ‰ž29P79uGå8ª¼u§Ï\Q§íˆØnòzÕh¢‡êòNN{‰ÉÒbB/Ü ¢êvš‹Ê¸FqvÃ6—›‡ëÓ½¤{Þä|¼Ké°É'B­ðXà¯oÆìÍˉqzdù¹FFÁñNx‹ýJHe‰œ®­§“FÂLèß�9pÇÏjC\2m+b:ÍÚwãËÝ ùÝþnæ_�[7NmsÃ;Ö}áV‘Јw©GÓ¾™'ÄÆ-MÚºfYÀ �·Òß 9U©ÎäésV¨ö¯ª—�ù¹Ñ°3³¾ß_¥õÑ4Û(i9$¶kZ½ë¤`“‚�ž. x�«ø�ðS·qÔõ^àØ]åJ8ܧžž#Lf÷ËÏ<¹ÑBÄ*ÎOß®,ƒö¬X„¾`°&n.LÎÂ*´x³©¼ý»ŒƒŒ¯|cjƒYÌdY_yx§òU�Ì=Úûó»ñzfx-&͇ré\ÛK‹s&äÄà‚9Vã÷Ç'ð�›ò=ü€!|®«Hÿ­P®SÍßïÉ$ßèÃMJs†=kð¹¹#¹kÆÐ�dwXsíGÈOïÑ<ßìý²>¼Ù®Æª•<· �Ü/¿Ãù`SÒ‡Ên‡u+·’«ÇØßØ\¦«W#îò+è?pÝY_Á{þ€$€Ô‡oB±6Ô·ÿjL«Óé_ ~m&Ù²÷ܨ-Ïd(ä±â­ˆaŸ£Ã›§�‡:»9ÒÌÌì§ædhõŸËqËüg½µ§ó=ÿnŒÓvãÿñ»ÍžÙ;�¾Æ\O"z.”îh¬à[øÇn©¼æþ¨»�i~Ð0Á5‘wUßA0ÀwÖùnáãuyõä¯Nöcð¥ßð˜¾ËüÏ7•¥¦¶HtCVâúmb²Û¶×Ùïð÷s ·ëº\ åéékëã·.êPùè:×Nvyždüe³s>è"vÖ»ÖÀAkT’¢Ÿ+®[9Õ¢Y'¢ì]‚ç7Í‚8LS�ˆÔüh­W%(4µžKí�ŒŸ§µBMÍ*ÒéS-æºÊ‡-4õ~¡�µ@²¯þs_¾¯ÑD.µœP…§ó�Ò�¨s¿Pk­D~f¨µ€"R{âLÕÉPQIÔøSbRFÉ—úþxîy%¨Sóž2©t €Sµ~›šÏîVY¦ ÞGÔ´‰Œ$ /¥êÞSKß‘ˆžp€ü¹B/»8ó÷Ô“ßè×*þŽ—ôÇ×/óLj&�¼Á²yäÅ^yù¬þÙ€Yê§íä>O±iòd¦U¤I¹]°VåÊsœ�}�Õ~#N;Y^høEŠÞsÎ-ÓNÚF}kÁ&õV+}Nìœ9ôn±Šc¸�E¼Ä+ÖšZªØŒŸß¯øA|¿·ãø»^ÞøÛÆÇZ2fŒjj½Üy�Ýa–®ÎàÂïúO‘ðV;)¥â×ã°ÛöówÈ´ÁZñ”ž—³N‹¢Ø9‘}©7™âlô ýŠ¥˜ۼȵâ“«mäu:ØÌ�-w¼}\­5oÀ׃?4ˆt—ôºìžz×bC¨™{çRÊÄ7#sf O®òÓéz"úýÔ¦h}ÿ×êÐYQÎmÒr]rá©Í™ýâÙñו^§¾„®8Qx=Á°/ùž")1zHöåÏŸìO-±L«5œÏÇ4Ã"±ïô�AÁš ‚ãâ’¥N÷*ç ¿7(¿–iåîöJòÚ" ·1å(b‹%´?w‹ÿà�6Ï�Dð^†¸LÛà"XøÛ¬^§\Mõ°¢á�Û©Q¸Y×b§×°=™èµÑ“î!n'~_eÿ6�G/¥}‹Ï« wŸqÏg\ˆÏ¢$ÔQs·ò¾ª‹lÇ£â:P“Áo3ó´²áïØïHp!̦Ì�}Ž{Î÷.�Í´mÿšå*©‘m Ä[¢Èù_¬�õqêÀc+Ûïm_ä•7egkùý¥?ÃähT+>Žöß\ÄŸ{%›ýÅ`WÏK[áCâ–Åk鳨ï`”N»¬o,›är^«.}ìáÓþK è7g”žMÏl¨ Ä5�fÔ»„Â3¾¨;ÕÏô:€¾ÄÜi¤tA�Œ¤~îsþö)/:v8MT6ôIÖº¼†]aà<¦ŠÌàȽÊÑNáô­ç0Y/ðŽÂyí½Àk>€G‰×‘{¨ÓH‚ärhAÕœêß'Á�›ŠCè%ún,GÌéL¼Tµ }ê+…WEUDǯšòÁ.ʇ¤µ«£_Ü+(ëÃl:©ŸÔ"u’Dž+�BË¡@Æ~%'"jÅi>éT�ã.*Õgµ¹y|žY?ØC_ÎÈ<~ºÚ“D^õÔ€Z�KêÓC#"õÑ YÄk&²U\²Ÿ$òVkD1;¢2EGA!Uéõ©ñ’µÔ‘ëQ«;y±Ö¢¾‹#J…Ïp¨CÝA¨Õ‘®Zk¨™1K@®ÜøìÜÂl±«ñ¤h8B ˜>¨Ž[™‹‚ Ôƒ6¢v'•�ñ{YI­¨ }tô^Ãi‰î>÷�¬N‘q�fA<ï¿mF§ŽZ‚ûqAE…8�¾$ ’$ÍG}LëŠyLµÝ©1U~>*$8DÌëÆÝ">0·…'Æ/Ýp�DC¦Ní·Î_�‡>oÈ:žÚ¾… |Ì­Ó…�Ùv¢©èGèÞÄ<@öì@. 4Ú¤{ó®ÌLjLä¡‚øtWÉ'ý¸T+¥Ç…¼È7O%l á=Ç·]ñîl¾ý]U,·›Çx°9NÊ¡:Okƒ]}¥Øžë{o3ýk)RqØž´H·(ŒÜ"øñõº¯´×ÓMÒ]ö¦-öêû¥b醗ôøFdÜŸAïÛkðÌóé-cšG⑎S›ªFsåò fü˜q•†‹Žù‹=,oh§ð%óyùÁ±#eBÊ7tå´¼ˆ�Ï"�?kdÛ:½ú·}óKª+i¶xÊU'Æñâ®=Û7Ε±’ªÍVžñ‰285ÉŽ æ_µÊ݉Úаâ™*‚þúJ“ §v÷ª[Z,ÕnÛÁ_á6#³ØÎ5žþÖ³ñ ¨c=«€¯yó¤Àwá¤gò2òìÑp:«h;€Jç|÷_Ôd3%éÒí-ÿG=³�ç®ÓJ÷¯cÀ¿] m~sņ×ñ»$"ùiíꌿ¥|kG²˜ÔTã’ç4J›ú-'ŒüÔˆ‡mcz¢ÿ·‰Zg / ÊÜfâÅ÷}¦œ!Ž]W îßî*W¥Û­ž+ô�ÊÕ÷›[H÷­ú“z•¤ýwMù©ççäO~®íÏ-J³Y^>ÒáÐ Ñ�=NLÛIÝ„neÄѲ~Ëóg²øØ>_®k÷Þ JõòB*ëÑ^Š« »›†\hmµ�'û†é§é%ùbG«³¯STUÒg–\�÷•×ã“®:–$w¼�ci¥Þˆ€·ÁzGô£[ów‡ôàVi 0hQÀ“Ã'êÐ]²//�Þã‘4+úGwLHîPÉß1Ë>o>‘T’ ÙizS’./I—ç§ü-@*z8ØÒ(! a†ûû¥é¯Ú·¸£ÚïlûKãKÆÂr[ª¨.04¬ú 8¼%OggSÀTT•˜ ìï�µÿÿÿÿlÿÿÿÿlÿÿÿÿnÿÿÿÿmÞ˜;¸Ï¬vAÒÌp˜;¬Wz¿€îÿWyûøüµÍ:Ы£…Sz �…nòižm‰]ú|ý¬;«ü� þÓ¬Rõ¡ï:#F±Îp‰>k%�ál�„Ð;ñÞ>èqªu]˜Û�z¥E¹‚BÏW¥¯¬¯­{•]J„Ò ÞãeÔÈÈL¿» {xy„SSãáh‰LœêMϦ$ÔýZ…�ZµÆéh€ÓK pR‚lçÁAúò$jB2é¡¥ 1­œB@'™ T؞ɿ9uq?‡ø]µÈ)y\ÓnÉõ gÎã)Žóˆ¢˜�ľ„3 U'®µ )_„3y¦RÕó ƒŒæjêºêçZ+ì{;‚ÊZå>euÎB ýc>j(NZ4…¶}ìg<µ~:I‡Ö ö[’l}>¨GµqŸÞü\ª"$µ’Û7†ÜX_N­4U‚9?eQ²éšõ˜Ó‘ Ö ­§P©Éaî–8¨|\ÅsäÏûl‘ÕðÝG!Æg"–ã¨>‘àD:À^= á�$Ù‡m„"wÿT"åh}”u!Rغ®©�®(P†ƒ×6mï-Þù’C꺮үM0]ܵûóéa¯¯Åºéßg&wa+ÌÍ7UÐj™v8þüG|á»äNbžNµ)Â'žóÖ1êsE(jg'^Hež‡¾zÄ…Óÿvø‘|ºêûºF±ä}€§SB—EÁ¹Ô 7}ømßɈ¤|—BÅ7À—´d4Æ<:¦J¤¿SùòúaR�~qí*¿‘¯Ÿƒ9ƒ}=aWYY Ê·Ñ»Î>Z7µ®w_jMÛÛ?îÖu?Îç~¸7§ MÛ™VõE¾|kàg»öœY«w÷ÆÁ7~Ĩ½¿s©ËÚNê�Æ_+5m@nUÛëp»ãP"i´/|_j˜øC&+/_Ÿ/öaXãE?Ò,jQç†ø¸jḃب5_©jù„Kó�_~Š=ã> Øwøø½Ab(lÅô‘´Òî°¤û ¸¸'AbœÙÎyŸI»|¤÷÷\šË,'øÊò"Õj°ž¿k¦:ÇYó’fGÔ„ êß •�«9;^3µ÷#;ËUl48JøS‹öÃOåÅ^ýÛñQïÁÏ÷Ûü¢ÛKCüMÖuq„÷hæÓL¡yš}‰ün ¤ÏéñÄ ã rb}À.¥€.Üœ±²Z0ØÎïé•}nßž›¸XôîÌ’½ô"�«ÃŸJÈ�°ûޏÞmà7ÙÓÕ\òb×ÊbåyfÎlÔ»W]ð/­ÅVŸ· :¢a«ý~ùjg«¨½ËýÑþ@ Ç*ß%ßâ¶bâo�q¡G—ËN,?EÏuè¤__–²]zéO“=Ü—Äâhãtƒ÷ÓœÏ[Ó<§ÈjÊeŽoWôúùÁïß­KqÿL‰Ÿ’>y‹CŸ%ɉ×—D%”c,°¸köï\à …Z_À«­q:Н5Ht&€/Þˆ»pÏ´v�’€<ܼRíWÐòk §»G#R�<œÆ“ž6ýýŠ¥ ã}Tî9G~�ÚÛM¼ÉuÄ.üí@¿ ‰{îWïòœ§€=Þ šÀ®2^'HÊu©Ôù;oß÷²ÒÔ¸©æ]¢÷5ªžD±×¨ßª†ƒ>Èv£H¢V¤ ¨ÈǬRq FvÊTîU/�ˆÎ"å½ãhªÇèΩÎ.§fGž›~ÖÎŒˆbèPr˜•Û<þ;™>«ü—ÓhP+*Ô�{‘¤­MôÓŠC=k…nTwÜZìD…áñ3,‚Tí�D*ùóŽ£Ñ9‰Üž£{Øc òT­ªJͪèµ8kšÿÇm�虦Za�Š¢uÇm„E½ø›évÛËðH‘ýGYg°áñ{ï)²Zú^³bO>X<º»S¯ Ö¨îÜö8@ZËÒÙϤ"íb{šî¨)Wܸ»ïkLþ} Û+²:=+Á^[Ÿ¨ôäj›#eZ¹Ç�ßÏäf‡Þ®³êЧ'�Â�wpVÖRÉ ÿ‹ÕÝÇÍþn½:"ÿ9kàO“–2ÆìGU+R —ÝOõ6ÜzZßxî.¿™H…·ã’ €YðxD£~Z"vÑ…¬·^jÕ«{ÍÊ÷ë_3ý`+#ÿÓ…Ÿ[è 5à»Ë9A$´rýñ©¸—Å4á R×M…>UO¦¢”ôYx*½çžUcý;SwMª«wæS­îØp&é÷|§ÂS§8ú¿ÇØ ×gTÛ¬xÕmÁó«¶Á¼ ަ«±‡viÁêçØïÍ8íY”oÉ{¸}¹nÌm֛Π*ëCa³­R”Mün¶þy{øÇUü¯n‡-]²ÙD¼ÿ‹ÙÜþ¾qYÏn§ð·¹iWKr`c ƨï:aœßçäõ§ŸÝ©gáÃí•®.�­âV–9Rþ£gõ³¦ë“èæÙ{º¨´Ø«÷Óû]Yk~Êl={/Ö�–y}Às\z…½|b¾Ö¼½ê<áHZTµ×ÙþÙ¢x�!YS  ¾—3ïœy@•lñ âVþ�ÓH£á¾ù¯�7§—žä–§¾‹,X ïçUíxjÛg ê~,s×/Mº.Ë¿¹öUõø`V½¾€8ó¼s'ci€O©ò£Üò@öê¨WMØ_E@ý!®(4ÇCT_Þ¼³³Ë­[³ �Ÿé Ú}=†£�ÎÎè k¿s3 @ÝmÇ´?¤¨Õü©îM${\¯Q¡Ö|B ñòÊ*¢Uׄõ(¼IÞËóãåCÑÐLà©1Å”k¦8¼èñôoYŽO÷—Y£u˜D+ê|ÌIîê@ã$Ds(œ=!‚›Î¤’�? öIªDô;¿Ï/¢žû±{GÖf©*(Û�Úò�iŸR¡w:„)�f%™Éº¦³"6¤5'hg* ’�sãžNW@Ùª*«{"cV²6®áÞÙ³½Ä¾Æ TõÏÙz(R‘TTª�’ù«Ä”±dOŽvdÓ]úJtyr¢*íP+€FOT[1Çx"Ú ÝS“úù¡fý²Ì34Q5+GéIq€†Pî]Ž]“·<º¯çT9j+J![§êCn?ÃdT“Óò>Z ǡ٠_ERQ¸ +͉0;勒•“IiøÅ�Quü÷á÷/›O©U¡žÂfΈ,Al{ØBÑ;V›o½ïš(b©òÑMk4îñ™A¹¤ílH„æ¸Ü¬Ôõ4Æ9xö‘<} ~›®9ˆ êϸÀEàyeu–�Ûn; g¸¥¶…¶‘;%-Œ-¤\µh;ÜFƒD÷›«¯_线�‰;HC&FáEÿ®Û¥1ëËŸ QJ‘|~vVÞøøbÂ×/ÝF2„%ØïÙúþQÍJ%ðu0®]-»üAÀ]Eš¯M߇;L©„ѧÕ>Ž_5ïï’†_û‚]¬ç§übp¨{©,^§Q³Â˜ÓïœÄ|;èr×mà’M�ë ¸åÃyÜsÅ÷‹&®ßê�ᤠÏõw þIîŠè³Zhýÿ‚ëˆüûqã)¯}fß\Ž©qúR·k[ž¿XZqKßiÐud’nÚ#ÆBÞ¼*§½æÃdEÍ+ ÏØå5R�.û+=¿´ð2¬%Ë<^ –í”ä“[ukhêíQ^ÿ�UóE§-䢘7xiܼÒÈ묉DOê�¶X,XÇÛC•kÝÇÇw­Ó``ãÊo0Ø|!B¹o¸ø÷u(é*sGrY<°ü7´œ©Í.w’��zâ—ô<Z]Ó[kar^ÙØn)ùk=@i\ý%q†C"ó#L¦«ãJ´+Á.@{ë«\ùÖùõ1)�­÷]�ö,ðï&éÄçK§²Ê¿—:(ñ»Š]Úœ›(r¥CŸ’Á²Õ¶G¨N,.ÙGm¡wy0´ržù~û|¯%=WÝs2ñ´•lݪs]‰a �ÛPŒ¥,uYò–‹¼i,Ük. ¼4|V*>—0ô²Î‹Ðí/î}6ƒxG?›ÎÆ ,òy¶Ôø®+ÒOPÞ¨»óMùDÅ�‚kná?Ój‚¨Yãú€ÀÃû×u¤‡ÿè 59h·rä“í[„Çãƒÿ3qèïõvÓþå¼:œ¾�8TûҘרŸ•ù\x–gòÑZP(ˆrß)Hz˜ùåçÚP×­¬û³ïìMÔÇ`Å�þ¨ë©�}9Ñ�8¨aÔÚ ‘ß7ÎNtÐ"»Ý¹T€®¹šQÝÈê­í'#ÅÉ!úÇ]¹T�–£R£3¾"ßæŒ#ø'‘zpo  †¨wK‘L\­œ€w­©¨î¯"byªŽ–ôUThÔŸÒѵJ�¤®§üÞ NÝu�/ ¤Îd«¼ïȉ¶€öì>Þ5ªóÁjR€Ö˜÷èªvhG_h £ökvùw�–-˜ò.ñêÐ ¢‘";’yò\=�_Ug‚~ÎßòïÉOãþÍäs>»v][×5p( :М¢(%ÖrÊ3%Gpw÷ØDQkN7G³#ÕÉJÔ@RvŽ£ât�€F�9ŒèDH>ê¸Ñ”û1äÃ9’šN’š3ro²‡¨tˤ&;  é�Ïi7xì<�:œ�qû©FŸ—#Åþº^ÝÝ9ø}2‘ÿ�–ü�&kO‹Ÿ“©'½ÝhœGâñÛBÕ—ÒõqàÝ›ŽWè€ÒéCKgodCZšœ,éj¶ñIöŒ“|sù&OggSÀdT•˜ ²_ Üÿÿÿÿtÿÿÿÿpÿÿÿÿhÿÿÿÿr~¨»ðßq& &°—›Õ�,¿ Îi†+¨û/oîÒà}+ ÄN6GÞŸü©oœÛŸÇ¹ásæ†ô>*E÷L�ÛÓù¿.σTÌ"ãaFˆ½ïŸ¢ª;<ð–²µ ŠâL-�m®†_µê,û½³û|éÌ^#ggLpøÙÉŒ& —¹¥îIú¡ÔCôþå‰ ÔáÐFͬ|Ô ÎZ�Ö`§ð �Å�‰*?íÔº_V�…Ì„JD•‚މw^êtŠyLË)NS8rTý ޱL=DSÕmŹ ¦?Ž€©(Žê,2àðŽZ+8Ì5ùk¼—kæã¼< ©HE®u>U¿¿ñBæŠ,­CÖâÔFö½»NõÉ{QI©P£höÜ�®5`ê¯Ñ‘“Ä¢µBÎJ=òÝ�£Þ+µ¥áª2îRÙcnòd�ã/¾ã’Y�:O@ ÄáX/æA÷Bœ:Ÿ2"fÁ!‰ƒèA�ÆQœýÑËÌTÙuç�£/ä’Ú˜ø¾·|¨\KB¥(ØoÍû¡ѤSÃ9IX #WâgðGÙkNEk'Õ)À‘Ñýí}B@"z¥Ì6C3tìã¢cë÷Ù`*9ŠOﳕŽ*ÃåJ€”òê7?MŠfâ �§×ú;»v;¢7«ãXÇÃÏUr9ÀŽùnš†oàvpIIN�ûòOÐÙÜJ%‹¥½Ýkþç¡J%Fó±ê+LXüÖù‘ÎuT�œ6²ï_þ÷o€Š|$^X8ê“oJØŸ7Äͯ÷Ъµ°äï…’ýtïö½Ì·øyöè}¶”l^—úã׊m¸žýã]�7+_ò“vÖåy†p8šô³óxVÁ§JÛ74ªØWw¯ñ‰ñxüëd"L“:‘Sý3 éýGq¿f+äÕøw…g)•§©˜Þ?ú/»Ûç%7­åj²Øû˜Çü‚lª_e! æ+Ö­ñE¹Uô[Þ ã‡¤ï—På‚á®}¸\+l1Ŧ‰0aä�p'1õó’¢Ðåýº‹÷Õ]zÃ/µ_i©›/dª{„9åYI,¼Ž]ªfÜ5¤!ë›f2ËË ¢Fhô!Fé®k’”Ú« ûYXˆ«Tü׿SG�cÌ|•h^g/æi?C6rÈtÛýÀÑè÷ý�Úyó} ÷í;yf[÷n*æ)ùdÜoù›–û÷÷¤ò‡œ»îM¼deÅûäó²ÿÉÍ­ím_ÏëL<ãK1~ü{1«³î‹·oùCÞL¦«Ï—ЬÐ_@K9�âVV[Û¿ÁÎ<þ%Iaf¢ÜeüÂZynÌ”¢©>&~�ÿÈmÂw³â�šñ¾ÊÑ|ñî«Í1­ ^ Ö<ýHUšƒ¾‰už‡[Ô¯ëøÃíÊGZLàrjÿÐ_¾^ýùr·„Ø“M\}êeÆûÝ‘ù×Ñì°©Fí—QgþçË?5ªÊì Ï;Å9ƒS³àDMx2cz¶ià Þä­¼úQ+ ÿÌ�=€âdÊþ[£“Œ;uÜqRåÕ‰nUœ”©»X%¡¸–S¹Õ‘ Ò½½W€ˆU÷ð)@|,§Ÿ"8Q;„ºN ·º]¥/)$º:d“á�8á{»%ó%ëf>®3‰C y*Yk�ˆÊ§ThÁ©½ËT€@Nu‚`ÿ Ñu¯4ÎMGê{‡C…v:Ö÷gþ�Î}f»ÆJm=£A_«A`ÀSæJOÃ;»ö¢•Bºö‹ÂÞï™ãÌïTú䢌äŠÐþh‡p¢ î17Ìô÷œÑ  -òT­�T™EÏÈuoºfÉ…áyk­õ"j­™}—¬ÞZÏ’pÃm=>£R‘І:s§SçŠÔ"ƒZA¦§>võû>džégo£—jtÿõA×P?eþú!…ç±O:·Ií øºWo[,ÏþÈ`ÐÜ%(ZBPÙ‡y†rEû»•™Ú?ûCr„žÉ€®–~&¼ÏtÆ£ýˆtT!8À#ý›´hùE¿§$œ~ùQÕ_8R~�;ÒÍpÁ[Qx$J×ûððÉòGÿäªXóÞvÐù=¢lž¾Äy:Œy…1ˆ�VÒÛù^L~¯îðƉMÉ0v÷]t½LÅ×MHeµÑ�ðpxì!Ø/K Jé1:åÞ•áè†F«ïz:;úå*ö,Ç©¦E/®ß/g|LlzŸn»Ý·6îÚù‰O3�w%¦šçü¹Ì{¹jº3Q¨ûy“jA¥º†Jƒ&ÎÏÏ—|Ûå­ê9šÔŽt6¯4ÉϨÈÎ�+¾œeuOyâï�ÇI}™ÍÿòŽÚÔÆÝPk÷÷©.Yxî W[›Û¼¾5ØÙúT¢+•(tôñê4—ô{è3ÿç’€¹mû%O^;…ä�Y~–+¿”þÕµi¾�õ-ż}jM¹ÚX6’‚v"êï踃ÎÑüѼ2µ|Ì“]ð»þë8„êj½{’üÏ…j÷F-gå}¨”PjåW2„ ÌÞ÷GRn�ám-b!Lù›ìšÜ=ÊûÝëß¹B¼¡¦«þÑ­Ùî«¿Hv„XS2fÍ­žôú-É£/ÿ>˽ôÉ^ìiSt-ÞÒçvnõ�)ón[šƒ£K·åLsh+³âlýâ?,×?euydx ¿O–y¢Ë«Ç·Ù�1/×ô»;2ÐÇžžÌ´Ëe¡…ž8‘�É%,üùš4ÜþÀt:Ä¿Ì/nöVîèâŸWVhç k;°ÊÏÿ�¿}nWã�»Ú·¬ú-¥Vxó'¶\Ò”W N½ƒCö^Ëab*S:žkþ4}Ñ`súpోvþ¦¯£Î¸÷¯Èÿ^ý­–²¼gíéðËǶõªªóŠU ßÐëªù³Uñ?“ÉsÜVfõÔÂÎãyá H[­¯´Zko¹–ýÊŒ Àx¿œßÚï×SjVrgÈ'ûןSÔ?ÊÇÎ1à‘Ð@%S€£Y?fíÈZJLT{éZLo‰žÚÞ!Û™Ô.¨5C[ ‡}Y!ô¯šFå]5çð>ë<åAí`ª0éËuÐÓ©G­Ì]ªR5Ü¢šÇ?RjSTuT-Ë�šõdÕšE×ãôÕ©{@?¦Z°øÑñw™˜+óû'†2�I’$•ø|�ç'³E‘0‹ó£‹\ó˜Ã£''õŽ’ïç¡‘B¼~‚ u¢³U.âJ  Q§5_ �Þ T¯Ø§¨åé*ÚúÏÙý÷4êEcÁˆËûÞ @.ÚÎYŸz~N° …vÄî4n·È$ éF{]_¿²p(ÏÃqÕ}*’uÍZÖÈláƒ:d³8 N%ñÈ Ä¼ÄךšÌîB„€ÌLKk�14ñpHœ¢'È>=#’RP„œ jêÔ�ÄêÖþ2‡"7×yX{wÊDdÆÇàÙ€L4�ÂÛÄ9çg}”ª[jf—Í�No[Ñxa«$fŠa‰¹–€ž€Ïƒw�»(IONs­uüȳßÿDwv_/ñd¶òêï[Ц 2÷$X$/k´»+iP’-&÷š±äG¿ÃC&ÿ~N+çK�¼…GTø3]¹•ϯÂä==Sbäß0T/¿hz× � …|ðrç"5]j~¸`Ïz¥¸Æðq16ª²“”³TÀ?ÒôÓMEz•{‘#½ÈWÐ2Mc»ÂÔƒ�Wt»à£ãŠ%/†¦»I0ö‡ý†{¼ÿõOY]sêï RÅÖ[·âCû˜6s�ÐNùòù÷êk‡êö8=–ì�Ri gÝÇ73‡=ê£ôS׸ǰx�Š�_�–‹TÅ2åJ×Âz­ÄjÛcö7¢N»út¿‘žå ’ÿ‘¼�_sù¢Ã¤…ÆDÀCPùms`ºtY÷6Ô®ûY®¿‡Ä�'l îÑ�­å2! ŒÍìp-ζt$7MF»Å¢Úý@»çß©³¹˜�ó&›s© +Ÿ°ç*\ã“–Ñn½©¾üí—�¸9ò&�oºèëý.  ¨èS)ì€JÞ¥CC^Ù¯I�köq|ÀçngYv$óµ|ÿ­s±þÐeT…ω½ïÔäQQÌbzg�߼ݗSŠåþÝ99¸Jñn—Ðf%,K>† Bz%è ¾èî¦|ýþïù´9þ²Ðë¹ÓÄ4OšôåU¼C½òí «ó¶­}^Hmþœ�]r±ÖvÀ½1ŽÞö9XIt²f"¿tùZAÉ߬¬aZ›,')-Ÿ�}¼�a¿˜yžÖgúĺ“ñyýÆ' Ù¶ˆw'Î Á÷�îy`\¾iVÑÎo]?ŒS–Z–ÔâŒZ<"xÿtÙ烒úÇlU5¦€a8Èèÿørö¡s8p~o–q{åð6žßeÓšò1�(çÔ¦DIk窿,ã8®¦ÁâÞ—[­ï,& ¦Dp—[ƒÏ¢X@ç ýÍq}¿¾ýÚ �Ö´Z‡§oŸŒï�³ùŸ;�ôˆ|È~P³ÞJ½~î¥v�s oY¿X�î�·÷^�­Ë¿‹jàÝY è5“œÿ)Ç*8R[«Àp§FVºÖã*(ªü éJ;¡§Ì]E!÷ƒZú´â âÊJtº˜âº°úsËëH']ÏËí� Ì4¡'‡½‚C¦» \|f„¾ÿ¼'fâ« Ä„´@„u©š@“Qu\ãxà/þ}ÌGÔÏQŽ#¡Ê¡µR9ðDã™ Ô¥ô¢f¾ûµŠ›nNÌ÷_ÚSÅì n}¥IH4Ó¿µ“/ŽFÖW�LT˜´vmp¨Ê÷Äñœ$âU¸RYZ4Z hœwDkÔš;̪ªUûý)š�üŒšÎátÝs¬¨J¸s­$ó~týµ£6µNÔ�d¯^¥†âTÍ…î‹ôÏÍüâþñÜw¾Ô¹&H¡TzÝ#ÙÈ 4G ZæÈ/Ž¢…ŠS!¤ÖÊä™tpdʈn‚Ûq zºõõ ³÷v¼?~3Ò�+?ývéäv¼QÅ÷Dçª�¹u<À( P’’`„T—L`iò˜Ñÿ­òɳª¸¡Åå­†+áÿXO0dþT\ywNFÄ4Íb‡ Cͼ®‹ ôýÐÛwã³Ë¸vëÿgž•êRõ uHðªþ9Lv jFÜ%̤v/“®G³¹¦`XÿÇ?oZ›ë]¸žn˵�32r.�¸óÂrsCP¹Ä'ÆSB±7Rçù5ŠOÓÍuê1‹Ü¥];åÙkáò' Aæñ³XÕ†¯bŒ=,µ.ü]‚Ù%Æ<Àõ1›©i÷‘`�¹ëV!î½òõ‘zD««¹ÿ1Áõò°ÄÓ9ì•î÷4hÛ€ë)$kû…½´ð÷7�¥ÉÇÊïç8)œ)¼vXï V{ï!6wâ½Ã®>ß0�)yئÐû£5Ù±¿†¢�êÊõøàs±ºØ‰º7øF«ä¼Å%ä߸Ô…ïŠo£�Yë±qG7•íZæìcäxµùªQ¼‹“Šy*£þ?V[S8óDÐÍ֘ǡUä¢×ù®åz⣉öå�»%¿ïŸ©5]´®×EsÝ„ÅõÞÁÆ{õ¥¹WOçíÆ_ú¦üªÊ™@v –ºái“í2Š{ùõî)›\ù «FBûàõ»€•äÿÌ5>¥Íý[ ú:lfy±Yç‰g(|Ò¸ý¤�¹(�ƺÔyÂs‹;Ûfâ.u›�_÷a6É÷g:å†ß¯ŽoÞëùÛ5‰ˆV+Þë6 æ¼³û“^iÆðz(ÈÇŸ´‘kÍç5Ç=‚øvœ}‰×Òÿ¹—ü=g3¿ÍÊŒz×wÜŽÏj ^àŠQö`ˆ«·×Êèg¤¿²½õêGd÷ùCšÚ«™Î׿S•(Ÿ÷#aý{¯:­Å½ôÖeaô½„ãéë·f¦¹ˆ‹wå mä°'³^]rBfkYÇšu[±¯Ë´2rŽ-þNï P>OggSÀtT•˜ Þœµ£ÿÿÿÿzÿÿÿÿ~ÿÿÿÿvÿÿÿÿwÞ—[•_Ūéª×P‡³ß™±È”)É�+Øý/ÚºÝû¸o©uJ4Éùk³ÇáïÜš¢ÿôõó�-­LÓü=Z!xÙo yîæ|huÂ4gàA~š—3ig&gÖ:w9¢™æóýk½‡ƒd—¯ýxÏnæÇs¬õ„²Ø$%&¶ ��˜=9 -^úÖí�µ1·ÌLx�OdLdÏm¾0"­2Ô)p:`[œmmðê�*öÝš-6Ú† ‚ˆFaèì='÷³M¿Ü×Òû³­5Þ‹ãhÞK¿�T´C_qáQ}»5¹äÒžÞ¯€ê…âÓLüT8‰{Ñ‹¥ý»~Üw±ÿ°x¶(VVN�7±&[ðwÂ߸å°xrLŽ Š^bFø@йSI_ñ?¿o²+º&ª+Cö5‰µ?b³ì2�ú/&m{~þ–Ü%°‚pÏÃñäý®D3“MäG$mogÅ…“>¡'\ØÎ’Ô2²iU`æaîVOH9Ä�lí´åæ·¹£Ša®®CoÝ•óŒE¼TRg’á³®—ªnü„k¿`ßÓ°c-àÕ9˜>ìc&eÿçjã)¨$øóº0ÊÌÜ‘=·Æwëîó*˜Ü”§²2\ÀgºwÙtââ×ßà`ù�Á}ݱe¥ßX¾VàÈQþc×UpÞcRu\Ø}(ZïéEÌñ(϶5TßãÞÞ€0œ.À~{þŸ*ýéX¬iŒÊW<<þ÷Ýä’%Q-UÙ!øåÒ!Õêv¡øéæÏøû$L3(¿‚(æ³i¸”õí¸ÂZ“–ÞîI©œ® t×xUì¢Úÿ–ÊtV±¹Iyðe³3£Ð7[´÷óZÞ7t‹î”xÐÿV?ïwÚ¶ÜnÞ‰NNÛ,4?ñ5xNÝ8@¼'0e¢:�?nÐ[N˜xƒ„G˜weè)x«5ò‹T½´%Åì—\Jù‚wßô6¾a²áÚû5³äU<£Ì2AG6&;^ÉÈ|kl²ü´dì² ÷ áx�]Ôúy‚pâØ i]«ËžŸ;bå<&‘ƒûèTvÚo™ö¢¯vŠMÝ8E�XÖ‹øÛ-3­íçñö™Å�)nØÏÄ>?Öd�ý·�4ÒÚç1ò HVÚÇ,µ}>»8[rŒdq… È>¾‡Ûò¯Pt¶Äåzæ+­M  à {÷Rì7nb¨ª¬HÀŒòáx­ü6È›ú\Áp?gfÏÀúyY®¯Çi«Á Ú¹çO¤IOáïoêÀPå)鵈Üÿ^Þ,Î1t•,jg©ˆœ•d{f“zf°JʺD]Oºïõ²™|âêTzz’TpÜÇë!zÔõ›2?Êò8Ö§²ô�F'h;ùß …$ToZ¥R�%$uÿ¤Uœ"Y�T�¾‡j´äç{n¦B™ A³ç¯L�> ¹Þ9%8ÔZL�´(¯IâƒõQV¤U÷KMq* Yy­Q°H„ì}æw�8EUç*ð™g�Ù¡¬Nh¦f1£Ù³µÎ_†pDŽ’®P‹*ÔJ…sÿ­–pBk-†Èù}$ÒÒ9ßC y¤w­-5˜kpU’¬HrÔÖ=WýpŸKþ`ù›ý·‹ƒœ²Qj²®¾Ÿ�¨ï�_ó« Í”ÑZǘCññÙ{ó»-»ä{Ö»>› 4kÑ4;hÀA‚†œgê½Eð>+7aF'6ö¸s90Úí¯ív纓Ì{ò*&ˆÈ�ÜT `aH 7H éú™P—Ûô©L”½Iò¤kµŠùdÃõvVLejÆÉXèí©rÒñ®°Ý³™ï"xâ2xM¿s,^«ºÍ=ó&h}_%·ÍG›$BÀ½µËò±AêïýÛ¢u‚|«D,ÆkÔ1ƒÛs7M6Z_ÑPöÃOܰì�2M¤_&Ç*ßÝœþxQÛu«ï!ÆÜÝfùGÕ¢W½ÓÄ«åh–}è�{�ãn‚ø�n‚ç«;÷Në­"'åß¾á^£öõÜÆéçvŸ4eÚ�DŸøÄ•õ:‡è”ü£“Qü—8˜Íæó�'u§GÅ�ßœÙr.•ÿ»£û#h‡©0±y>o3[L˜_Ígs¢•¯‹éÎ׋üÝ3ÙÍÒ)Üñ¬ÙÄ•»½Ý­+ñ"¹^üSOOèOú´4Zð<þ˜†±T¾_°¡^}²w•Š ãŒQÈé^ ¬ùÜUþä¤B1Î…éڌߓË×vÕW—²”z‡w6þd…{R?òFtŸíª»”סüÁ\çAWÖ^ß=Rc2>lg:Li}“Ÿ~çMr ËÆf×j©‹]n³M#ÊíSù(EÄt# ïä Ï[†ø])¥1œ‰S˜|.Ý£ïD* }–“‘H»Œ©n®ÎCx(c6Œé‰¼^íq¢ò°Z4 Û×UàZ+X³¯µ¢Þ—GÝÆä*·+c^õ«÷CŒmùû0yV‘3+»•›c[WËèÝkðQ*¹)0˜Dæ÷w7ÀÆ{öã4»äŒ£IDn,\mç=~·Àçp!Ö;7'Æ>B°·_,cbh/Ûã<®ûežýY§a­þë>M™l˜x¤Eå”ðÇ—?{†‰±ö ~-¬ÂY‚‡–1ê„{Áòc–ì†íÐjY¯ÛʽC+w  °þA¾‡Û*ï¸.2{J†8\ ~e¶A³…+0ý|ºúû~¹;JQ³F®°ÂPn=íܺ–ÔÎ-`™ïfè3¡.¯yúáP½~Ì8Ê„ÓÕ©é¿(ðÐãzÏg•½!«³]Ë©ƒÞ{i’ºŒ:iS.Ô!N}Uz)jÔe ÄÙ?[¯è#§|G¯I‡SkÔ›KŠª‘@7Ä3¹" aèÚW-¦ó%µÑ*8GçˆõSPÐHV>�½µ‡úBÂÁa�ªµIÕútCuºÖóè®Ôvz嘠µöÏ}P¥î¹W„ª““ Zɨ‹Ôuñ%¸¶‡+ Χ¢¢¬µÆŽ>ˆ¯ s¶QCâ¡h:ržÂ•5H¦t8 R¥êÓ”‘³¢WVfT‘‰Žˆ9åÀAq‚㨕ZÒIjòF™‘DF÷\%éåèSV$žŸ_úZ•X-ž¿9Y¨�­ÊNV)RGTóöoJ¿fícy�AÑø8Œþh‡ž%åp mEdGúŽyÄæ÷<Ð IEލ™ÙŸ]ËC\3n×qu^5t11{ú� þöç£_ûë�ôˆ ‡?Õìøkrûüûä!ý켦ØG…®B¤'b;†´æAS˜è{ ÙyU™4€ä$xyGç;uéñç°«×ëCêûù‘$c·nBaOMBðÍ/rš¯V(Eìûó ĶynUYë7Ëç8æáì›ÁXéB؆9qÞ-I7MÕíq¬Œ$7ÎÌ$û¬ç<¯¸cs%õéâ¯{œª;Ž6}¥#�ò©ãyÙ™dsæâiêóeä<®rú”Ÿ²^W¦£÷êð͇Ð�v0Ñâuƒ›{ ™OyRyMLJ‡ÿÞð\¯Î®Èônúì5ZL´«{ùg�ÏŒC/ƒ {ꩦe(m‹íII17ýÓx>P‡åéÑ«ò(jÑú\ß‹ üü+-eôíüé¦DçJçë »ðÛ —öˆªyç÷*ìy6Ÿ)¹vØô~£¾#Júæ’«J'Z�´Caé KYrV½§uì7ôHðwÏU4ŸØÃøçC½÷ew$|FoÿÛmç-꾩Á>ª×ÐsžÅ•9�¼þ+÷ΰÇÛ aùîöß­.+æÙ?ñðiðºÙ¢ÿÂ�o¬¬ø_+gš¼[?þ�è Ö•5ÏêöAel¸·¾»Ôû®2fÒŸÚ¥¼è#ç^vü°ÐY*}™}¸D|â­<=º £qÙãÖ÷æÞ°ðnF=ÀOÖÿ\�É3´Ú¤»{·Ïš¶}˜Z*áQˆ³ó PU½–y‘oéÿWãté�Zkw¡ÜÇj´ÐFÙoÏÊ+Ppýg¤ïîâÞ÷r¡cøçÕ9œ€sO½º‡°~ÓTR<«þTêYÄ®X¥±å}$ÃÞ™6#VÅeî#ÉÆÓƒÓ(•. Êr¯¼á|ëþµÇ™î ³Ö+اˆß{ç„'æüàÞ·C}¿ÒfÄ£Êêw�E�‚i,\ËjÚ'Æóͧ¾²š­,]9Ê™\Åb�¹²•wïˆ &ž‡;¸ï "F�‡;ì¯tmt”\ÁTéñy»z­Õí˜�úC×S ÷}�–ª°ÌàÈ%•¢R82åùÏþŽ&â°/ j´Ó /¯hø(Ž%«WÛÑ)¦ÜÊÖ ’ï…à×Ó™ÈýhÊŸÑ §†÷øèÏVjÜ3»!�{ýŽÈÃë“è§¼3e€~jÞI ˜KJévÐ~ï€Jë8D·äÜ Í�}œ£v�l{o�pF�£†û´µxUHÖÎ(„®X¦•9ÃéGG¿‡CÆYõ «²æM8”‚ñB*|¤ìS«JuºNGm#©ìîµÖ�Ç5§á”çÙ\¯ƒ®�N¿—Ìû¾÷' ‘BHÍÞkìÑUº ÒðSÖÓ•¡«‡¨pP8DDÖ`ÖëpåÄÓ²eÉñkÁäòdwëïöÛ8˜Ÿˆ{�yйˆ˜CÖ Ea Õâ³¢ÂZ¬‘škÌÄ•FãhI²žn j–¬F6Þ¨À�Ý3�“ÈÅW êcŸ/${uøÕ®EŒg@°ÖH}™tSwEÖßµé†Có¨¥óÿ &eqyøÅ8»Bm5§žl$ýâ!•ëxÅÍÓs{<Î{‰/áoÕÚêâ ´¦‡ ]’_léª"rs|?¥/¦�§ÑæUÓ˜5/»Þ~|Pu—øÆ�*¨• ß¨—f�Úöà�«/Î6SÕ霣‘ïgy:áQ>ñ4HÝZZ¢hw­î�iï¹ãm>³¯*‡ðÕ£M—ãœq!@R«õÑ‘4ɯï·ÈÿØ‹Oëz‹ WÅ$bt¶T;¿Ù�œ“X�Ã~_oëåý‰ºÙ 9Õpøwá˜õ+°öïà¤Ê/+ÊÆ˜�ˆÍáÓêª\�¡Ž%5ZJç«Üÿpúç°ØlwQgîkêd”“ÒÖ¬�ŸÇà<îOZ~�soíÅj£Óq¡~ݤûGË¥+Ïc¯ôø_M¥Þ>œ3f𮇈û‹ÿ9ù�>�¥l=ëE9‹§ïdEqwfðÆjQ]˜܈Ûtr§ÿ8iíÙŠFÍ}^U$kÝ®àÒMž_CÏ—ªøaYZU¨× ù 1²V°ÆÂÂd �&¤Úßk6û³ßîËßîÕª« m�«£y˜ ã_ÙYws-Œº;ã�ºÎ(\�53×Ålj׮çßÅRÕaÖ§fÛÙhN~|aúê]&–•”DkÉïâ OÑþ˺Ø�Fw¬F׸÷Ô(ÿËÂn¡X1‰ê„!”ËyGrüœ}Øò?çæq |Õ ÷Üjg} �_Û¡8Žü.Å û~\�uÌ[¢ÏÆøù)7y\ǵBrOggSÀ„T•˜ ’Vdÿÿÿÿwÿÿÿÿbÿÿÿÿwÿÿÿÿ|>—[ƒ�L�è˜[!¸Ã-ÁON5*Š$¸{]ýçÛ›yKU�¦w"A63¿€x*O©30y¨T“†zšäÿ>^-N~_ î/qZ¥NÔPnÏøæ›{]4Ü»q&�¿IÝ*=A¼sЬ•ÐDwoŽU[k ïWfòǜ酮ä®|nò1 ÂNY)–�X'HM~œ�85¢šEGdí)ÿ³{±s uê9´F;„œÇÑ€ö”M¦È®µî´Ïⵟ<âˆ&ÇQz88�ªMPkOùHÍF9{%bf ö í— 8‡R©Y;�|˜G ,U ­Ëë®5S²ÖG¤~"Тù*ö¤§áõRïDBt ñøú)'wǪ)ŒŸ¥ª¶Vqæw7¡’]+;QÐúìg�8½ÌZ£@‡ k]§¯R43 Fô\t¤„B ÂRå#+{€:EæÖ£OÇ!© òÒ-Ú´gád§¬]õÝ ó÷Oj¥u‘Üêã•Ë�û<«+¯½÷‡>_`²ÖFº:ÐÈz@2è&Aþ¾ïft×̳‚M„Coƒ¿fŽCenú”0™º]GŽG†éØs–¸Yö»Ò‘Äì1Y  ˆ{"ÔÃÃI›ˆn I{ð—ƒ Í„À¡Eê)å‹¥©‡w<ßê•ò‰¹�Í›þoæÑ�aàɉ¯ÞÇê5¯nìÈ{âÊþ®¢ÒM£R�²øfã¶+ Íš€Ù?{ŸÉ?;l­j‘o5W™’ ²H�XNO9¸]´Ò�)81úÖÉõã?öB˜¦\¨Ùè=9BÆ£òÎÚ+¼ju U7Ðõý 9Á\âÕ­Ò½'4½¼J„ìÒ.“ êGiû¬/v{3ñãÜmúxëõ—�–Öi©Í~÷×SŠ>"2ÑRÿÔP=?w2¥½æÛxç{~ ³g$¼ì ì¼Sü•“1/V»üá Ý­žÔÚåúÝQ‘ŠN�O-cîÞzÍCɧâ‘FSw²`ÚßB0=ص›Žü’:7ípØõþVÄ]§¹[ØÞO_ãõåÕêy&,ß`âØ»E2CŽÍ½ ¡É…ýk~×ÌßÝ3Tôi4EN0sñ¢ÇüyDj•ºŠéyí×¼véžœžHíküöç6|¡gfžÒ­ s0ëVMàþÍÔé=àÈš0p¾é ÀHb Ãøÿ´¾éì KÓ}ûbˆVˆD²ã…¿4EÉ4µ~tÚNÊY%S?w¼Á�&$^/ÿ¹sëúuGy‘F¤KTþ¾iC³|×M‡Ø *û‰¸½Ö¿à6y.Ro>k6T¶Vw†šÓå:«,E-£€nÅßýe͹Ì/<¹ã/‹˜F=i>a{®©]ôošÜ>#ððøwTðÛK|­™“Z¯³ŸäÙºß'Õ<ó¼ÀT;K\uÇñÒþ:щç�»T[,,wiVWWqöãlzKpüM�InÏ$A”ª' Ä–“ÃÞ8"¶íj& OD‡Îd¸äŸ�ô 1ܵÍý×ÅzŠûñQàsMä(1ávÓÍ‹[G3ßÁ.“sÈe¬ñï"¶×CB:,Ð8Þ!"z°?­{Kž�ÃñèÑ¿¥5j:©ù«­eaBça5žoW¶8©D5u®¿žµÑ¯Jå®'Í‚'�[Q¬èGx5•¯4Ÿwe«©AôÕÅf8ŸfI$]ë?f=L“´oÚ³»M2üŠ“_ŠU xG/¾›×7Äm�ÏÚkŽº…ñý[ÖKëǾS/½'p ºFôPù�ÄÅ{ît6ÃîcÌcíþ'ŽýýÆ3½„#/i»ÞëñŠ”{ž‘*êÎ)ÆGˆî«ë Ç¿øVúÑ�)ö¨*ý·sª&Î}ü\‚1x3?-ïš?F‰tÊ>x%Ñ©]ÔÿåĨO®ÁÙžNNƒÑŽAb5¤,¿Š‚Lî±Ö3±¸ïIœk¥èÊ1\(Ï»F0¿]üXÂí¥¡¾7Õx9†4ظﭷ!žŸ­â«åvõúbMýùç M1^WßíþåÿþJÁ³�p޷—qÑî}½¦á@èoäa`F˜;¬~€Ù,ÄÏ€’‡[íÏ„6ˆcXà ³¿ŠÕ0€{™;Å5 ÷×>èôp¸µ¿ˆ&/š˜çõúÄÍTÓnöî5åXCúXpxx•ñóÍ@‹Þ:{opÜ«éå÷™Î3:oJ¦Ì5@ÍÈŽGB7ÿÍ“x¨Êh¬\ÄEë£Fà$úó�PÄlP3%Ž”C'KÇùFƒ¤ }õ„C݉nGɨNæ{:EBS¦€¢B6 e†óGÖ¤ôk'â’N¨L“)ÈI«ÈÊó{Y8}.ÙKþ>I–êØÔú|ŸŸû·K§[’UÛ¡>‚ï\ß@eþD’ì²sªg„Ç«’õ“„D‹CÐÔÝIT#giŽâ•Ꜹ©O%‘%hjTZaç9B z!‹\Z¡¨BuÈJùEhmRÈ.cq®Éýýͪd^ÞiýÊ6#ÑßxØ—µþ|2L® Iz«‡¯´Ýrg ÿgÿûl‡[Ãï”60†+¹Ï´h`LsÀ!õ½çº@û< §aØ}`0Ö�ìv ô§óø/ïßÚi‰½R½gpT"àDÿ^ÿPƒ§Cäò4¥²k1å+�©SÉòÏ÷ H]9e/Ë#Y«£5†•¤ÎßCáèı U©28a½œ‚*€fúî9 �Ïû7pžÖìÜsª<•@gg 4ó]AY*¢×.ûQ©QçJ m©ûáü•*Új õo%)8nF¥¦Cݯò�ž$Põönª"C­¼çŽ“�þvОÐe~Ô²¶¾I­TVž¹Ê$èƒà%]%èrŸò ?‡˜ÂݵJέÌÝÙT§g'øsaªAM²jRW*’šñ~„Ô�¬�ÐQc—²®NçîTg§+Yÿ]¡Î•&(‚`WÐÂi­ŽxÉKB'Ç…C%æ$ÚéÖê󪱢Ó"G6!h¹Q¢FÇÚ2çwëý_~&žuԒΈˆU¨»ÔBÅ©ïg“‡í(¦¨n£:=ï9K>«šý A×59™çî®çCðÈÅRÁ£w 4¶¹b>Ží{äS³ðØ8öè½’Z� €³Î�®oyÚ"/�M(�²Í˜¥6# Um¤è†c$§í ‹ùÐJøZÃö‡8†z›ÏÏ]?j9K¹-Ðü&ljÿ\îÔ âŠZ•%k^æ• Âó¯j¼ÆHWºøŽ¬ý¯ yñý8JiØê3u¾¢rÚÓD ÜñÎZ·¨÷ö­½:]øM^ü§ŽêëcœEmY§Æ‰;XimÊ·-@R­ô®¿—öõ™+¿æû~âqø^/é/êR}Â�c½äÝU785�¿}ÀK÷ßÙû†¼·Í²¬ëÙq#‚”ìЇpöñòéT£Ì¨Èïl@jeöÌZŽ£ó¨fXºw(eVWì®—â1+ñáµÝr«MÕÑ57M=ÂbS¼ tËiBºF¤—rèðïBzž'5—§ eú]ÎÆçª�|òÎëªî�ù½ > A/b<¥‹Ø]®Ò}×¾®à´Õ+fk`é—X‹;)A …×q$N¾L5³ÿç&Õ×mÙp¬OhsŽb§öÁWìO¥ü�tÇ `è²Î7f½W ç�Ë'käЋ6+€²i~;nõº#þyîW£¬¥TYLÚœnÔÕÉ%2 ydóÑH4£8¶R´jBØter8 ¿Õù7-Û×ǽù;WV _Ü»·fcüúö•ÐO7Ü·îÒÓÿv–Ì5–×gÏxm·>‡Û¹_¹«ÑƒÖpSø�¥Âl&¸®î¿þ­x¹õ$¥j¾ÙðàøÇíoåÏãýÿyWn¡Eóÿöˆˆ¦�ñYÏ¿¬Õ„¨/$jóÞìÀ£qÉr Ô/'È>7 èr §¾¾–B&8λÖZF÷AÔv´Çþ›ÖJñˆžÚú׿ßìæ•ÕBjÉ·*J4å0¾˜UjYk_;ÔPý×Ù©zh�ÏŠ]RBûÈh ”_f\�âï#ª‚’2Z9Ô‰ZðQû`ZX.aÎ"æƒYç:j]Å/Ûá1Or‰|ÑcáÐz�ÇMTÐþTÈ×|F‡’t•õ´ð�ŽZðGýVZÉ:è³zN!Y¥2TÍ~GÊë!¨¼�PºkÆÊQk=qÖúÅ9¥ˆ¢Õ•�çí 8uÉ�œö_%ÛéCÔkmj@G"µÒñø}m¥‹Œt”@¢!–¨­^§£¬Hb†Ç—\ícÊkk s…“©8_Ôˆƒ"fP…È®©•Zdä­y8Ž*P»;£R©‡³æ÷÷0 ¦Þ|ùcƒ)÷pP©ð8ZhdÁ4J͹’úý”‘$žóPvñgØ?óÿÙãnT#å’½ãàuæém`B 8ðÒ"µ�X ŸÜ{$‘sÆÙäè?]y¨BoPj8i®Û§É"ÒHÁ|Å,ßnü™OJ%YÙ3VðRG ê{¡û3íDŽ 3Ã{E~eƲ§/a&š"t/H·±¿¯8aÚ{�bµTŒ==åÞKE–‚ÙýÕ÷U’0'¶@ž5©‰n­yÜ1ø[ïÕØÃñC+uÛ ûÞMhÌ1Ó•Æ…Ô¯ ÿuÏý…`«¤ø×y¤Y76l*aõ oh<›^4“¶‹4U'¬ì¹åæ#‚SàÝüV¤›‘‰föÙü¡xƒôüõ8ñĉýüÓmt·�Ùä]x R/˜X²sj_>£`Cîò}#öê~zÄŽb»Ùq]ó®é.b\ Hš]ºýè4%)¾º÷ëùûºs×jÏ{ÈÝÀÿqæ)8a;à™ÒNéŽ/~È*×QΟtXçcï6ì’X̼{ f3Ï£Ý<˜vs¬ÅGlCÚLxÍ6¡™˜GNÙå u�Ì2E¹ š÷9—Àmü@5¿Ì1¾SÕŠÂñ½rËë$Ä|Fÿ³j¢iœd´w}aWHEr9äB|ÛYv³¤{×ÛÂ?ÊÞÓÝnâLp ¹qKTg!ì÷J�ëa¾®%ìZzf>ºg�R?Ó-Ì}¬×[îÃ,¹›V.,Þrìd§8¸sÂëMc÷ÔË䇿dnØ– ó)È�³1oûî$Æu:é4ûÃäf¼;» –SÑNâ^\ Üõ¡Ì=×üE®¸½–"U‘ ƒÍ¤Ó¾x[¹S«óŸó×ä:W .ö¯8�\1pLÕù­çc¼¶›w±˜®±U[Ûî*Û_ÅåVgKV_­k5ê2iKJñå*£ÞïÊðBÝtÎÏ¥[¼R[|Ûi÷ùû𠇱�K¨ô…V=¥Ð÷q–¶Í¯Uß{¹¹é®&˺�Úpðe>‡;”_éQ c†6Ü’ùÉŒ®€Ûø‡Á͈o¡1pì¡ÚÞ§§ùÑäQÜä³ÎQwŠ˜ö”‘ºHÄY³ªÒ—L“îšóúsrι á¥MS¾k] ²{­�ÿvëPÔ™Xæ©ËQûütvÓÓƒ.µè:!d•ºìK‘Ù™•È?J- ‚ÊÏQ/Ehš.Yw`ßßýþ(¤ Ìu®5�Á9èÔ8ñ ¤Šö›#*œ�÷týïÈç�Ì8"ÚÒ-ìtÓÝUYwø]DI‘ìYS¡#�œ2¤÷ä©=‹¹ÆpW™µæãK=оiÖ£™ê{õ¬Ÿé›”ïÃMOÝÇÐV:‹u«u�ÏÚ ­½Öú\ŒT²R™{r8SgHݽ>î’P<äós¹rAû¬•È`ÊJ�¬�?;¤´æ¨|æ‘cß�®�F�AòýÔyw¹(OÕ= ‘µœDõ8`æ8‘‡ÓDH:2›¶‘ÇŸ½ÜµÈrÃã3{ãÚåÙ EP‘i¢•‚‰‡Äô~GÌÞ�:ËáéNîÅဠDV’H‘Ùc„ùÕmo¤Oø­Ÿ<“V 9þ…ԓîU¶tÒfÉì{4›Ì`2;D’Ñìð� $RŒ­ÕÊ©@Ÿ ÕÔìúlø¶A¼‡8†ˆGßõ9ã]­Á9«5«†�ãÅŸÉEˆËõOéýºù÷ÒóC;È‹�º:Þ# N„´SmN¬-ò1‡·”‚¯I˜“�Œ:^o »Íû:¥SðnêéÄe�¦c�mXø�DÞHåSͽº>·j-žTðtýüºxs€h¨å ›[Šw¶�öfR[Lf\ÖUž£ upÎú“ ã§êÿ­£:~&wºëÿ[lXÿñ™©vµèo‚»o½fø”Ý/öá§Aã¤�ŽhswpsEÑUØ T+a1Ü”èÒ‘¶R¥÷—*vgõ¦ßwþyÌ�ãVâûî&§ç¦¯H¾ÝC˜¢ÂH+¢.´Hù'«ö¤g £é|‡«]"q—rI«Æ …†rT1õBt"ýÓ0(»Ýð½@ÜmXle~þ6•ð´sØ1Rqó]60ü~:Éñ}¿ËQ×iÛ„2!Fuп-K^Òî$mõqT9¦ÄÍ«€›£†•æÚŽB·àA)ÿ{º-ÜL=ŒF:ÊîŸH4u°:lÍ »HZÿ¤<Wvúƒ‚»àRõºõUE6~~¥)Ú=e \¨ÀL×]­¾|õÏäm½¤M~·�ÍwFr‡Ì�ß3M´ö_†å”¹…”ïć¼­Ty¼[²®ûÆ×l�¥žÏSã*U"riöÜ[-d¯‘¡û·ŠÍÙt ¨ôÃk ~{Äí ¬´ú÷ o‡>6£Ž«ÿª¾±ÂË🅹ƒ”£çn?¶ì¿µ\y"ó­�‰Á‹²ù‘��L™s¶ooG{ò¤›8f;Ò¦¨—‹9>®‰ƒ)ïu­í±¦þåÙaÊ{àâ€1yµþ»óþušê¤þ–›¹?i­A Þp‹ý“Y ÀÈ>ûí§ú©Ï¦=èg“Ü2�ÿy}¡õó3ý€Û ÛUgØAô—i¼N1W�÷ \õxì ¹fà›¨«~iŠ:¨±DjQO¥N?yJ/I]4T4ˆ…Ry•üZ£° B9º.3eíªIÒ¿ƒÅ%ò:�ƒpe?&"BãW­ Ð×AhĽî•�”vy·Ó�9ÖzãÉ™:hïóyùÎëàVÃý $ Ù ÞÛkWO5V¤õé�¿�´¢kò}Êú[5O¼kt÷Þò<'²+� ûQBífЂHÞ(áÙ`q1>0ÜÉ:¸ó†s&ÎúUÑÍÞÏ;íZLø#õš+i)¥½*¥Ï)Ôy H”Œ½~W×ÇÂÉÂ=y·Ç^íAórŠ‹u�è¶ß—ãó»ŽËV–×¾3èîWbÊî‘fPcfîçÊÒCgÀ¹nz #ÛWÿ¥.µËƒû·©böºUËÄ0ï`=Çíì™XÜy ÜË¡qÊYc\Óe•Ûúv]IS1r©E³]‚º%-þãßÇ_æ8Qã³½~-ç¿dr~‘B=– KÊ/…©¥¤ø­ÁŸ(N£osM&!¯Ø¤cqŒOš4×ueÏßÓ)yv§ÅòV™fWšŒkgÒÈõz9ÁhÖW÷dçBñפ{È5îD¯/Ã0µY$?~¨ÿJüH92m?T½«‡CxZŸ WC4Æ»(c‡±öS˜¬v›§.WPä¾�¦óuß7NY_«F¦6‹¤Ð¾Üc0;ØìMÞãXÚ¬ãÔHO‘rÚ]ÅdXß6oU±1ÓÎ\·b¾JÆ¡bæöxyé[½ij˜ö^ê\ssÑ´§gh�è?ç_U ¦êD3ËÛ‰E šõÕF[–/rTÌ:Ž×Q�•áêk£VÙ°çÍwç,gêHù;J›YþÖÛþã£5úÐÎO‘¢ÍÕDu®‘íJY/cº¿êhE£Ñpæ—娀:v_/Z21œ2c/ˆE ÿÔ¯²ç­�Jîǯï³÷_Ký7Ëûé!ê{#òÁ„—õÍïzßhƒ@¼0î¯1­&tq-ê¯%æ19W`OggSÀ¤T•˜  ¢È«ÿÿÿÿ‚ÿÿÿÿhÿÿÿÿrÿÿÿÿa^‡»ðéÑè„9´Â¤åFëWª5�ˆ5Ü`ñêœß½ƒN<«/ÔÛ ß矷¨³Q³2-µü¾jWbQpFnj¢^ìS#å³’ó2ÅÒPÞ³Ô½é©ìƹÿì1UÈ*ìA]ûÝ߫㨾'Kq%ÒkÇQ ïPæ—pSŠDŠ(ý‡Wm@‘.%œ¾j¿î8Ñ]Ù…¬‰Æ|¯Ûy•ù”~é)^�Æ¡£—¨4³fþ±×<¢fFLµ©d¦!ÉNEOñH/ÿøÔýSû*œC‰ëÀ#rôS&_3ëã¶SsÏšnyâÔ· 5{úî&S2²žš/¨Âq›åˆGñA¼§9ºÛ5‘‰$„ŽiwÈ¥>S� ä9#…š"’§ì ‘K__N–Ç×Ãã™ûçõ ]E´œíÌ]'‹Û‡´.íŒ4"<ÖôßIöï&§OìMV­HH^™‚J“¢»SôÎzÄR>ó°�üû)‡j2š¦ë+S­�dfãT$CªS©5kÍQ¦;3ÑŸ‡à‰Róù9~rк˜„"ïØ5£Ó$ô�Û§�œ¢ žû¡'ŒßTÙ[6èyïŽÙsË+Ht`ÄKƤî™$Ààm�øëÅø¼Áwpj‰4Yk£¾G걜¤¢›Ë. .ºÊw4·z˜;ªxÃ'W5Xqf4ö¥Óû¦•ç‚é/œGÝm²`“ Ôòª¼Ñã}‹‚g¼ýøàã&^3„‹¬·;£íÿDBOeÛhà2œ/y�õ^‚JS0>P[ÛM WJóíH—ª“˜©ùIH´[«Ë‹·ûSJ$—°~œ)ý)ÞëªÿìAÛ�& )s_5…]ëý��ïÅ‹�ïîžH’�9u8y2ý×6žÌM†K4w�ã`…þ?Ãn¿W†GÔ¿Åé®çÒêi! ÇZ±bäBöUúªOêq®63 Ó®k‰ŒJ§õ{Y ûàG¹gÆ¿S<ä%õw+¢¨™¦7“‡Lõ‘ÿ³¼!ía²sˬ¹žÕ+Í\ˇl{øÿ_nóR6h¢ìê8’Ý2tjï“w#¦?̉„W eý*Ó¡<¼%.}n¾úw‹ØhÿØ?³ÂyzH²T\!ÝžæÓY¾s¨§y#¼{QÊeM@lÓ³'ÃráÒ󵉶>jqo¯î'/S–ÑVvç}�%ŠI°Øx.ôæê¬‡+[�ÂÑTu¿E}¦’¹[“ ëód² B:[3—«ãV*€ZuâÐç`Ü—ŸÒ� üXÿã¿Ö{ñ©bìX8ý”*sºˆ¯6? ½�.¥—}ñžní*ïƒ[ŠÂ?ŽÃK>܈R²ƒ�ÇêÏæØ,³4úŽØacЧ…Ø¿QÅåCš@pùå»´j9ÝÈoý eßæ:³s‘ÿ|4Ù�«˜‹[ÖþPûÐÕVP#êƒqqSIVEßqº {¿hò\½_�¤׃ç—8~[ÊKÎG¦ùÑæ¾°|a½ø¬û)žš”騢X*P¡Þ†[Õïtm`Úrkð+= ¸@(?œ† Èv>õ¯KÒï bX4µBÊíàŸÏz/R*Eþã"ZM©YEÇ?Öà!ßEÞæêÈ£63NÄo_ÅqŽÊbj8fÇŽ3)ŽÐÛ{Róï®DÕ¾Ü*ˆsL�­S?ÒQ¾.Ìऒ¹a® dQ|“FÙ§¯•Ã)4�¬`¿qÒéÐÌãÔï µ(9÷´5Ý9ä3ææT?矒µÞA²gZÈprg†à;PB‚‘¥I4¦hg'ãcgA?©&S%‡5J]U‘�§äžÃ§®­³ÖCs:�¯Nj=cИ¹¢öÊ8¡0³ž¿<¦ÙżÌ쇛 ‡—Y½OwFˆC•î€"""v’MLsQ"ˆv®BóI4'²ªtuvTŸû×óy(r$~hV 3Ç�øØÙÄÅÝæù%gŸLãºI»¨ê±zÜÂ?h²1ǃp×°<å/öâcÐ'ù7•Œž€¤¡²JðÞñØžJ·+Ùå1�åï¡s ¿×s¹0“£J¡²a "ú ÈO¡µ¦“#ûó7éÁïùÕ€° €£¿t“ u™s¾©ö\^b|8ýóʆ}þË7³ó‘•ÖA¢+ ZÇ*jzœ5Þh*S7êæJbë KN÷-M¯kœº_®›ÆˆÁid6ˆªÊ{Ùs_C£Â«n.·e.¹²1wÓ×0 §Z`Šä“þ�fŒ?zÖóÛ¥Ý9’vOÚ¤÷«µ&_¨úﯵF_H+$'˜LºuiÃîÖ†ë` pŸ3ŒFà7]Ñ78ºî†xº/oåŒÏÕZVsê%¦»s“ÜE?¿ù#ãr=ŽŠÕ-ü/¼¶Ç†‚¿o€r¸ºÛíÚ\ч¨¯„Ùì}uïqXN埱¹®„±Ê,þ¯æ€·Àl�w•ßKuú«säÞZœÔ¶xãáîcîz:c¶<§=°æ:�4¡Tÿõ¸pËCþrœÎ°* W£tIíkÈMÔ²)­ÌÍ ‡Û*_‰hT ©á ·_9Þ lÖp´üéõø{Á"è¨7š:»À¾<ê¼?‡ô1$´!³zMOôôñêE„ñOD:ú�¯4Îý/gž@Oü¸ƒCfW§©±¼&à¯ÿhj;ˆ’•œjÙ\—%%¨üRStªçS•ªÅTk_�!ê«â4´äÝ{,k(rvõ¯Ñõ3¥i’> ɆŒ oÉJù\ ‘_^rªs$ 5#'™ãId•œ�¸ß£twb¢ŠÓ‚¶ó;QS :ÌŽ£Á%´jŠj6ð!•˜œ3¡C‚ ²ˆ�$~ÚϧÅ{ï’‘­ŽR�ÐFk™C÷+3õÆù�¤¾îR¤v 4º_¡j}(ÒZ�< ”Î*sì¸Üý±L×ýüs7é_ÿ«ýÅ=ÀÊ\96ÎÙuç&˜P)Ø¡fæ^eÏ_º¯§Ï{¥£ùÏ8lW»y²«N¾Ã„d‘ ‰À®™ R˜kD´?“²Õ¡ó7{}Kb¶ƒÄѦÖî¤Ò$Çøù“ÞUôW7Ýu~ûa€d=:^ï?¤u™�ÌGŒÜ{ÂMynïϦzI%s"öÖŽ>ô¤»HщŸÙï÷p‡8 ÓÄ Ýáý-'%&= HŒF_ã&Á�‘¸ÝóÎë‘‹©åc½+ê]kÜñš”ëAæõqZV¸·{¯ãôùÚÿ‡^bb¤+y•%On< ƒ¼ˆÄ'O‹•æ¿Ú=ߨ®7ÛoÜ›¥ÖÉàuÈwX|Ô³çxpm˜Ñß×ï55(¶?Ñ×4ÏëZÒ« ”¬¬«¦kwòn^UšñA³ñ¤}z.à*’ó‹Ñ—7Šå½&Ûf·à®¡ ±¯1ÚÜ{•øafN«úÑd£M×w쪘;ŸžUþS(V•ön¾ÒäB ÃÿK¼ï§<Ù{Î}£G+ ï)Ù=�)‚’O«í¶ì, ÒÒ]†güñ·çû²k/·`Þ²½åw«}¬{.èqïÏq-±ÚçƒÏñöóÙ”ïk´jŽómÕù°N¾']„Í+úió/k× £zõÄ.Õ,SÆKç�Z¾Óùâ»wÊõ?ëW#ÿ«¹+9ƒ÷Ø$“�»OºÒä †±Ç¦ g¢ÿa–FZ>/oÃÂSeZ‚ß›¿a)ž*¡\øžÊ´…•5%5[Ü9bÜ›‹ôMÞD‰%cþïžÏ4óvmÝš×ã¶(ê å0)Η’뾟_ßÀ»~k+¼ŸÉeA~.='¢ ûÿrWÈ›2§/fJ©m‚Ùœ…¬Ý®0œ˜­;†7Tù7çªÿbª¶ýnþ¤À4\wÌË�Û FÄB-þÎ÷­%±7Þ ÷Ð`u´„%,j^õç‚:�w1?ÍùÒåéš5�€U±]¬èØÂœKœ_ä;n<çYẌHpªfÿ�F#­%sb‰QÕÅ#éãåÈ-F]� [¦»Týßà^þùX슧”$û׿:€WG”ˆ õÑM�˜”ÈC àÜÑÕ¯Û€‹eϳ—l$×ÏfEÙþ–;ÕïT40–k™_Y­@Å WÀÑüO×ë� {gÔ¸ðÊbmD>r}�¿WYë tK§:'H\—/Ü��÷}ãP_‡�E¯ÃùkZá»Ö©ë�]Ȭ�5ž?¤P×–&¾¿?:¡3\º§£Eꋦ-Z)zúK¢Ðx×*ðîz¤B» ˆN?>/Tj×?µÖp�¤—¹¡z~ ¨EÒ§G35Ý I§V—ߣï33À²¡FÎÅ7U¡’S$P‘:½êáHgÔnþª‘dBvÑ {’�;QµÅ#¿©­çk¢‹ã¨JíWí÷•ònæ.úÒt¨´Èš=sß�zhåU=Ît"¨uÎDã{HL1ç¥UŸ˜…¤¡"27¯n•äh Y)ÅÔßsuqÉ/GLGJ ë {|ö‘ýúÛfÏ<À•*DCRŒàJ­*ôŒäOãDÆÕ9ÌáÁ±=Çã@8JÑ¿¨>[;¨ÜÌ̡#p?£ø˜OŽ|Y¢î9lêù¨ RO ]+uv’ÖÖBRÒ@j¶<Ìέ5Sh‰‰t*M…ù>àŽÒ÷Ç<'½{2EùCñM¥á²ékD:;“Ø–.%€(C@G÷’쟛yŽhUÃNôO%:ïi'§{×ÇÛ LZdZªwo¿úx˜SĉaQBéJb—aìó訮—œ— DÈ.Ñ~M˜Mí*ÁcšÎ1ûÈò[¥ùh2@"ÌeœÛ7jUÚaº½xŸÁ‘eõ§ã~í¹à?*ÑøŒyx 5] =û{uzþ§ü�ŸÇ?®ê*^÷ÓíÊH=-Ûî¯áÂ¾š© ¿¼éO•ä†Ëo‡QÕçœb¾#3R©»ô«ÿ/*Âj6"/Ju¶Pm]à‘ßøYœl]yš0ÓT°˜LNãšÓœ0ùí!i…‡¤»Äôñ:ªÓÖ%D½ïrB᳆Âd+KD2“£¹¬âÿkPÔ;vš­ý"ÙÔ‰^O¿ˆdaÏæ°$‚Èì6|�/¾…ΰHuÌeI˜3y—ûõ†Ÿº±¹G;ŠÜ8OºÏÇCâ=íÙ©ÞáÝÛ»ø­7Ÿ[ƒÙ¦Ó¢�tC§²t`ÏcÄòK¹`N¤Ë'ÔìþŸMƒjá HKzÜêzç÷úKv¹Ð4_ÄÁjVÎ t>ûI~+qÖ뺢Ñk¾Ý5·gx¬¡‹„.Ô~ÿ<ìqô’2Ûq¨X>€ó‡ü»ð˜—Ä}¾Šø·^ìdˆ|ÂÛâé|—-¸—ylÁïºÄX±ÿø[ß#õÛ[º5±dAi*ž”lAü>7÷Y¾¿H_*®Ç·Vy¯:[~±xre±S¾ä}Ú4Õ¦@ð¹�É®Öç?÷.ݯ"¡;êÖEÛGÉÊæ·k#vŠŸÌú¨ÞÇÇ·à„é.�IÊÕ¡£2ÞÚÚ¡ë*çÛ¯†³¿Òzk¹Eù•VLÀ `þãømÎV›–:â™|à·ŒA� è  ÊŽ}Ý7SK|@OµH ÊO3À—[o…àL€vÝ;pà0jCü<ÏnLk‘IM¹D3Ø�Wvu”¿=h·äpíÈž³³Ó»éP¯rŸë $LD­•ñEÙ�“ �Î!sB9ÔüåæìibéÑIˆ‚F©¡ÎÜΣÉTg"÷ u×§¼Ö¤Pˆ¬ŸÙ=×5ªwĬíBˆW§ªµ¦Éïµ²rRÔ:D¬9ËU*¼#º§«¿8ë.qUCô˜Dâ]�'@Þ­ÚG�² ¦c¯éе:×™š¬>ñï®ÔGºuá~ñjÕÔtT…�8öªáTjPU£§TUȦòEÕC©Mt:PÐÚYéìçõ‹J¡Ð{ë�B@K� —�ŽXú‡ÛDî»×±�GgÓ¹ÓÐà ¾Ÿ«®êëJêR¤ñoò¬¸KKèüY³N¦X‰N·rÛúýˆ¥ÐÆ\M°Î8ŸÝ_u¯ѰS�Â|ƒzE×5êûJì§?ˆNP¥˜½#UMÀ§¦ß«å Ø´û4‘çt=ÆÉÆÂsò8ÓZ4áNÔ÷>j.WöÇþ�{Ǥ×l¢6šxÞ8þwÂ}áîv›áÙhÑ¿ ƒ(Óߺ4W?cç¢I¿ ¾ÏÈ"vB|ûAgì¨7©å<,íJ£*ÕŒåã唟{Õ²UøþsGìX�×f®aTÚ<пïk „duu÷¾ºØÍíæßFçöúËäãü½cœz6�c2Zµ�Ђg~w¿Ïµ»>³túC9êÏw?å¢Iå½:-ßü{ݽ,lçŽÀó5ƒ©}/ÞÍè;êŸá‘–ý zÿ ï´Òýi4ó$÷u±÷ÇÙÄð“E.'¿èÂÏ· Ǭܕ¯~pé äôJä=Àþ%Õ •Õv„žÓ\»6ƒmu‹û!sT÷ß·�7ÿÀ±£¹Ô¹T_壡w¸¼ÜÃÂà»Ýq¯î­»p�ø~SfKçè)6,±n+e·Iòö½Ýá Ue=*Z?b9AÐüÍl(ºgÛ=8ož_ÙÕ±È/Vº¾ÿ�ýŽL×7—ò=ý¼ú\…Ï€q¦ÿLë\»©ôÙlœŸ†9ÌüìŒÓý¹ÎéÏ+oq€v{T—2ÝÄä°Íáöµé«©kÂ"yGÑäB¡:²ñ>®w4P·Á‰²—¼ˆAR¹½“¯ç—¯î™gB±)ýÏ;cî~TÓäö¼uÏJÕÿט �N ÁÅ_ËÉñfÅäÛoŠœmã»ßß“u~ÁÇÜ7Ä2ǼŸËAÜ_pî›±€CÜw¨Þ–;ƒïœjd�a¸þdöÉp‰:ã fRè¿ùzà·ê aÌŽ\™©h­Õ[‘ßÞP@{hüñ«CÊU[�ù¦µu˜î�”Ps¯Ÿ+AÁáh%ä²8­"r¯�ù<8¤w!ó4*´÷{OT/B"¯¬ê˜KÅ žNˆÌNy*hU­sY’ÅÊáóË<ö�êC¦¾e‡yêp‰u£µ¾#ààätc"ä,s„Ó^š™¯qÔB"u ©¢"MöDÈëã¦JKè$Ej¦£Ig5”+*Á]§½HÙɾǕó̽ ‰?Ö”•‚]r{XH‡*»r>žÝA£þŒÖÚ™v'ºcßQ%»Òåô$�fÏ‘Å.Y¨(Ú�êÄÌŸZv¨‘� ÍY[ ôTR»ÐJ%ƒ)ôñuÛ>+¶'É„;‡dé㕲é£)öeæ_üU3?7©s®¹ö�üx‰GþCûù«Ý!Sò)ro×(‡éc�‡£èC¶*˜·›�S£“«˜¶Õ,› ¸Y»®÷kqu$þOÁðÞÕñ”²f}S{×MæwÔ»ðQjì»}uŽ �’ñ14ôÆZ™Ã*?¡/Øø†/oô„§Hz­€d9 AôŠº£îA¶¸T‹��nË:Å‚5½¼œóöxÜë߉æo<%ƒ7’Ôîê‹íu\Ï­«õÈŒ­„¿¾Žƒ—'-yŽß5¼ã5ÕÓÞkW8åÅÊEÝZN±�_"3cšn”)ßãNŒ¹Ïžo±ƒæ:Æ9ÿ¨o·mg܇hzApq—}Ï 2H[•}muʶÂåŽ _zû°³í9 ×OZô·à®�ºýðàŸU˜,Ðä–)•“{o…äbÚÌwn­ƒŸeŠá”ÖïßbŸ…×ñ÷£ÀYŽ0÷5Ž'”ÌѺ4ñ|ûÞ+>Bø‡…žütÆìæï�D§è ûèqa�šµ]еCO²Ý·ïz:+­#ðBø´ãT~Ÿ¿gë”z—!ÂMu‡Ã¤_æåês"ø�|¶*øä.åT�ïæ·˜bãO¯vÇ­bñ^€öÀøëŽ¿ ¾)­Æh|¼ZºV]Mp%í¢›Œ)\÷áÞá>ã§hˆÓ…dKÑÿÏÚðk8½³Ö ާÿ¨"±KL¿Þ*¹… Nÿ·ÒöG%}Òå™ Úت™ÙJ;À¿ŒùguH'bù Ýá×µÙœÈ$<^R8ŽšÜ¹«Q‰‹!žn;7&ÛÛþwå†eõæëÕ}¼zÏ^ð§j��ÝŠ*,+8­ž‚õDÅÉý„ÇBÙ�P€ž†Û­¯´(`0Án ¾sz­WÀ0Þÿ²]ö²�„–Žÿ€zÓÇÿúÀ—‹«ü˜ 8áhݰHdT´º±æõý²I¿{L½W&-ƒ¹OxtWe\“§Й›i­À5¯yþ·*¤nÈo¯Ü‰ì:KÏG%3ŸÞi©]q–)£[“sùž™Ä™µPɪú*Y›PÄö®Q;Ø©¬h±¬!IÖnNäQÏûú+˜ë„¼•ü[~¾u×??Ü‚Œ/ö³—ÎER€DO»:ÅcEùd†"ý¼F‹öœ‰$*¨ÖÓ½¦_zטˆoCU éw>µzúBÜ%_ï}��rí\)JJ õ±®�ú}$JÔ("˜«HÕÞkVê\‹ø"E»"Êá&qPkjÕýÐà3–®‰NTu*Y‹£•úXþ2�Ô8�˜g„´#Bâ´ 3E’MúOòxîÇãífrzp(2醹©Ìátß^6ý{ä“ýk²v£6âDæ¤ø²¨TeÂ!T"¢tN‘³N�Ô+E ''“™sÜ?¸µ·Oº?ÅÇ™‰Ù4‘Ø«™=Bd´ºoÏãx•V�k˜ˆªÑàû<| ’T"�€›é-ÑÌ CÖ›TW•-êáØê¹©¼g6͹í>#.&n†cUn×ÔmaÒ*NCÍŒÚ^gßnoz²|@ŸIõÛÞ¨×hÌ’ÓšwIüŠ#âgq8ÀÆînÐØ1Ö]oÞÝ7ü½Kì”×�ò°´KP¬—¬Htq¹§"í¨„dxº¬øys¡Ø.ÉþÊ9~)$ΤvÔÀO¼b‡kÀ�Ä5èb v^Œ>ÖþÄ�a±,ë¶…žF\( qdµál(×ÒSªúw­)g)ž£õ�,áÑ­&_‰³ÔøHùùñ¶nÓ'ÔçÕ Mßhhéé[õÍWG¾Ä®"sŽÔUµÒ`ñY3:dµM#:wô´æç¾Oç–XÒÆð½`µÓ@‚¾G°NIû´w•cƒRG&Ò¹„ŒÞ,”œ^ÿv—6öMª+®|e¸.U„úÓcù¨§Ù0Õχ/MáïI Sgbuã«]¡ƒuTðo­ß*íÊIúQ{À¾jÕQË?ê5·utúø� táo2œY¶…�og&eù3Š|Mý%øxck£ ™R:gíÅ¿pðÎ¥åø–¥ÞX›KHesYå7sõ[©‘MtÙ£ƒ�åŸÆïR|éOÅ4bp}m¦�¦¹éæ³î³á³^Œ®®qs:Y$õéƒ`éÜ2Æ1-yÜH!–®á¾•~ÒÓ3†‡wvÚcÅu鵤¿áb'§<½�Øß¹êr‚?eï0?e7?Ný›ŽÍWVz}Oªl}T`¡MùÃÎÍ;©¼–\…o’K¦U§˜ç=TütcL×fT~ؘu7’¼|·¢ï8wçalÙ"f]g åö¹H¿6©ùöäA�šñ—Ô̾ìr+.fë`ýÙ{1Ùrœß'¦´†…AÂF!|Qµº½•‚­Ûy7²áV}ö|_øÐò`Ù3þ_�œ^†[ƒïtMRϤ0„áºò�j� Z-\(ó¯ûͳ÷ëkzâÀGD6Èòcßœ[ÏÉó½Õ�|i9áÀ~ðxYÞ4¡Ô^+ùN²kÒÙ.ðN,ŽÊþ®|rj3T™jݪg’mª1H·ºÜÏgþÍ]Ļͮøèÿè”Î^x¸�L µ¢)÷®8„~@&:RSêÒ‰jÔŸ’Š„LNœ µ£ªfÁD·Óÿ"Óuöã¾:±ÈTP5jU¢y—¥|f‘4û"ÚyTErÇ!˜öÊï©P;! áÕ"èêR¥ /‰1èM­Õ9Kr%©q<<ÎýÏP¡ð¦G¿<™*Iuè(Œt§8>k°»38õ¨5*H�}ŸäeUé¨5"+´Šã”³Âà< �Ouè}ê¬-�( E…Þã´®D;A4‘g<òõñňX.C¥þz8 ]™Sk‡&·ì²ÿõ¨,ÇyæºÑfÜ%’Y‘µ uª�­s�|è¾Q_„p|ÆÖ½«êÈÕnä>º–y<«¡÷SQ}¨& ¡ 0û•±» )*hWÂÑüäøÈ–äÒ•Üwš±ï_ŠÌÉ©ÀžNî‘Ì@6ÎØˆ?êã*I@`}+¹h"ã³ÛÂÂÖ³ruC³ù~î^§ïí|Á«RÎÃê÷÷ãêÌ ü<”¢ÒOÄ—Àó@ÿ†ª�5Mù«…‹ƒSoõç÷ÿ®‚1ÏEÊFF ó ™]aX·ûÿýûÁßøøJf¦ÄDÁí× W4#Îã¤/¬oûícìœ�”7Å” —/Òõ}Ú’‰T;q»òeß=7 `*â�¸^¾Qåào¹>%wm�ÿ¶f-ÇôÝè&z’ƒéí½ܪܦp¶úEu—"ê¿®!æã¬±+x6mÌšíӬȨªŸ×ÀÒбRÈÛ­U�+}Ý4%øS¿H€,ä³*É»qn¦LèZ8=ï®r÷zk_Kü7P7ýË£ó=ËÙ‰ög\gŽ9‡‡þÈÈ9N ¥ÊõÃnk«Ý0çü-´æ<Îìþ|»F>²Ðr’ õ‡ãPÿoû)£ ""IÇ’fJ8¨ûC×ÔY¶Cö¬r„&óoÕ¤kÁã{š�Ìuô{+àô�ªŽÐ­õz¥ê=P8©h=j¤Jμ —£æ¨Nm�z5@ö|†ïdg‘Úª‡¦3�N\Ôò…{wDKj×9Ü„¢/÷}E¬U÷«Lº_ƒj݃›¨ËÒõ‡<‡?{%´6KAmÉF?zŸ¤� œJt;Ñ52wé_õԪݵfG ‘PºVåÔÖHEI v¥¢€(A]œ`—ÜG�î% ÔÉ¢`툚Ÿ¨H1d£NwQa:3²~U§fשPƒ)‹H©d‘qèD�]Èhewž…Èó±_2?óï9ÇÍ›�ˆ}Œ«ûÞ÷¢8bV, ¾�[ÃÈÇc�÷@|†Ûä6ÇÉŸ­²ñ· ÙÙO¶ á Œ÷}_»P( ªEh,½{ "SIIðà«®s[vášVø…ȉø!§P�²P.¢ÜZUÚž.Æ“ÿ ½ÿðDθ7–6ÖÂM2‹¡î»ÿ<ÑГ¹ê±_ÞXeýí½ä/?CIU­ÓÒÈ‘î¹íÑ™VF¹ù«êœa¢¿òý¢þ(p}åÿ#;¦M€È¢ïBެ]QwTæ©ÿü›~—n·Þø£Ò( ëX(ÿ%¦sh­´Rº~‰ï´ÌÅ<_¸�3óg—5N‹/)Êjaà¼î€¼ )� ^†[í¯rz‚rXÃW®*¿Óf�€®€•Oý"_Go§cšs#ðÕPí·®h§‰§OÐ%OZÉ*βŸûË‘�¯Ïü%Ù_GÔŠ|Zx$ÆÑÍ ô�Lsî:ã@•ÞéúáVoËeÉc˜‹ÔFêò Ò y�L—”{Q“¸²%öaw9‡¨" `u§6…¬©Kô9Ÿ¸_C3rꪽV€Ú{LÇLm¦w÷‘¾2«‚ÛìI_~ûu—kÜã?ásû–C9+‘ƒ¨�Z— cGèþ¨gjÝ‘ œZ�³F'Pk‡5_Z}¿úÑ•ymÕ¹Öà]Ï=ºü\ňŒ~׫‘s¹‰ÉƒÎ�æ€q(g�³TÑ”!#kÇê�múè¿è#>ë""Dà:´ ô…¹¸ H²Q‡š�Ú)“ýJ;ìhV„T)Ð#+BEó‘¡s†jkˆ�Tû#·ÏíQ— ÛÍïpˆá(¾øHuëúž—œ ?G�ý‹´4n2û#3Ðß_ó°„q÷Ô,to3-hÄDDâ z§‚HÊxž·*û'9<®¡ó %ûøý½±�_„އÎDȦ<àùÉÖxzIñE™‚à( –JÅ÷°ŽWAyÕbÇêÕÙ²š f‘pßC�°žÃ�%|MP-kœgk‰±`ôCXvs ¾Ò�\NV–ò4ùż!÷J0 ëœSÎp‹‚Úw¨5ýÚ³u TXõ.#ü^]�=±cé¨Ñô³ÿ¹jmF"ü܉¨:[q\³à}šú0sÃMæKÄ®��Ó?ÒèÜr;ûjÉ#t˜’Ër¾íT†Þÿ |ð:(ŠÃ1wÜàR9–ˆ¥)oóµ^ëc|Ú]¸Ïexª§ÉÎ^þªJSbʤ`ûV{puoS‡�r«�®G»ž×W;ëYš'¾äMæÿq-öžzåë%ç‹Obó¿ê©å¿úÛ]9ªŽ–¿ÓéÂq»/dð^®ß£ú¡8 ±› ïŠh-Œµ›?QÁú'.îr©4x&:•’†¸Üöàiî L©«v+eÑàçm·ª¸yø»s]Ö�PÕqûÚRu¤(BÜØÚ;ùÑ$ﺹëJ×`RBÝ�Äj2åÔ±Ó€z¨)Ý?l×ÖR ü©­¼µ˜$!7ñOôE¼P§ÁàÁ'÷|'—Ø' 3ûô�ëª;½3i�&¢«æ»®wÝN{ÔNŽæßÍó®Ðóýn õkÀ~¬*gÇ_»œËu§@o>œý Éi”¼ÙÀyy8¨ØÌþ¹Jùärb1’šZØLI½ã>G^OØÿ�FTÏàÛÖïôNYTÒ!mý¾úÐ…>õåJéÇœ àçàs̺•q;íí™,%F�6K­óõªµÊ”´iâêT-ž»àÛîÛ÷¡F…჉Éà‹>/ö¶`€W<–І²×¯1 p qôj—oå¥b Þ…s_åilÀn ¿Ó#Q$Øfuþ"®ŽŒk=áQÝTiˆÓ<€Ü%Åö  ®ð»rØ®§þ ÝV��ýÿW~Ô Gµ«<¿ù¼JÒÙ÷©�G񬂮L 0ë\N "‘ø>G(€# Õ»OO�D˧C›"ÿ‘í¼4Tú¦«'A'B�¢¦ò ¨âO\­íÕɽö»’šË«6šˆvÒIÇ~/yŒY$kºÞ«¯Ú"UE«¼šùzU¦)h� ™,�™oj|miÞÁDjQ8ˆÖŽ‹¢À Ðú]htMÝïšÆ!¯í¸hVɹ'©>Åï÷¼©öĹsd%£û€.j{•ïV�^ 2jC·Ô@¦®�˜ô;Uk +BR9Ѫ+š•ªõƒ=²[fM $#CÖV’½â.ù�ß¾øÈŒ¥$§ž¦§Â%(Z�®YwG�ÚH…Z¸T*¯sŽÖ$Èp4©EW�ìî�ùIÌd §:‘‘›é¢qgž,…)´)•NŽÛÏ£y@?þˆ!ûXÅäc¶½–™¬µßÿ»ZåÓXÅföÓÇž/­Ä3™xO?3¹!q?çM¥èÉð‡¤ÐÖ0^0cò]›†§›?>樫¤¹òEᔇ3>OA}^ŸÁPW²öÛ¶ÌQ•l²üÓ8–ß×ewž¡vˆçµ3ƒQa6>Î��m3“Åö�_’,(/ÇGz8<Âl$¤$U«êùE?C]@Ó!"¶NÔõ–²ÓPWFÞuß}¯OêôаÊ;wÔa¦[ŽKû©ÿ»º+íW”Uêo™ú· 51Q»_c¿v®„]©fj¦²ÞH©p&å€Û.ïÈx>íýCž¬Çܺµ-¤¤üz®Ú�gËmª3爸¼§Ã ñ,ÇÓýˆÉ¦š°1Ìq.|aVú5êÝÆ«çUÏÙ�é-uš#ùÑ}4^¤[†—b$[k��—a“°¾‡‡®G r$våÖ†MMã^ÚE ´ ÍáÓ+»Ûàn—Cƒ1&r�{˜5ÇxF©GÃt¯tìÊ­š~µ€øÆ��òc‹cÔi¥ñ¤£!€¶ê¹‘ZQo­÷�“ úcz¶€øÞ¸MaÉZä•�zÌd1Å:Vm â`gŠ•Äç_ÉM�›4÷yRÍ2ÜÔ§f 9ñ@yïGÕ›q¨3ð¾4ш‰þ[<õpq~ùþê øgO!CíŒÂ�¯ã÷ëgÃÜ•‚pÊk¨ÞG%2žŽ® ƧçÙWÈôêxÖÞò¦:¼~©;õž5jS³GäAÔò@æ‡8Òzú $DÃ#R[ãU‘,ISú¤Ö,^Ý÷jÈ»þ;¤OÎKÝÇ ÎYÒqU{9ê;²“’DmºjPW¢>»ƒè£îÐÔV ­±gUä’#â÷Ý—qH,õ9õ`ÆË$*U´r~F#D´.uÏET[º©‡êd=)æ¨lÚEª¸Ž×ßvõïd(©óµy"ÙUf ê‹ö,… Ž":©•ÊZTBºz:Õ©4Hï||™ V™'zÈÅ\ <'ç±Ñíó7˜³€\øYúÈ�Å®NF1‹’TêäÎh±šuô-®{DŸÆíŽ0µðÉ=èýúÞÏgÄt“ë’ƒHôÅöWi�Nüå÷Ubôy5MÜrFGƒür ÄqH˜w$h·˜‘=f?ÒrœÇҹܣåóP(§`›(X6ÒÞt¬»�ð­‡=µKÕóNÃ×�Ï?rKqt%Ñ}N®”ìè ŠŸÌaÍ ÖV{™Ê©ž#«>¤ú5ÇÔ�w¿®­ù@:­Šòr¥ ž xO²ö•ó¶ Š«oµ*ÿœ‡ÜqâÄ>|åT¯�•#Lÿ›Û{E ÍÅ~ü,Ü3 …ÅÕsN0¢*¿‹Agn›ò­=¶Ì#îsŸ\ã…a$Å›l­k´å€^¦ÿo0ªÛ´FЋ¥Tãè)Ù¶‘SÍN[ÊKýÃÖüFféÕ´”îȬÉHÁ„}ZP' ÷¹1Ö\»ÒZñ]©}ixEíˆw?á1q�›dÜ{ÿ{ìWhü¥PÃðN£zßyâ6¹Ó6ìÎqošÔ –Iè‹Çrï°uÜÒâëãÑônú æòÃ+̱Ïñ.訲Á»ö¿,!ó£¢/ÚAC¡2—‹TŒUƒˆn�Ð/nÈs|Î?UÖœ{4gßí܊ÕÚ™’—üöÎ?�¹†¥ q»ñ§×¾[ ¿|é}Kc)" ÉDó'ÐÄS¦GLjgŸ“Fì~›œsú]Ó¿³6º%L­ÃôÉ®™ÊÍ pÓÈ’Þ8sƒz‰[ÛU ç’.I—òQXíÈÑ: Q¹T© ¾w) s;¶3ªô7ò�¹ŸF��ópµCþîîžìñßñÅÏÍøïxëã,oÍåÒ�ÛÖP¶ý�Sö×½ËTæsºxë—?ןçMôwØ]nš)ª�S4~_iÎ>O?bx朲d}¡›lrÝ4Ø‹7ãcD*•ö&á.È!,q��NbµöôËv£P÷Ê]ÚäqtF;¹øåã«•ºÜGµ–VæîS«÷r#xJ2¥±Âêïôn L6#£Âã§dJiáàvò8k R�}¤’ OggSÀÔT•˜ wÿˆÿÿÿÿoÿÿÿÿaÿÿÿÿmÿÿÿÿrþ…›”ï´^ `†°Üd§V#0IqÄðýàõÊ8ûz÷=ù¨_äI~,7ÍW¬@Ý¡ê|‘W@Í÷Ÿ¯ÓÑ?Wà>@öÑw´åZï< òó>U }¯=U`fAôk–Ìh5݆z´VœFµ§ßœíÿ¤’Ñù¨‘ZoÌS¡vMªÙ|@‚*rêp‹ ½´ °dÈz-´žÃ¾õg¿št5 æDq„'\öIbºAä\½"¼ÌLj�S~1ç’�ƒWVda–B;—5ëÊ0>¯A»ú{ÝŒè\q(2Åñ:¿îäÎqxTÉÚ=Õ]P…ZÆw+)^jmd½¤k‰ˆæ±¡*ýs­Ày9íèQûÑl©8äŽC¬ãä²üòñ—?)_Ë sY‹Š¨rðQkPi'NBOèЈɸWº_µà˜²¦jUòbž:Q¡è"{bNs¹Ç'Û³’öìTZ9ãu{ærå.ÙYŒäõxþ.9yˆŒ.fböÅêïuMΛ×ù¾žrø|üµÌ¥;ù+Ñ) ©Ÿ»Dþñmüª@QvŠm­8ÉLn:ÕC{¯Óh¨Üƒæñ/G¶zÈkïÐ* =�K—”Ó|J†€Pl\³_�ëÉGgøŽ)bá�àlpR äT E7öÈ_jþòF§•Þö;GC†œ{Uc/JW?Ë ¨]N†„YýêyS—âïÏ üì·\š¬÷îÞ}—V¦¤•¾xäž´|v±M5l¯ÖS¯”�)SukÃèýèq©�ç×½Ü]ªïƒ¦Åãª�ó©ˆ.ìñAgüë}Ld5™XŒô�¤ÿ»#BóN~dËRúþט˜A¢fÂcÆféíÛ»?Î}OSÿHiV©@§‘=y \ŠÿÂ�7JÜtY2ƒx4æd£û+¸žÃäÞú '.ÁÆÝië —’h— �§‘!jÊ-ºóš#q®­Š”¶¬i7ºùì¤á:“kPrø˜ÿ)ÍÀ¹ -»�êדS%¦}Y#7îhñ²mºïvÆ Á3¦›†^mvsi ”°_P�.5æeþÓ‡J¿&ÚºQÑ&áè4)ôýæyRj1ÄŸ'È?·Ý¿÷pºŽJ[©²Úøþ÷ïßA!Œß�¦õTYý_­a7ãWf/ÔxŸÛ³C]«�º<üÆÌC¹H\£jÀ(/Œ^SÎþÈ®!n§±³?œÑØÝÄA+tÑ»iø {v’~¡!{ã¬éšŸí•BåùŸ9ßâQ:_¶*³¬yisÖ;ö–_ì ug¡n•Â÷2âÀóB^±$º9míü+å1a²ùþY,›óï°xÓè;•Üo×¹ô ^Q}ÛK“[�¨¢§ß^é¶ÐݾýâÔٺLJĄøÏ®“ö(î–Xëw–p˯RÈ1ž×myk‘øÏÖ-½®güóÿK[™^ÅñX-Qµk™™Œlqʯ–°³½‘½KŸ€ã°Wäu¹¸â �bøu7;Û^ûl¾Þ©xßoÈ4‹„ ^†;ƒ�ÌJ@å 7Ùß™-AÌð @Ç¿þâø/Dƒ>å¸D§°Uù~lq]³;õ^j^´TnmUqà!£¬Ë_ÎÚä¤Q÷t„Ì÷7q¨ïó&´îÚL®vg“÷éáTÜ�9öoµã`hn:œ'½ïçàf´DÖ=D÷ÈîÛ‡tðd;*Éž8‰$)D“›|x¡Š^]5R™RuqRö¤Æ´®Hð¨$‰'rŸ˜Ü&ŽïùJgU�:µÖà)Yá¹ ÄÚøgŒš/ï/q<Èc  ó{•Èsæ�+ VÇ!áqµëähO J:å°|~yì…³òéÿŽ£‡TÕ&b§é–%_óË3�_¯þ¹5Bf’,Tf=(JvG+U‰ÏyÜ�ÇÃeúÞž£GÑ�ÎFjîQ+QE‡•EL4lÑ} ÍI³¢ÔH(š8hA¥¨ÐàÈ<[KŠ—«ãÐîÑ<Ô ä $ZÓ}8?e5~kƒ`¹‰'º5Úë/ìŠéD0ý³å¡é�"“ûdlùI$»&£JÁÅöd*‰Ç6�ûžô‘¹t>'�dQõû°{}6Yþ€Rø%$ð,½ þƒ®ÖÖŽð%µVãÑ"/�¿bîGÊÿ@v_á·ÅaîTaÏ®ùß_ê�ìË5ý9–cná Ez¿{âuܦyq„Ÿò ÷Ñ«Üÿÿ%Q–Ú ËðùÜä6÷3²ËHl^—A+ûQÿ.w ¦q5ùù ×£abßïr–ùÆGw}¹žn”�`×�v:J¹ò¦“íÆµá¿CqÊÕ¥.|ÐÌòƒÍs«x\‘æùfIÐDU¤»ü{±ØYBmXœÐïóÊ4¾ëVb1ê¸%êm~g™ùïòüwÅ'_»�#Pè|¿­¾ühWÊë]ÑÅ{0’#Ä–;zp�ïôpç5&4+m§ÑA3º¯?. ·O5h6á6s:,Îå~uœž*¦ß�'WEvåõÖÇ* H?ˆqnj4{Ÿÿ­^®#?¯î¬"ì*ÕäÔO—O°)àgê˜þëÈø�n8ƒ<òñºÀE²5ý~�Þ•çß³±÷hÖ©ÿö›9üdzXeæKʃÇÏ*áeo{…™ð1Ì·ìÔü@r¼Ñì¦?�ñJ:÷,<* ^Õûú•—q*öµÚ»öF�¦ÉŸ8êzOfJC†8â®Ö;âï7ßô鈥ÃÅê«'fc“ ®JCjÍù )Ÿ� }\ðÏ7Þ•ýÍÂ�Ã8mð�á½-�jÖǺ¸ëGzUb²íñk)Mëwb··‹S®¯'öý¸ætCì7óBÝh~<üÞW8ð÷+!D-|-ð<Å4“e½G+�åÂNÛãüS•‘ªìÚ‹Óa¿»²gùkð§sO‡�¾�]ä îÙcé Ž$/ó Ú´q¯A4‚-0š×ëIÃh­Ü Ö …Eïý×¾¸ú¿">†;”�Ì*Deíögâ$ð@?®ñÿ~Û4Ý�–—ÞéÞM÷“ú¹œÝss05ôòË=@ zÎx|ßp�ºƒzÝÈÞ’5áç�Ø x¸VéwÝIèBtqÖô?ëâ&µeñ Üž3¢�¼fÏ ¦_¥S㫲Äâ¨jÖ¨¹ô€:Ï8�I¼ßƒj% �êÒnëwµµã1±ýlç�B5t¡¦À¤-ù¬µµzDDç¨]èYiq>ʪKÔ9*NÓEEïÄ¢ÎÑ…ŠSåˆ é]”gΩŽ~B�Z—F¦¦Õ™dž£.ÐS¼Wš×«&1%“ÓµNqð�”ˆ£¾fgÔå®WÎÎŒhLE21u!‘‡®S(¤$�{�’!„ÈTgIýùT�ÏÏÂtî…åN¤èަ�ú¨L‚×!t€dWè%æjsT�¬¤S%©"» Š|:w­B±´B‘­V&æ‰S{—p2‰ßW<ø˜Û‡LEÌ|~æ“+Ú“¿ÛþQô>WQûíÙ¤;›¸—HFÆ>ÆýwCýÜ.—§?NûÑ%U؉î[¿�î(&T·˜)¸sБºéØGƒ�þMúj-p°PÀd°YŽŸde#©Â¶üŸ_í=IˆW€÷»j{nJHcÿÊVá‚5ú=j‡ M¸7&ñžM{»bÐÃíKŠE®ÜîkùåýM&~¹g–R.Ó·×8ݵptÉo¸ìÚxõ}ÆÆ„«Š0�§Õ&G:îÒŽ¥³”Êw}U0þšM¨8šÑô·Û@³­zaº©¬¥]]Iõ®ï5=Ëä¥3ùŹ¿ÒkIJ|"½V:ª|íiºš×ô�Ȧ9ÄQ° ÇÛNå*[Æ víéÐûøƒ”'wÜŒ’µ+›:Ý~Z1µ¿©s—Úf\M4=s¾&¿ÞŽ”ÐÕèa-–"Æ~µ”ûޝg»3Fwš8Ô<vÏÕwZ=¶¾HWÀs*®�,‡ÍÍé^Ïß³ä�xM˜Ø�˜Î=@bøÂ4å» =“ÃÔmýU³þΰ‘�šÿ,WD®©ÌÕ¯Ý=ƒ´þƒZ®9 Ž3z‰ÿ¨™óp4×þsµtŒŸZç²ÎÓ-WëéñÍÏo=¾]‹ O´D=MjSP¼Øb:ÊÊ뜰1ÔyÎt=ÄýÚ!ü¬¥6å@k‹ªtî Î׳Fò{žV°·ïŸæ`$éêÞ–¿nú;Ñ»«“,þ‘ùŒô‹x<¹” b•J̵x Çß²V@“^ÄŸH4â<â„ƘœÒÞaÞÈeÈÃ�ÛßÿŸMmòE);™yfµ\ž…[­w<˜€/Ün}$z‚Ø˜à –oýýR�.{­Ÿ“_ €E? nŸûÞ¦D‚ä\.hÉ*ÿÞóÙ!§[¯pÞLµ[–Yq>sWw¿&ˆ€*5Zês@â_¡Ô® !Ü;"é…>-‚æÿ[fgį̂��ʤ§“‰ E:dUОëé58áhFºINðË §r�5'GÑ.»é¨Sí<Þ¡«d\ûÜÄIÔÛÕ=Xœïgš÷˜óñèš©R¥Î̵>$ŸW¥âÄ�•CYÔIvͮܨk?d’ëÔÊé h�ÅÑ®ùkõ¨A UÒ W¤ƒ+“d]Zòx¼ò÷å™Of Gò�½v;©­Y¿pfTÓ¹‘*Ñ- Sô /:I•B¢"Ì�Ô˜a—Â�¬<¡{(ªÑÚTG vˆÆQõt£$3…¦ÜÕ#W(2+}š«û3f#-�ã«[¾PÕA"!3³ãëßÃï6ËïÑ•ÉîˆD¢²3žóéé|½ÿ2ºh=(�´Œ¸õñ$3N‡Y �ma¼Q†ÑÒÛp»8Šv²íް¿E—oÇ×…ÄúòœûÊSv]�}j“D*dT§tå}8 W;…K£`S˜»ø±5½a¿²h�J=gã–03™°¶�ßyö½ ̤k¾²ÉнVëRŸÿWfÏ7O²D‰},¼µÐ‰ßL—_¶ ¾�sç¸õ¥Íy-À�ú}ÓÏ™ÔpQ°Ü^Š–íúª{;8#áz†9p�+d¿Çð¿Ö¹ÛÙÀùÆ€O��t5å´=r[A¹<ìз­Î @6óÄólðZ¸–¶�‰.a ‰t6S9XJäÔËQáPÛÁ·{úÚLIÍM™T‚Î'3/þ®vÜã‹è*ŇڢLî÷¶9ÿÄSܮۭýªÞ‡w.y™ÔˆÃøt@¦]§‘½æ=¥˜ØïÑŸ”³øët w×fTK>¼?¢·wZ¤Ó‘Á^E�}­¸p;“Zúzþñï�Jë¼–}û�?Y—Øñk�× �/Æ­ŸÆù«ÇêS–®2䮹i«rõÂOõ61-8ó+ǎܨ¥ø_€_Ï¿_…j÷?«€“õ4ÊDË©±&úMF¡H?©�wÚh®ù‹æ,~MÁ2×Ož•³鼉-—Ø–jrý3<Üÿ«]T½½‘CkìVWÚ’‡Ï=ÙQ¸K¹Ó‘çK5?׎¨Büîé3`lýU?½WË·x¤%‚Ü7( ñ»ó/M!¸­_û«ëù‡mC{D¿™vFŽ]ðö´­ø;8ÉJÁÝ”ë]å£| Y^[¥²îäå°Wzj¥„ÉÁ>O`QÙô}íçrïi¹¾Öh£· ”ìÅùô¶Â´#ÿ”&OggSÀäT•˜ žÔÿÿÿÿ`ÿÿÿÿlÿÿÿÿtÿÿÿÿfþ…;Èw¨ºrMýJ» S™Ìpöºžº>“•3SnŒúç =¢�Sx¯×#ë8 è¹C� 2~íK’(ªIä#ÉÎæñóLà¡®\Ë_é€Óƒ{eG¥ î)y¾NWm¦¡ìs{�5ªS»‹º¾DÐÙï aÎISíïW�ˆ²œ+W�@ô8„£Šî}|h¯/gLãõ­““Sgu•Õ#'B»fRÏø½Úê$oÿRVDŽðå´½›ÝÈé+ØÌðH¥Ûô«Òá¤,¢©&^>,Œ²=º jQ àè•Í¿¹;í{/1ê.öǬûñ�Ón˼·‡¸3Š]Ì«ÙJäs ìrOõë¬UQ¯-ÐÁÞ’ïwÅ,ýùî8áo]µIÛ‰ïÖX]ÂöVçôvÏží¥^ Ê5™wÚ©7«™ï©¥û×·ÇÓGpžÌFžf$Ã^þësÿ1Ѭ_ažÍ½ÎLÚ½owÁ!Õí™åé�jùz-—M\&»#{“¸9Û{ÿ.=J½N=˜³KV\OÍ ¿žjup¹¤m�©óùÆî·–Òþln¤Yy,{õøÑ5×»IzDõÿ°–%µ¬Ò›ã««º™­âº„-!¦4_ÝÈýˆ¢¦ùÎ5pIµç®ÿõ,êF3Gõì<Ñ— .­¹rH…¥`«TÒr]á2à=¼�ãšäTOý1��/´‚]ÄH<±8òÅߪ>�°šJÈÕxo±(¾Î¦%2'�ñNÊi‘¸à>Æ6|Zð5Ü%Þ•;Ôw¢ €'\Ê~¥Íe°†+�V_íó÷Rêó\e½âÁÑÇC¯ãá8 Àôî¦Ô ýŽ�HÑî®yfÖx¤Se�àªfMǯ€©eŽ¡ô <å/ùÔ•æŒL§Öû>Y©ñî'�¿IFTB÷‚«ŒuÆ=4œú-€&ûRëŠÎ!U¹Zò½®Î\™^�)SÐA£81Gկ׾'ºèí=43ë\V­Yˆv�ó;84 ¾­PÅy8„LJ×ZÓ ýŒ.Vq˜×œ¤V!Ž$¢$ªdª~ÇR»9­�žU£¥BתÚG啹éXˆŠêD¤Ð»tW†¾?tJ�L‰½óˆ¨5+aVÅiÞ¡f:jd Ò¢Úu§¥Hú» Ý�ZHˆ“µBh&N$"ûQAæ*ZÔä]%Èt�{æ³gŸ½8ž­G�ƒ@s\%OœãØ-¸ë:Ô;�¾ÈžIý¬t0Õ•)à +R¼|þ£õA�9;2¸ãß»‚J¯¿IRï8»›ú[Íqäã™]l�ܳ“ß|lW|LNÏhŒ„<®PvÝ3øœøk™E7¶ìL} Úº¥6úÜ@ ÝÝÛ°òõ—ƒÀ”%¤þÊbê—sŒ&Azy_=ÿ%°#þµHâ?l_oüzØ<@rƧ€,I¢ß¿f%ˆ�Àp !ñ«ŸÛîsº“]è+)‡éß0¹ÇS¯†'æSöp¯g?ÚŽÓǘʧ þþZ�6Âöp¡b>íA­ÈM{Q s•3Õê¿,jx‰§»_ÃɪâK#ï¯È-mŒ:·—´NçH.Wžj�~Îô´‹£PžüX€gûsØ_Šœ_á²SØ-*óûtÔÏÇú=Uæt.wY¸SŸJÕ¯ú(OÀí(ËûÈð ÔÄ)/þ�±Ç%ä¸,œ¢k³,D`þ¹-K/^ëÙ úÝ(mä´õÏ1´>IY¾›µºxÁÙD®lž…[Ô�ô•¨ ®p³õ‘h‰¬ÚŽ˜kÀöµõi½ù¯½›r’9ýrþ¯އ÷qãHæc::fÐ9¦úMª®'ô¦ÈÕÜÉJàÑ8ówòj€È2ƒ ûœŠÿŽ›r$)ZûÈSOͨ7!yL_W¹ö@#¤Rû! pgÓ üú\*ÔÔ{¢¼ ]Ð1£SçG¶xp°Jí$ʾ“UÈ"ù7­Jä”ÌWvj¡ 4=×''c¦vÎM�tõ&©SGvgä/¬ªÑàô.‘µ»Î«TA�ÈWÍ'ŽÚZÅiiöȨ*Õ�ZGw'ëkQ�•ªNdD´NÒ¹ë”*è3‰Qá�¦«Ú©Žîn8ÁÑ„F˜u®×‰~_iîJ>>ß“‡©RÛ­­Ð•2)„l©E~*wR¡§ØÅQÍH!�Yãd GZU4y¸y|>?‡zÛŽ‡žg—v ŠO³¢…Š£Guwº9NÑ)�hVR8ä)õÖ‡‰à)—ë—+Ts•ÎñN*Pµ6Å¡“ÁÖ‡<<¢>tý=„†ô„HæD|N si_ºd Ùš¢�ñü~�Ó% �Ü ½Ú’_dýû¯J#‹‹øÈ%®°¾£ ³UkßG¬v¤üÆŠM73.÷Ä(ùRöñÒ»šy ê“+ó®Q‹läIš41±¥O„¿Hà{“|B…Ìn•Ï<îxg2Ñ?©vûÛÓ£ðùï96ݾÂÖOI9ŽÙw®-k•á“‘¡Öàø=7AZÙ†Ðpû/uH·öQRRe¥cÄs͟μ™óÁ£IÔÄ­c£’haìÐÉ�¡7Ù�ÊR�ˆ³�¿ÔS|‘˜,ïj©º½ÜØI"õ‡ñf`„Guí÷9?!ö~˜®~³–]Û·•?6å'|*ß]l�8Ãñãp0á¨?M·×&}s¼„KŸ°uÞnÌ×8b Ô&Op†ñ„ ?º†Þ]FÓÁ.B©dÙG(òÓ|és?¬ß›§§F2ÿñ&Þ�”˜t>†š%�TþŒßïõÌÆ‘Clê™v=Ïíy4\0�i;À†`á8Ôóž5ïÌ®¼kÜúû]�ؽ’nÿº•ø_�èÊÚqÂkÀ™²o3R#¤Õ�úÉúÛ'ÄR(¼p·&lû¦«^\1·ªƒŒî™”ûTZ¦<ÀE.侦ϩ ¹«4qëç3|îõ­«v)¬}Fòòõ®–øOëâm?«ÏÖâŒu>ƳxÀÈ÷7âv\Œ§øš‹¢±îv«4² ’@úáŠð™|aÍ••è÷Á®©Û(ÊX © ¾…;ùgB•Mf _¹]y§ÍBe2Á¨óÔÛMü}›zògå§@)¿|§òž/WÎ €æ=…V–ò¯N*¡/jÿ‹&ðj¥c"\¯Bñ8ý®õýkµž] ¨ ³CddB}�i=ŽFT Ì8tMîE­ûT¶SŸ�uzð9B¡•€~s€NÖ1OààQ«”Ï“ß j¥ÍýˆŸ3kf·À�YsŽd¯Ýí<¢Fh¿”ZðR¢TÉ¡ÓÉx à,u.ê+'N.•óSBj1Ku«íQû$žªä\“ÙmgJÉKöJ(S‡Ê M­ÝÁQˆdÆŽ�5¯ŽŸ‚Z•€È+�ªZ+Nín–ÿÝ>>Ìúp�;³íMª]‘=IXýûóý�"о®¿O3© 1«f¤"«x†Ü^ãåè"É‘A•:G$„®È,µŠöߟùù{H9\­3]í/£AQ‹Âïq…âìû?ñg™*Uw "vœ½pýÐu¼H’ZéŠÊø1ì´›HÓs j6•d¶Ôž«Eö|tö#7£èŸfäÄsSÀàØ˜ËËlú@Žwkõì8 wT27ýð·ì± Ywæî‰loF;ùquuòàS.B7ivI€s ½ú£uô®wq»püq;Î�oÔètÿö·w[_ïÞ7¨t¥þ‘K„f¥ß¸c‹�ú+Ò¯ã|ºº4›ŸÏ’žºh 6*ô Üö˜¨™t9™àB‡—Áçà3©;ÝtáOšêçFöÁ·sr'Ò«ÎB[¢=Çæ[�qõÛèàÙÉòU>-¹„â&‹¿ËtZEò´)Fr}Úo¿ q¨zÞ¹Q~gDƒ£´Ý“õLª¤ê¿„àž©�ÉÅírK‹ó]åUubÄ�¾ÿÛu·öîÊšŒ�*8šÕ)ˆä{;?ÿô(i}ï<’¦­£§ÿê¿�g½s)ú•vaQ ƒ¼.>·Æ wS>mSŽ¥zm¾2°ögó¾TÏÓ.žr"ÍÎHn¸ òæBxMŒ’ ª®¿¼g7/öC=y˜Ñ”ZÚºŒ¯îe_Úx–�êqþÕ»}ÒeN%Ž Òþ† Û/ó«m¸U«µ�²ÞW:bÝ|ÎÌ_yïJ|ÎzÆ8Ê[–?_‹y€ aô•Þ�õOÿ›•h•[ïÏÆ¬þö“,>¯‘rë~Ì0ðßPÚvÏì•å…<ŸÖÑucÖçÄ\¦Ï8ã>YúžöþÓé¾ƒÓ (€$“¼¹m•ºì–ë×ÔY`7 Â$+nÉî* þúo{Úþßœau˜[Ë/ÿñ|kQ­cì Ñ¡Œh¯¾Ú5cmÔÒøË–Í Ûýw[mï¡çÊŠÉübÞÞlI*Yîž�Þ }Å]›צ“{’�—dc\k×o"åo³ ‘>OggSÀôT•˜ e‹e ÿÿÿÿbÿÿÿÿaÿÿÿÿhÿÿÿÿd¾…[­wZ%H�¶r'ù ­€«€éÉÎÁzò;Št×âVÖ[(¾÷'¹w}–c¾©€û3�()Ò)¿ZAûG8üc ¢êC�ºW>‘ZcØáÙˆ§P x‘tüžÍ¹85ò)¯=qbѽ¹ûŽðsÁ’NUjK�í¡ÍÊ�t´: ú¨oúòЫÏ5ΦD­K~Ñ+…@dUƒ®4uoŠ��â‡gDÔn&'€B5`IIÑ=ÖóùtóYkõß´’+Ò‡ÐS:�S_µOÌÝ”wE+ênõ£Yö”C¬.Ÿ‚v�) ¨];£ë¤‡£{Ùœ©ÖØóJ >¤¿p—,Q×)¾>¡8qç©L§€R§Hö¬rHëg �tÐ10~ì*D… Š{c=]»« µH:gÍ¢õËñ¸iÌDþ™ëg�qìé•¥åŸ|ùœ€JVè®kv×|tÔ\âÛ‹( d9µr*d¥ª4"{ïû<îñ)ò9úk°rúhÑ×–�÷£ž[A È"„•¿GÜOô„¦C±ã ÔÚ�‡Î<–íƒça‚Ü®éî&Ž-{º�ÎÛÜTÝ=Z»émïô™S!½ªžx@�&¥„€Òf;0Ñ¥>�­Ç·v~WG¼JL:öÞRˆEp›ø AÙh%}X‘ª¾@J2JëXÕZœÎ^ÉÁÌ£�ò®üH™ãÅ ÐÝ¡k¢ÕÄ-�ýdZ‡õ?Â5Ñd±THl"“WVvy^Nóf_½­Îá>ls¾ªÁ¯¼¸S‡£ù¼wÿu,œ�f¿m”òé­uç'Gò&8œ¡Ã&JÖ Sìh�Ì÷±yèáÝžnK›g6YþßüZýàp67¹¸òU_¬­ÜÐ`”Žœ${¢ëpÔ|Z¦nF'yé=¥}Ëõ¢6oM‰hE²3da-©þÖÄšõ�·"a¸±üž±œk1žüñ9?Ûø^Ÿ_æþU�È©q徨ú5JÇ=ùŒÇPxçïÏrLŸÝµgè´ÿFPR¹‰Ï ‰ç‰ýN¾iWµ¯¸#&A�l×»—öÏJ/ b1‡Ôeà˜\k}ã#¬¡ 'ú¾†*ÎÛ•G2õ˜]§ÅõÊwè¤3ÝÎXØÇbd-“S<�á¡À“ìÖôÇü~�“ü�=lhô­gü”1#óëÞxù´_9åBé€ÛÚ<†+7•�Ëa±Û~W©4ô(gËÝœŸ’Ûä`TøýGà¼d¹ÜšÖçü~Þ[f¦ƒ¶‡Ï ‹‡÷ü-ûïµjá„ïÌ×áœÑº¬“ãV—iâxüЏûœøä\£:øs4ƒ¶¨GÊ�ù®ÕW\2wʉ»ÒçÉOÆûÝ÷×¼G? =»vpÕ¸CÔRš\2X©oÙÇ)KWFûÊê&@!õãaÔ«u—ØÊí÷¨„¹í!¾¥®Ök“MVÁþ�áÉ.ð[8LîŸDÏ·B¾ü7Ûžmíü26nÌ‚óºË§àž…[ùw¢€¶pÿŠ·¤#4šn¸¨ŸtÿømGWé¡Öµ¸}8Ôñå Þ™¯aÚÂA*Ðî” .ñ7 �g�\cBF•wÊ�!Kxš»2‰RrŠ|ÕXÚûT©ñyjOkˆ¼�A)rÑž MV}7&.íxYhGjNêÜ_¢d�¹ß•ƒ ÿÞûh»uæ ‰( É\çñ$·ûTÃý¶·‡ÞLl>_‘ âT@’VòPœÈ$c G–÷òq|<ÈÇßP‹Õ¤Î0q çÐB Ó…GGÎHäH�¦ê ±Iˆïcs$ëœg§×ôxŸÔ�=÷š&–É©oÅ�=j´jò®-¾+ üÛ¦ŽÍBÔ:jÙ³ìžå É�ðlIÓÆ™Âù O…]1'Ðô¸!øôw¯Íá\# ö…Kj¼…œîÿŽ¥ »~[üÛ{ýè/{Z\e³{š1œ\ìB‰Ý1÷ ¸{y«C ðvÖ±»Š³�ØÓP6õ†gý $ÓÛúÄÉOÇüü0.l¹Ë¡–Çÿ¶ÞfìhbÄÔÈ}gS{æÆÃ…v=8ÀÞ«°:5lw›j�þâíôNÊ/wohgËL€ë:ú¸ ³�êŠ�"]è£êÈ&¡#ƒjìb>{t?§p –X¹ç5ý_?XÜ le�¯ûMŽ£Ö¨cêóê½Ï裸§ø^ò)AÌ4—ºÌîcB3Y¶CHÎU‹×M:òô8v™{+6жàûÖù¤ÝÖï°ÿƒ¶¼ôþCxnA 6‘ÂEXt»?N?íŸ\‘éȪ ܉+þ§Z<øo<óG>^Ë¿k@4׿¹�~Çõ¿>îèáéÝÆWËÙ½DûÏ]OHb‹«1¼ð´lÁ1‘ÀÖ²ƒq0޾šQ�ÛÍ–Bˆö”Ÿ7íÀâã¹}å§Y[}û_Ý~¤ý�®ú†OOý=¶äíõ„úiæXó2Í�?rÓÞ„_ïüÀŸµ( »¾Óà·`1©3ŒX…qø¿ ŽrU^…[”WjPY¸•§ï À5Asì�úî̵ŠÖnW ¿á­kò¡ � xÿYÌRÍ^Cþ½'õëÓ4·ÏÚ¡+¯¢Îd¾]àÁ¹ØY`‡©Ì@½)ËŽwª´ðÝ3÷µ:®7¬ó •�?@‚Ø•r�…ð z­µjRöKÍáxM�‘Z�šnék5^BªR{ÈfJh8j:) õ³‚²Ç´�{�L4GK29+õî·òÒ1±Iv«÷Å“JâÈÜœY»¥Ä@P£ü”Ìcúú|[ÇK¿è Õ0¢8•9~ÑçjÝàD•)woškh}jJ¨¢ú˜ƒ¥£Ñã[ ÅA:ŽöèhÑ"ÑÚ°®¿%õãñwÿÜ7•üNÑ»fÇ.JRè.Ž&5¨·œF.sÍ{rˆMíM™„Àyf�HA9ÐÈo Jè¬2Q)öªÄ´çš:6É‘!Ý_·ß íä17"¨âÚAT@œØ�ê÷‘¿EìBì{Ìäí«Ð\¢ÊÞ|_ÙË#T4c&Ý'rk´åÊ®5?z–Íç0Ÿ9ýÀŒ;Ÿ¡*ÛdŽN*÷ôç®÷}_ß¿P2’˜rÝO×f“¢Q� €>¹¿µ…è¾+Äñ£ÅÁ?‡lñ¯OϵÒ7ãdòˆêâU½ÕÌ*“®ÈP~’.6êÉõµü�Mî«‚Ÿú0pE›O\Æ=Õ–{Îß\$®*–]1ÈE&’ÔwæJiu­Êº�ÈI]ÞYËZõ.NßOÄ{ýÅÙ±ý§Êá†c mY›Ð;ò³r_Zœc¦×m|Ødr—Öë"ø‚»Ì9©€–\�rE\¤zâÿò‚‹g(±¼A’Mk�Þ–÷ž¼‚G¬òVãÄOµ¬QnØ„ñ›Ÿç £Ëä,ß/~6Ï9Îæ‡O(‘luOj8Œ{õ8¶ÓDÎ"ÙL¸ç§Ý‰+ â£WÃÏ óùLÊþßs¯É¥m’ÓN…€÷êo²�ïg}E}óŸÁ¿·åŸ™¢~[4öðòüt+Î=^•!Ðå~NU §&©Aㆸy®«K5côóúÒG]kÖR¸l0Qjpó?í÷‹úf£…/*;tUZ2É»|0» ÉÒeÔ!£ûý5¼bc|´�¹"é±âð~Ó¸©+uv…·ídÒ=ùoKïHYôÜȺè�;v@Rh÷è�˜ŠdêêhÒÑÓWK=ä =PšQרˆ«r¡›*÷ãÕ¿;6seXöhNsU3{ó;¿¬Mô‹{Io/ú»ÿ6Û ØÓ9Õ?C¨Ã þ‘"éš/g·§Œ´6'\½¯Ýø ¼ôÑu½'t.-8—`�3Æw "ÙP÷×Zž•,ø{‰4¾X4š£œ'  NúîÀ’þ´>TÊ^ÆXkºÕ\+S_*+ÝmË’Ç‹û3QÝïüX…/�$_&*¯Ãi…Ípckì´P!Œ‰ýûåù7ùûÜúO?rðT}ÌUÖQG)tšÿ0/¾…[ÕwÎJd‰  ·(¯´žfcÈ�÷¸õ®ÇJ°»©³F¾{à~xÏåÿ8(ôÖòHyEù¯":òýR¤¨¬ä±¡5'à©}ëòª‚Î8M:ÐR8�_ó˜·¾¡ë÷)‚êh/æâ RëµA�aÒÃÑã¥Â.µvÿtœljù:åܤFs_él='q³�:ëú=¡è¿Ýò¼ow¤’DLÉßTï™H2%Eª �1×T”CÝêDÖ,p}¤_>÷ß¼ æ( ¡ S%TÍó«a†?Jæ#3O™jÔŠƒ¨æ½«“• J>Ú}’*U$„p¨P+ġŽä%µ£f+�ô1Ñ�FÄk'ˆt•Cr ÐÈNí §Ú‡<²;éYûÏíý~.ÓWÇïû??k­Ps§:5`R˜ŠI¥;’uåk:ïꌞÅxfŠ]®pœa�N@DÑGh?;ùwÇ5¹O»üªÄûÒÃö’«�뽉N IèSéJC°ÓÝp×�G¹&Z»ŽóéÍ2töx>õ&ØÙ8Êì“�¨>>{¶Z·�Ùá�÷cùõ$=&�îˆmòðûý&üÈÉJßeoŒèØ›vn;³è˜§ç÷ûxZûC"†vËXf[-zUi0Õ¾¹HJyB¾¾²ÀÕŠŠwB|½¢&=a~;?ü‘8rÊÄŽ"�ór�LÆa� íe¬UêÃñ+Ñ2ßõìó*šJ4fŠŸJuúIÕ7ì¦Þ“—¯úñ ]î{Åì)-IÊæ&7¸©ÐlžÞ?71±råŸ\FLÜïó0'èÄöÙÃ.%å;µ'ƒÄW÷é)îcù‰­gÐüÍà�[~\Ÿá„aŒç…êèè0ŸBc»Ñ iíòˆ¹Ÿ�×&­“%|Ç÷\QÔ»{ œ»W~œÔ}äÔÝ9ïˆÄUJWk~!Q·‘·* åêýˆ¤håðjßgñò3WÉÓãYB#bÞ™¥uõ(½ãÏ_7ºì qÍVX©«ù¢}Y�ôø#S§¹µFÝ_qÍvت{Bƒôú‹æ,Ìs”¨¿9z²ù_ƒ¾>õj-Báoôw-“!^6«W5.™b×<ÇøƒßϤù´óŒíãÆé*—[ÉŠ;u¸O\$ùZK×rÚß¾X;g™ç¢ÃM‘0عÙ+$ã±sŸÕÙ …s²àBT§scT¸z&›âõßl‚Ï{9†ÄSõ*ï*�ȶ¤“äw›h�b±Êå½Zïw�aÚ—ðZu< ÚýW½ÊòÞŠÍlÇë…í-³Ê?aVõ�µù´&¯|òËiÀ„g ³³¾ô¿›Šä|wë§õ³>®\2�Ãñ¦ÿ¾²tµ[�óÒk¦üÏHbYÛÔ„“’� éÙÒóÆoM‹T‰L¸˜f:玻æÎ[Ž´DÁkŸò~N`Á¸,(‹+é¹A¾ ÚÖ‹EŒŽÛÑÐ&mÝó�·o/¹i[Wóìr5µBn;*÷+*(OggSÀT•˜ !Ñ9zÿÿÿÿ[ÿÿÿÿcÿÿÿÿXÿÿÿÿ`~•[Ôwú)�±ÀnV_i3�¸𸾽ÝïevÎ@f¨øÇ|9Lé¯ pÓuÔvBqÿù~4 ŸwÈ2µæÑL)ð�^]·©4°FžGÑ*@ý½ï5!ËL®ÇÞ¡@Í¥Í"êgÉ®:e4ô4çÄ!µr¾S«ƒê‹�Cí—1J£ƒNÈê¤DÈËYžµU(��e§ÖÜïÂ¥µfž×3¯>èå€jsöäW÷ùûóS›î/Ô'gÈØÙ'Ý›£„6¯ü-��%ѹ+8hÀ‘ÊìmHÇœ>"³˜‹€ë½¿ƒæÒ/ûéÂqº[8 e’ã£9Hl)æ>Ç]¿þLýô±ë«˜Cô!5�Zqä9<˜¿9¢¡“Ò'»Në�„?ÍCÏ� žÌ5B/—¦âeHè�ÂÚKÿÕáQ›Œ»ãóøD­N´Æ†ß|DîŠ6ò�S·')�RX;KcvûQÍâΓ9‰y¿3»ˆ³�R÷éúœ­ÕÌ·„h¤Íácón.G_ (±¶Þê¼Ð(|,@ùjŽ>ì$|ƒ™2jNp›Ž7c¼•¸^¡6Y©.ÎS-fìám¸ß®:¨…‹¿ëŠ?W©±·ºþ2“]ÂdžŽÉY‚ý§Sÿ©‚Ä»}¤øÎ¡el½c{“¢Xpíí">BTÔU;ÀcE“£vaL>OCçá–�·*ûÃ`»wÉ—ïþ£¹Éäö®䩽cÄÛ�[½ã™iËzŽ 9´ü~¤6>õ*é^„rn)7ÿu2÷ç!zƒ»Öø5S&5ƒå`u•.çød¢­õ3wð ð‚Ì�nÝ!D¸yé ÙÌ᪑‡LL—x¡ëÞ†§uìþ½Ï— {÷‹tz#üÄÝØcô>H9‘#k V[ù•Û翟~ª.B›WïU,ù:¿Þb˜)‘`•ö]�¡{—¿'ï‚??çfì*^La<0áHYÏ陊ñu �ŒãRl™­¹®i­z¤ð‚Cï«Õºq¿Ikï q.‰à^:[Æu|¬¬ùÿ¯"°5øÈÕݾañkB$°ªòÝZ£þƒ•œtæŸ.iD·ù³cvÉ+ØXè¨íöÇ·:a«çõN‚H‹IVN½³×‹Þïï~jªt±#„xéâ”e7kˆRêälâ×ùª{ʲ¢æ°,ÁbÏÊþ¬rf/7¹dz?ã¹�S—AyŸR¨”Òt.¹#ÏltQ«õÏOŸ¬nT/µiÏÛË—øåÀ�ŠøÛç}‹9·GCÁþDX·Îèöõ`(÷r¶<žesb”Ûf0ž…;ùgúJdpp  ·+ÏøI�Ñ:ð© $÷_¼‡‹ÝJWÂñãú†å~ùÕé@Spü·Â| züí¾z*²t!ãR¦îìJÌ]�w�¯Ï½‚b(@#—82ö#œóͽ@àH¥{qú¥�îŸ7ß9;s˜ýe‰"*Šö~Së°gësEˆlá�JFÐYTYÝE …½l'™UÉÓ�ª¤ã½‘ÊM–h�¸Ë^ÿñÁsV'”õ\ ¢Bëä-ùN)é4UZbo…£’A· ñé4�*R÷nuë" ©Éñ=w­ªQ»juŽlÉž+@q´ós…n©™‚ÌP«ÆÉÞˆ×Ú3_SˆœUkGTÙ×JÕ¨'ÐZ$?ÏíÍ»H‹$•Æ+ ‡®?M t‚ùh&I�ìHÀQäÉ êÑ- Ò�†v:{œÚŽN$Î o/W!»¯WqÈ£"JÄ N7û,G—¸o�üëßçþš ©fàÿBGûº'¢�,?ƒI�S´gœªÔ`Trä™— §v!Sˆ<”ÑN“ò§l˜$#Y¶¾/OŽh•9Á­"íCŽ?è&ñS!Ýu�¯$C€¿=e@ÃóĈY)&ÎT"B+¢«ãÃpFϘV¶|5�ÿ�q“±�Ë�¾ìÔû ¿2ì$ó»Ùa§ÆGŸ®©"µ¢÷ ªƒ,oH».¨ª(ôêø„%s$­o Ÿ+È“õÉò–ðU¥y梊ë‹xæò¼¬ãjël“÷,#yçû€/ôYÞj7¹±ƒ²ÿ¢öÓ~ˆLú|KE±Ìîþ*kýGk÷…ûêÍò~«øtr‚žWÖûîÞËÿĪ/·—½éͦ{*þs’HQXcGýíÆ@uR}õÛŸª‘{Øl‚�¥#WLïß½‡}ëi~÷6î;lk†·ø,¤‰Õ\j®×�SoåBϲòDàâíõ‡ñmÞñ_y¾[]Çϧ¿�@›Y\® §¹ÎÞAÞÓÙË »Ã¦®Iï]Î�˜?û!XU¦S¶ð8Oá+|•ú±Ðoö¸jœrkÊŽgOF÷¼Û_ «ZRe‰wïOGû 86÷ÈYp9®Â¨9Ýþ** >� /œ]ó‚# Š1ç,÷=ñÑö¼á÷];øñ7¾U…ãÞ?–³žÐ'ÿ‚ÂÒóŒÝÓáb›�¼ÓÆÍ Ùû.^Wî“•@6×§.8Ñ{ºúmÔ]_b¦’Múûµ×µ±©ßß¡°­þj˯è“QÞ°“_‡h²Dê—æ&W¦Ö“_ÑÕÖ›°Cï”%±?¶Š,j „[_™²rŒå¼Láïrß­¹¸.ÝS¹âÌùcZVoyßêCëlpK¦ø�•XY_7tlÔ”lÆë’¿ô£‹øÍ{ÿùÞ»œßG ÞúEØÓ}zflmî€Ný°œãRŸb½ùÈ“‚¿¾ÆÇ[ŸÆÛ2C�ÆÆè·µ–Ñ_­¹­îðÂræšµM_¥ˆâ»±¦C©ö(Þ…»�DOd¢r‹ò ³€Ïà1�ÿB<ÜgªÂ 3Pû«¤|ª}Øh€÷Œ8 Áú¿¯ž³¦ áÎÓR9ê$  ðENZ‡.€Î4‘g® Qüã7Í D­!ò�&ƒÈךÐ|'¤Cä¤ ³x}„¯k÷T‡€hN·ûæ‘ýc:óe9í•r…úŽÃáäÔ¸~þ�Ó¡Á]?jÏD­í´F¡QPÛ)vR[UÞ‘ QíêHÖ˜è�Ö,’„�Ÿ)�µ#CNm4"‘¢˜ZxIÇ™’èˆ Á!2 Ñ­SèÄ74' /¨ÅQ�"¤»®]‰$¿XêÝ Uªyìu”[Üœœ¡4ðH °wt%”"œÔÉ‘šè¨©YG%þï‘EÀA�Å–/HÏA©t�3S/�Ï–è�îØ2™[ùÍ:gB/�¹´Ùõé£nBÏ=úÚæÕg�CñÎ3�W IßZÀá¹3‰ýCš ñ©{†²GW€'C2€çˆÄ8ÕeO¦«;ALÏLRû“oåÙ:¬úKÊz@œ&¹tEdÔmèifÁ :-Uî˜õuºéV’ßuIÄtÏ¿’¼—´7~~¯„ËýB7àøN‹Ü†RoL͹”AŠßsRÁŽ3™iÚãwíùûÕ×kõWYß[ÿxâ¸ï¥lR“÷xž? #møó}n¢|˜7‘+êoº»Më¶ CMöž¿çR,ÔW.Ûº–< |bÒPo28T­ËŸggטœÖÌXhùY–ñß+­��šÝè´/}ihÆëOßçÙŒ9ÏñZÔ&3ð_ óÌ†Ê oxO\Í›ÁÀºå‹ï?¦SÜ» ý@ÕçÌ©FæüÉ_‡âa»Êÿ—æ§�zÈÖDo’¨µF„õÂϽØWö~÷놖ßdB7Ÿöï�îíæ˜Ê囓4à_[s!/õ¶ˆå†eùK%jÛÊUäöì›ù¬ËfìšäŠq~î«–²º»ÀØËå÷ÑËå²¾™‹”[Ü€:Ú¶ÜØƒÈWíþ]KU²’ÝìðæKÉ^yžm‰Ýܺê_ÎŽiujÍ‘‡i Šž#D/(̉ÊÎÅÿó%¸zª¨÷ÞÒ¢¿¾Ÿú r×b»IõüŒ]l¹�S4ï8ȵoÝSnË¿yòSþ¢È©n«âwµ™žN¤Õ{‚Û¡žûeÔQØûøµŽºûœßœQ�ð;V}¼-…Ç#çÕóŠÒÔ«úwײ´H?%:ãò%{qåΘçªÔËÝ{¾Ð;ù;8² ÙÎ ¸¯mÁÆšá1g 2mÝ•'ï{Š<>ªü-Ï?ZsTŠŒjŠòÚƒ¹��å¨d¼Úÿs>×´°·â¾?¯kq·Ü°Yù|^äw4_Žõ·ø’ò1] Éü,ìâÖ�›(^…;ÈGÄL2�)Ü¡>â=‘A+‚ë ÀµýæºkÙD%ºx{R÷ÁÙï5å¯�L ¬u¦�2öÿTÏJä´©8yAÑ™Ìuø@‚í½B7@¦‘Ó‘N4ª8å/Ãö”"Ìm�rOf¨5ÓÍì´¾ÎhPuÑŽ–u9�˜ÙçÒ  5ÎÜ$Ê”dg¾¦»}ÇÃoOIü¾þî»WÈ!N Ê$5ȭ§î T(p ÜTƒ$kçî„|+MP‰:s’ìáH�ã4�®ŸEmìt‘{žÿ¸Ù{NÈJM'?¤ÒGQ)sOÔ¨´ƒÖ!‘n�Ö,îß¿y|äïRm×ç�ÊQ�Ë�ÚMÿ¬SÍ£&ä.‘‡¦„ÉI�ú•š(!¡u'_BEûÐ\�ì|j$ÊÌDÕ ô Û!“lÕZ?kJÈD:LGQë®*4Y4dUÖácï½%£‡�NÜT&‡†ªt¹BŽ‘ª‘_¾FÑHÖÐ@g¯Ô~(Df/P>WX:¥Ç釶c¤A%tšÜ9œ*ÙÝÄ1fD# ‚"䎹G<\ôfy´br=rÏÌüzÏ£˜GÇè>Êhª"#Ds¸öd‡d&™@ë Õ p†€ú#<­e�b£rÍf`®— 34�¾ŒÒ|ïE÷~:ˆ&é͟˘(¥ A'Q‰¬~šÄyKÎû^¼Ô§Uç¦iê_ŽÊû¼•š»‡>oì÷¶[E>le¬µ¹ Èý%Ól\SkÊR×Simýh¼Ùm8¹î¦ßóßÔV;çÊ ÄˆÇ\èÈzÊq�SWëMÉ;Þli/ây(·f3¯~{èI'甕s )ÅòmUŒÕæ¬SóîC¸s\18ãËV,ká­Œ·ãÍòð:yM¢£x;Šå¯%¡Ïléôžÿž­´+÷Ôå�c0À—×ïípØÆ| n(Nýß )ÝN]�–±@¯wpÄ<Žg¶&{ã4b§3}wtçp�[ª\øcÜ}ÀSÃë›Gó%HÔ«Zço7(Çb2ó]wB½åjD™yÑ^vµ¡çÛ\úwÓHû«–«köáo“uVÏÒµ<<¬ë©òcÔ¹§ïͽï÷Œœ‰ö=°ƒî¹OëDQ­UDåBaáê;öf¼ó™_?B­Ätåd8u»°þ‘ký|[‡YªO뇺�·l/¾Ù§vÂþþ:Bçð8=Ýc\ûÁ.ù\D¶K&åÂO‘Åþ~ðÞðÜùæë­ïÍ*[ޤ²ÂÕàÚê§-j`Ñ·�“ÕnãçÖW$§·=¹ã"ûà)„íƒÓp!O|¾å÷ÄÒÉ�2YËÎiÜ}¶»þ¨ÎþÿÅïCçö¼ì ʰ³-4“îAL�¶Ê¿GÂY‚7:&ìÉ“‰D]…ËÄf6xyUÀ=rÈݘƒÍi²ç~Ò±9ÖDb#1ÛŠ4Ü~Lùêßš=Sß+Šr6ýlö­@{Üj$>i„!—^~ºÕ`¥I÷`Ô³œ&°ž)нB¦þé¬T2OggSÀT•˜ "e‹FFÿÿÿÿiÿÿÿÿVÿÿÿÿcÿÿÿÿ]^…;øG8 å¦ì=D ð¹½ÿÒwŸs?Ь:»¸Ä’Oó �K3�L@™4rþýª: }$/&ô,—´;UMU '?¢üuòHúóÜ?­–ãߟ-ûD8õ*kLk•êpå¡§U€¯I’%4]÷¢›©>ÿµ *úÞ ¡•Z¥n8 ’8«-éœ(¨RkNŠÖ]hÆn¯¿wñ÷ИuMùÂ{—J‘8GT™�”%åH‘Áp§EçZ?Òý«¯Gë«X}¼&•üAFm©tk7Ì.±G²v ‡@^%uš1ò<> 뿎GkÍæˆh¼‹=8}]~òÓùù�ßÅ�|¥�FHêºïÝ 47ER u-†nf‘EÎñe›Žn´RÑ£Ç t8]��Cö¦Ê,B…Ä Z�¤äÞŠ€v¤ˆ)GÃÑ¢Uk�à U•#þعäû÷µmK'eˆyyäòÌe¤*ÌP pЙJŠ¢ÇM€�D¶ý!ûÉP :dê–ߘüw¨¢R:ÝŸ_‹ƒTû$ÈßKÄÎ5íåš� Y¼w/ºq¼.•J�„0GPrËóÞ¯ý81û>w7áUG ²STÛFr žÖ€¥D›jA$͹æE…‰2£ñÇ«Þý¨=rÕqè„Sèzö|ã’ 4�ˆi"ò«øb�É®Üë�*…Ûæ ç^5?ÒBÞl4TœþÅoï°Yí�®EÍ£†?gq¿”ÐñE߯§òcØK�ÓÖÃnqfð¼üçÑš6 xþÖ² ‡\½³–Ë>"–œ<ëT…ïßÿ}-æ÷6âµW©-ªJ£ÕþUEÖ¹ÉVU£†r>�‘hãkÿ̽÷HÛ ¯Ž–§~ÏRkÿªUF7ryßxäÿ¥ ]² ý—cÇ<(þÔ?£ÉGÍØ`±W5Klv5�ÁàU+§¨çàó)°úUêFF1 ¾…ÇÈ‘>Dc?YÂ8—LÑ C}^̰u•vÿ»K; ŠÑ¤`×2f7ÍbÇ[ZX[l‹íæ«t„¶ã*?¥‹'½­Â¹ó“Öb|Ñsª«sÙÅY³étG¾¥•$@ÞŽjòãÒ„IÅeJV8tTt抛 i4Õö–¶jg¾bm_þC(•ÑžÎlrùc´›•<økã©ßxÃhï•àÔ#$Êë./âÿ�Gk’ÄΗý¯Î�ãyëÖ£ º…ޏ&ÿ¾Œ|¶ÓÆâÚß`ÇU¾¹‰Öøá ‰Ä_ZLõ4ÿKÎÇÔÉ5v~°$lÿöòN?þöBÁõ&Xsín#ü­x>ÜÅ{ ëy_ºöRŸJæÒÙVç¾7Wš>g‘öÇZ9<ן÷Û7‰ôõ¾ö²ÏÑ×,Òî²;J´Q�L[¬?JÆô›Ê’1ëkâùù&£ÿsñß:*߬w ÷£†æñ2ôòü+Üší½'ÿìoz½Îh­Öbfþªü· gø=¨ ¾÷@ÙÛ–U§Ž¿ï¾;sC;¿~žú¨âø@xc@óž…Û¢GX &À®åži{‚ˆ}¸>Lk~{·B‚&‘”ÈÈð>K´ dÓ­N§À™õ¿Q#Á¨Û�b€Æ ³ Àƒú»ü¤`"!òU%§¿¼Þ/@ “’ó;:wÍa½'NÕ¹zïÚ5A–zˆeânW'£Pé�§k1-M:U•“f¤óÔ�§]S¼h‡ˆI ˆî,bé·¯:i.†qIè>‘ÒÑÅ!=H�)2�§ó×£æäÁ5žÇ×Ã<ÞÓ¼'¿ œ>�HZDk‰C³ˆÔøi¥›ZAHRzŽºnE‘NfDÍOZ™è¯zԩ窒qö›¯ M°‡vε†DåP팦›rM­Ÿ(>ïߟù¬³J+A×X>ò½Ïg?tË÷Û¢§JUÀq²Ï/ “�foªšµkÀB)1?sï+ã:ÆŠ{ˆé=bÏßëÔë>û39UC•ª»<²Îc?ª˜Pîi­˜ëCñ·õJ0¹Ì1ãó=næ33ÐÖ^žEËÞõÀ3#¯é÷G»ï§çÊ»zRïé…«óŸç9ôìÕ®’Û-‹ûwÌîgl’èDJÜÝS“]Ÿù!DÜpÿYA)$Càá%µ5¬=Õ÷Wi¾èÈ?è‡¹Žª´âÒÇ.ÿ­õn‡ ý$NV¿¬26ϱèbÃ!èçn'*W| ¼Ì/ú"¶€oÿmôö‹Fmf㨶ùe ÁN¦G˜?=„cu:·±´X¢Æ[ˆc¾oV€Ÿ?‰9½w+ŠHš¯ÏE¹œBÌÒÇ“K‚­×’ÿÛÓá’œ1¦÷ì…ZFÿ7tíI»ð ß„vrð\C®~Ö™&Z/cÕ´r7 $ �*B¨$ã쎼]?«ïW㙞¾‰„ZþôÊ5�Eýg2Ž*}_ùZ™àê·ù«<þ¥ÿÿþžÖZ_z¼ðá·‹Ãê>ë÷µ\9>üSÉb¼¥Õï»Ã„Û°ì ûÔfŸ˜ôïk"Üz³´+û}’ûýðK¬ !i gŸ]]Øßlîýåk%ü¿Ç�Ì—»ŸªþÐfù°âó¾7HŬß®NüOüi âàÜAæ¡Æ„×á®TnÉßV¡û•¹(�ó×ß=‡”áç‡" !+ÆÁ·Y¢²«3„³f©�úð¹Æp¾¬–r.!Õâ†QíE·Û*“ûH®œ?Ñ¢üÒï‹jo¿rŒ'¯JâÀíãmzÞÛ¬·t»I/wöê�±ñÖCûÒg�ÛÑí7¾ RsÛ¼yrÓ‹qÚÌvS}áð¦èä”í Œ±öú+“zâóót鿎7]þ}—\¼z�Z~‚ÛrR�RnïgûÑcå|³Á÷¼­ðÿF»±cÌ•ýB0uN.ñ¡—¯¹íêXÉÕ ·Ü“zÿCæ±yë�ŒZAþf¿}i^™ÂŸß;¼œÂi¯›^¹IXXXïÆ·µ©¬æ›%ycádIó  >…Ûr·°ÀI¸)|¤Í�ÎÍ�ïù¯Òç†ãšRÔòõD.¬±:<ðµÛåíÙ@qdW¾Ðïþ HÝ�úØ&öžŸy¥à'„ãyåBnš—‰h8k$?ïrÈy§GÓÑ)WgW�+zPqûFi®5×S#úNB¼h¦T=+ú6æ)„I¨5¤9(Z_±+JÐ]h©s6YX¢ùÊöùë^s;/;�$­{sè9×8Cª�9ŸŽ2QŽÔJæëe *GÝIè¨�PÉ í©èWŤèY†¬�ªÙ’5pú¢ö4™´…¾FÍžíãp¢þúüíÇ÷žuNu¤p0Ó)bÏœe‚¬yT­O¡³(J•EkT}tj¢IÉüB!ØCYšpjP¥î©…¬ŸYVäã¹ïí®RqjƒU5O}�–C Áј*U›âˆÆœ2"±±}îno¿Ûg'¡×]< åz-B¨­J±;4Q‹Æ9´ “Ó‚ê� EÎÀ-#{ܪWÎì�¾W $lq/Š<½_©[×âåEe'“"¡3#%nc\©7æ´Rïg Èž‘…gïøIß‘*Ø @2$ ’WŠ7îŠò{ö¤5!Û½h€¿kžMϹ­KFÈK?"�/¸ä´„¿™Ñ©è}�'ÇNö¯kj¾,ó8^ýbÅôÚÁ¼Éþ§"6Ãòl=† ÏFr'Yƒ­£ïñ^“:Ç—Ü2œàÙüõæË_ƒ­1¨%ôå[îzæqCš'Òý•0–«ß¤ÒºÔ¾Ú®-'€ëïŒ`Ìö]sõ-­Hß{ÉÙϹô™-1ÓY¼útÖ:÷vßö¬×9ñèoöÿíÌ*æ´Ê”û¤Ë–ÜŸ”»á„GÊÜKM8b¡”¥±ç“O©k¤� À}}}8î™�“MõWd›° Z.´òuîS±uû•D£sþªÄƒCâ~&úÒ>8b}Ç jê”Ñ-³µÏØïï?ôîMöx¾zUë¦în¶uÊØŒ÷ÇxbE“pÏ´¹.oGÓíYÁ�÷[°ÂøÁÔ¦+õ‘\/it]åV#:ü½X*^Êo®Ó–f쯿ØGºŸ²#àX¯ä;–T�’n“Äõc[]k*î½ý×Dl8Óu ›—úeø¿ÍÎ-ï­ë´é~ÝÝs9â�mNÛÞÛœ©ÿ×ňbÂa=JÀŠùMˆ¯ï$5¹¯ (ëdû‚µçD{„4¦C/[ðó\*ÔaeBNÎ)¦ÉZ9h©¸è�Çk­þþŸFÿÅÂö¯'þ\gž«®jþFþe�¬Ú?ÜÚiõÕDÎù\‹®ßnš¬B¡RæLº\*Šî\au…[Á#Ü `†$Üh?R{7ÑÁÖÿÄšÇP2ÓRÂýéig=ûÒAv ^ ]�ŒÉýßè ™Ï9òQwÐAVà!g·¿ŸµUê’T€þÈçËeJ`è®ÍÔƒ4�Ï}üÜMtïB�¯ìuØ{Âxˆt�|ÕìZTí*]žÐ‘­¼dRùûž1Ý !+‘º;89!Š6Îz¾ì=˳cSM¢2Õ€–ZÐå)§ŒÌŠL°ç¿›+Õ�òM_·¯�•£J°�:]锈¦Öªù‹¤*¨$•ÚRT¥a鹯GîqôšÅM5v'3�Ù!BG×»Ïì¤JÕ΃l'£˜CSÉd¢+k7¶cüë=.•¥�­³ÐÝY©¬g}ø—ÄÉÎ|�âã„9Š¡¦ñ$hN0ešµÈ¤;¨ðõr«£ „C@àT ˜Bœüz(ÔªA‘š(Ðdm•˜©Ž3Ý€à†;5ñøœ‘%ù;zûÖÖC¥jj R�*]l “Hü†ß?kî\²ÊÀ ÔH‡JkÇ/ÏØ¡ºgšî 2q [3>©R&IeH˜ès;)cXïKH‰ÃE5áäÄ>¤ÉEf®z9‹]¡L¶Åõs¥…꯴ã}~äJ1‡2o"WwÝaXz\†¾=ž ˜¢JsD½Îµà¿’þGä?b{oÿD3kæ¤uö¬NîO꽚 jlûèÉLë ÇŽ;þG}¿Ö¿"éõ[×ú·…Ŭy«qµ²U²Çqf|òñÄUYI¹Ñ&]W„…Ñü±2�Ý+$ý“fxvà§K7땵ñ`oÝ×q}üe~ÏÙø™)þ{å/�!¥ËhÝÅh'¼Ãò;þ¤ÂãÄ•¼°ÅT!b%Á…Õ—ûû¿(�UýqEü¼ ÕFœýËYÝßâ¶‘Ï4wìþå`ïÂਧ'&y[rNl&?S}Óéi\™Wvè¹îy¤sÎÃjysÓ,[ ’Îìgo&”þ©gßW@;þëUAnð'ÚáÃû‰3ño©š].rº ·Âî±~áæ-Ý}bÁxP¹_ïÀUT= #óWÍd÷K¡Þ8å�í—5ÓÌw´õ«áÁŸ×Ödݪ^és2L"F‰ñáRUÞÉ+Q[¥UÐï—˜ ïBtÐ.~·ÕG¼‰Ùu¿ƒí3|ÔqÕ‚Ó{Ú¾ ¹˜�mïús0[ÝùŽs»º�%9±ë¤÷5Ojbq½®W ù¼¸´8EŒ»˜Ó—ßæ”­Ò“ó4­}T¾e–ç‚®'Û“æý—¢|J‰ ÈŒøšÎ5-ùki±Ù„ìôóû½£äh�°qxNoS­{5«¸¬É%~|hê�)ãyœþÒÙ’Ù7ßÎföü–ë}±(VW>9$¸?îo×¼—UÁ®3Ø'¶½©-ø h¡ÝW£4 ÷31ªù‘ OggSÀ$T•˜ #{:ž�ÿÿÿÿ_ÿÿÿÿaÿÿÿÿaÿÿÿÿe•[¹gæ)P°@n²é'Ñð_�¨ÿýÿU³d,‰ �ÀSh:Þ+R€ÏµÇ¶@vÃWœì/ZkgE¿üЦe.à»×À“T7«»C%¨¡`ü%zIUä^°Ëçp„¢dî÷íÎgw£ËÜ‘J„\}ºp壪“1÷×sM§™ äYUA¡& 2®džv”£*5wzsŸ�©y>üáß8�3 D�¨a’Šªs:–Pœ ÕìÜŽý/�3šµÎ!?_:KÕlMÈX2*U�=³p³²÷á"ë,O±ÿŒP�gmᘚ”«VÝåŒN!k•"2ÝJÒkòz:ÛÔŒ:‹DD;ÑF­ÚUfô¨TÇÉ vÎYoÚçЇæ9+_žnþ·­ª9|1—òW+ƒ¡N­{Ç‘ªÃ•Ý¡Ê1üöÔû˜?�aþεns~c‹îl»æQ�¨èžàÌ -Óû¿||ä}ÚŒÞ1)yÏótÈ�¤¢É|ú�»õÊx¤|)ôd­�d1Ó¡¿í’èïßwŒä³¥Óì?3�;6Š#úàž‘ždî�/�‘“i™ã–®Ë¶Ù³§ÛmRs™+v2w*’É  8†�Ëã�ö¿�Å ÕJ}•gž§1ÜŽÌëÇ$ š-¬žíƒ~ÑÍ‚œ‚¨K-V;®<©'—�a­í4rõ‘?wótÍÔïôÐ÷܃᫡Ñ`逧©_²myaºûü^ôíÛrI†Dr>65ˆîåeô å/ýù�ÛàKn£^)6gšr�mÉ‘å*è8úô¦‹3-ÄŽ�.H žÛžLj¤Ø�ˆD»]{OË‹¯/%*°%­�iϸ­?Õí¶1œ²»mjy­òÔ�Cðå^{ÈÑ-…xß·6«ì©<{jÌÚ#¿ãÝŠ�Éæ3õEu´ð_y·J.6=ì¸v™¨‹ÉÉE¶²”‚߇IÆÚPHDo‡F´gÌÓwo«)¶N¼N=Ÿ§Ä!X<Òô½»¹ñºMÀŸŽML�÷ð»òN*�ï½=­ºþ°Ð…`Žv×'CÓeJ�2èÙú(›]HJe1z…³·¦3Mξ½Úwô;—6“/—Ïå2™]ßÝb>?™Î4öý¸õ$i|±gõ¿úÞZIXÔƒû\sh1í.x™tþ û*¾„ó¥k²Å ©ïÔJù ºû_�³n}iĺuRbEÈË®$”ûëf)²95ÏfoͧâýóÊx.gú;^M÷ÞýjÄR´ ö*° $9�Î&-…[6c‡5vßæý`¡eõ¢0rÝ…Jv@ì'{÷Úýþ…Âäü<îå_ÿ; €u�àþÙVW ƒ=·!ý~mÍN×¹^÷Ïô„1OºyßT…d¶i={w÷¶;:.æ-m~žvi%Òy£¾ÊÄ~¸~1«Pš›7¿kÕòé’úr$ψ”o  ÅÉð^ýÚ©Œ{5®‚Ô\àß”…[¹GúIP0ÁnTž©“Rà XÓ·Ø…©wL½·¤BýçÖÓþÒ�XA¶Þ‘äz�ü�mTà¯lâ,µiྊbm¢•º¾uKŸDw÷Õ?C;fí|µv,ªbÔŽ9~ë€|"HœP½fÍûÉ¡Uã܇AÑlyB`�ňJ¬]w9¨Y�qçaýxêÔbì_¿j?¿ïYÌÖHwí?/*QhÝ´¢ Ô®�’L,ž_eöÇ/|Îþ+(d‡dæ™QóEæ¨u7êÔª0]…öÐ ŽPó«Ä\Eô¢£ƒL–éu.J׎ݹ^»û«¹�Þ�7Q:“ƒÐú•ž�K‚õJöª•ŠÚÐ�<83 t µsF‰€lD@ž¨ ™Ð³6µLDvDÕé ©„„½ßÆŸÇ¥gS‘Áü=˜jó\[ˆ,˜RѦ;9í�5¦P8‘E}ï'ï73“¸.æš¿;RB•È •‰‰£,ñ—rô2RT·¹Õxá3"#z¸·ããž%yÁ™(¤v…¢BΉà ŽÀɆrÇ¡ ‚h×T<¥]‰âà䎂 Ä.TGBR¦’pÎI¸ßÙ¾.£mæ5Ïï]äÚ]»ßÌ�á¥ÂÂmÃûÃBëÄv‘˜ìLŸØüòì UÌêüÇÇ¿N"Æd pÍžå‚ã¤?;³¹ë©ÅÿÃ{\iõæíÈÅ6 *¸NÜͨMúL"&…–{“Ož{ >gÊál³ Ô·¼ûŒI 7{o9 ¿S_q†SˆnYkQföùÔýz燣ãÉi„™nºb·úÒ\¯¾´»…ÊOµù|ÿžŠÙÃG~‹ÄFë´?&rØâ†¸å;[Ì(ßA?'±ùþô3ó»-¸¨¦ÇϱMÊú×Ñ "ÐúÛüªfÏcÛ6LÀ‡ó[O<8gïÌâÒ‹ ©‡ß*>2·¹ßÞý¯7$îÍm"~½c¿9Y¦y“Ëçxn»î¼X¬Xz–›ãúÔ— ‹•Â\¾öI©¯¦BTn—}âl�Ë îtÊo©½?Õñg¡e)4º–—Û÷;1LH» 6öÛt!Oˆî\XM#2ëIàR0Õ�:Qá]æàwé3ß‹uéø›®Ñút x“ÈmOÛ%’gD$È˲´YÞW)Þ"ÑUµäÞ¼�ó6Ÿ‡%2î¤÷Â�ø%’mÝãçØ‡ø, þ‘z´ƒŸ¢à5õï�Î9âžË#Í Á�.Y3íl£÷&®]BYA<^Ú­¯\ŒóEw\„Ì®¼¥ ÐGºáÈè›oÂæd0š«å˜95ã}"åò�A¢!ä Ρ~vvô�œR?{ØÜê£mJ¯MàkŠøºû¶£ZË䊓ûʉ;zŠò÷O\Ô5ú°Ì/w‰.÷¶ýbôŽ”ÚR­•r>ê‚Ýçw€-;íf$¤¦x±‚w Ò+mÝý{ I*ûù‹·Y‹_ïTžéãɾ�“�Uivá,Xÿßž…;ø{´%Hh™'ÜÎßÞ bpM`Å‹³çÙj]ûQ�"¡þȘϳ–� u­­Ý8ô„œ£¾ 4‹‚¾П¿ä¼F–*ÿfuc»ÒKC@Ü(uå¡“’¿ÏK1)ub†óqŠÛI¿Ý%EkÍC¤P ç¢P:w^oÉ$¸ÿä�°.N~ÿšDÔœ$çèÎäÄUÑXc'cבe?ÆçïŸdõ÷‰îäºGÐ3éD’€dý@é$`ªS•Ô½¸ö�$åh8±¢ÒN /ÿú+óçŠõ¦þÕ¯Ÿ• ÃÉ+¢W� �Šs\Ñí!ztÎÎ` Ñ*EÈü÷Чþg^¯-�Y9ŒÔ¿»ûˆ«Y}†·Qð1O÷ãçÇã‹.ÿ¾;"ZîM‘Èšµ�"òÔ•*)�$O9¸îá¸m»îc<Ô:Õ2R‹’�9æZ2ë ª³;ÑQNýûÈCõ—2§:N†j‘@¹ç¶»‰üfª‚{œ"ÇÏy?Òl=~ÙOs;ÄãšGïuõ÷ µÖ ²>æð‘ΑÛð8êªU½fÆÞ»?ú¥€ôðí!v= tzé%ã•bih¡‘ßÂoÉ ÂµMä¡€2$Z/$X›ž_óÛ{ÿIR}ÖÕý8+÷»º ~^µXϰ"fB¿û¹rá5°ÃÛh­â‰H8å®^-r•éøº Þï€ÏÌ.çœÌs�ÄJÇw>WNøä­‹OêÆÚ“ÔÙyÑãuû|Kn!‚I´�%ý6ç5ÉóÅÚ‰‹T’võþœÀ :.õúÉ7nPÙMo Âþçùй•[ôx¶½çhÜòìV×ê¨`«Ú q|Zó¯ìè"YŽÐ1w¸Aï ×ðë-·³EÏÕ 0HÉà½7õíˆ!"M+Ó~<[ÇR—YÚJd»}6.Ùž¤ÙTaqiíTUÛ°,+j¾!º.¢¬ùÅŠÄÉS«róËKab4Â]·zÑ`£ï\{Þ£íë¦LãNë" •)„ñIÿÍúS‘ SÃ,AHÆG³dü}k^ ¦bÙE„³ðô*ã@šu1GeØÀEl{ÖÏ`{}ÇŒõeuwø\Ò3Ñ7‡èITªóYÄŽ%Ø¡íê âÂávþoz7g•(v?üç_iê” -¤¹¬å6™Nö!9c¿÷K¶f]ñüªy¯�m¨?Ùd.ÿ>g®Er!µ«¹ëêùéOMöÚG1ð•í¯X›®Øš§ù!¨ÊëvY4bTДU Nyäøª|Š+jÓÇÆ–o\Ž_[þ6§îkP[Ÿ«÷^øŸŸóÆí:Å7~i©ìöDÙ�:ÌZ¯¥î,nõi`ç‰ÿ¤¢ôMÀvÞg»O…kIÌaØÍüG¥�„?÷tÿN»'®õì:ûò,G—;æÂ^±]ˆJ"±>•»’×Ô, ·’�̧,p�µõ� Ñ#”,.�éH$sMg¼ô3· Úì@r&ús¢ïŠî˜(ö:øÈá™Ü6 Gª(ÉP8Ö¹žã�:žŸâ C†Ü2~Æàðº4x×W…D™‚öb³ío‡¼¹£—*ò Øã(¨½”ñ´6í™3âµú`ôa¥e·Ÿ$\.à-¹âs îG~«Mvþá!ûnÜ£_‘„–¸½×]û&ÚR¹uµƒ>‰Í¶‰¿¤š’‰IÕÿ¨ñ]4{÷íÚ¦ �§Æ/ºøC•áÜõ¡CÑÛÑá"±·Œ—ö™Þm· Ô®ªóc¹ð¢枨µ-u�rç…½×c¶àáõB½BÓ™âz·ü·‡×®¨Uÿà 4PKÚhI“¥†=ÍèÞûE *ÇO¤Ýrò$äL1õ±´¬µubµ¥i8­Ñ⬫)Béüî©>ÚÖ,¶åI‰‹vÚ-x^LAÈ•iÂ+>%,;üSŽM/>§©ø•Å«AÍ›H‡ŸÃ˜îWœë©wðžo;Ò–ï�mû¤|ÆoîƒLݧàÀ¢‹šïòê®h<¬ô‰Š¿WÖ«—õ�«µI»Æ¿UaOê!ÉÇ ÿ/{)ž¾ðÍ.zÝÒNrœ»¸›!ì[OˆCurz}5ùùöyƒaMù'Ô¯7xwœ÷Ùö¹¥Æ}çßðƒFø·fçÜAW¨ÜòZÛ•ƒÔ¼Û¬1YþäzŠ …‹×7ùŸùIèL�®™×6ÕêæûÍõ�›½?ÅTìUy=ZlÇub|raŠC 9 ³ú>Æ.-<ñ£eytX¤±ƒ´“Ši*éÿéyò9æ¡}æ-z£µ,¬=ù~÷ÙgZ±eÎ'(Ø“wXÿ#†Z»[jRÄò‹HÁöóyÀÐÉ$ÛµžyÈ/y�Σ¼ ý]uãÒp5(È´™æXQ×!k� Îí×»LÓ(+¾Pâ©ð=.1ª9i˜V/ÀÿÖ~•W†Ì³Š÷ìt1Šò|¯eà#OggSÀ4T•˜ $°cªÿÿÿÿWÿÿÿÿkÿÿÿÿ\ÿÿÿÿt…»r—´HT Éð„;ø[ÖId­W Òé÷µç:™Ý|¸o} >zûœ' *èT%"\§»¿±¿N‘«B÷ aO úäNå›YSÞ/€:yµ Ôwì‰äϮеy”.Ú^„*fTgïì¦ùÏ©@*@ëÛ!i"ž×$¦,ä7’ˆ¨¡_:GI–¾gà$ùÊÒ!9ƒ�9Q¡F0A>àˆ’Näž Mö‚´D"™òh%˜œ¨dgKѱJ->‹`rdQjDtÝ�lœ=µŠxªé@ôÊŽÒõÒq„ðºXaFpéÏŸEGîæIP%÷Aˆi> x�]•&²‹œP‰v4R ùˆÐšÝ’sDMè][«S³ Gªž:�ã HÒÚ÷úø˜Ïí/™ÏîoœÆQ:È]¨8­ì5+õ…†šTÁÞuÂQè”mtÑâÞÅ5�Gj´üêa%ò@´Ö€˜éã£þ ot…ôóÐ Et4ÒzÅ.2““‘#ñ|Îè\S©ÀuSòluks†OYŠE‚d—ù§ÛK¢9}ª *ä­™â·G“J¡ ¥°y¬5ÊÛ$œïÔ½y†Éa]Ç•/5)ìÿ.­{î³þ¦)ÜÕæw¥/;œr±«©7 WMã waç[Î^»ò=Åú:t¶¦ú(Ù4~ýëp°¤¹jDÕ©vY„xmi=vW! ζ>ë«DRý#'vR {üÅÓ:Y� ¡|fæjvˆÑa/Yá`*NH´bsä—Ù™Çâò<°ºæbÞ Ö7’»´Gl””ô²çnŽó‘]}@š;OéeÊ+&lsûŽäÑa)³þJ‘fo&Ûºøº�+ê¾7Ôü±m¯~E8™*R‰á¶?ôj{€ í™/Äïy°+ÕÎ!Pj™û²§ƒvïñ½N.o¬dÐ ö<œQk¼r^UذõйN=x:D;ý¸«S³ˆ‹>^®]"29>Ñ0ÿ_?Ý(³–RšŒC|îIå*+vPÔ�+þ®{nÒ>î'|·í㡟ô*ÿ^ïØäKüQ½Ã¬ûeáwð;Z$ÝùõŒ¿û0_*°ò½>~3^1I:÷ñ/*ŸX-Åk'êusŸõ½9o÷¹@­Þü6~˜ôãy /¯»„× \™p§ãLz&e«ŸÎ•ø\¹.}�@â:ÄÍÃÝôTÉë•k6™¿4'µÉìb^ (£Þù×{nw<Q÷Ú½Ô‡QŸï³ÿrÙn]Ì•/›€ƒ¹%Û{évß„õ™Q”C8ôEav*S)ß”tÉ8¿Kû-Ç’íÁ·W$<íß_üBã½;[“¹½(x‡�––X^�ûþŠÐ }-+wÀ”׌r[Ö¢_ÙÛ¥ÜÓü3BFf þ”» KX4åvò–y ,pÖ`÷ßïú¾Úš]ðw™7/]~…÷ª<V…¨àô˜JÐÀu$ßu"g.©RoC=Îyžœd/ëÝ Þé)ç]«àÎàÌ{¬’¨ýNˆÿi/šçž§†Ô³›Tzo�8J…Yi²9¦‰ª=O2·d«|äR;5$E­Jftž9K÷Þ‘5޳v$'êUêðz<˜G¹�*ž»d>½Ë¤­¢NOI WLh2Ð×* SU4’ �3ªSR¿C™ªtR÷#ŠŒ"*A­g†ÃŸr©é´“½Î®:3×Ts¥ëse¬½F�ŽÌ¾W^Zà³Õi¾Ö¢2Í‚ôR“n uœlZÅ™’GÐÌ"Ù»P¢ÎNÈ‘í4ðE�ò€ºWR4 %“.²:�¨'Sj4wTç·�•¸žÿÜ9ÉfÕÚģɚìíÞ>Ï\­�øDø•ëýZ¥¢p…Æ<w‹ãôT}-)§ÛçñØãú—¾³.Þ?]¡'š˜¥ƒc³EÝ%ñ|öì³ûýßACü¯D°…�¿˜ðAîgpé;n\Èüؤôvõ]dnª:²G~W½|`) vÿâJ¶ {ܹ-­gë›~”¹†O×Ð`VŸ4f𔜒ŸûaT;7Á–XúGÆÉ<(j^« ´ètø…ØÝ’îÿ¾%ŠøÕy¿¼÷O¥£Ÿo½^„Ÿ p~õå`e°+tg¸£Lj�zª8ërÅ߇äW‡Ô½:’¬=Xgqýœ¾ªÕ�³\cü<Ì2ø§–×ãX©1'6ü½ß•[„+8¹Ìd�[™ÿé;{Bëã.Y¨[6Ö*ÿò$ÚËX¿¥§ñ_�+Cânþù[[»ý�y÷:?–_Á¿o=ÞuëÆx¯áÞËŸzŠ�AãZäðŽ<ù¿ÿÒþõ–—|aåê‚ÿh”OÒé¸ÌjÖ©…»¡mè <ánä6´à:j_Ÿ\ßÞu‚R‹W&ã žùüLžµ9N´Ì Y*ÿlžœÛäí[�µÔH¦ÂˆŠÂÃ^êþü àÍ }/âßN+DFæË©«³&uf]*ÍþuÚÁÑ^4èwÐ5«sJå€õÝì†=jf«ˆÓs§(Z‰D/Í„„\­;ÝC7‚FÖ3‚¤OÌ34nM%j¦>0®ýY<Éì\òÉtœ¢„“–"*Ì"Å£Ù± ‘7vÎ�Yë}HKò:„4‚„Q×h7RD«S£Ï§5ƒBQ=œ�*…‘Y •©êqä‹ÃD'^•5‰è•*Qc�nª7ûm­OçÐõ¡8æ£øöS„œxÎó³þ·/ÎkS™ù•\N–ìãa%”„¢Jgæ¡‚ÝE*±cþ]]?háÖ®0õ¯âÖ_Üýû’pÌ Træô¡0ŠD¤~Q·~r�Ç/�sw¤þ,žO5¹žÝ;wºÓ�è~fô€š°Óá{ã™==¡Ûò!ÇÉßL~¸ÇˆfEaÆ÷#�ÛH-ªþ¨qwÄÝy"¯È�b¤ÑÈ+ôâ™ú<Ü0(’šF'o$dÆ @�Z0`1¢ùÓFo¶ÏÄ_‹N´‡[Õìxk ëÊÿ‘ÛtgOәĪÍß4Ä_Ρ¢˜ufׄ¨—õÝnÙã U^ðûürã‡SëGxðtª[W”W~îñ”\Ød6'Ìç°íõïVœÀ׿Øx¨¨º×Ïšú`/÷õÕ\*]T»_JÚû±ŒpõòQßè½mÝŽ`ù}øÈTÿ(¡è:ð£±ücÿN½Åí—}µÀÈ#:ÊáˆÜU¨ô¨f¯…]OÚæ7QñÛ~0²Ø¿ªÛ˧÷¤xëð2ÙAü÷´››ÿWvn˜¿§j#Ë1?9ŠÆÜx¼ù°‰™—nÔŒ5_“x aˆÚŽÆŽÙþOãò¥oxË<S/R[eµÛë|E¶¿®�çGÊjÏz¤Q‡¬ÄgÇät]3èÙó×D3åÕõ ÝÏݵî�¸ßÍñ4áVð¶'é9÷÷-vIý/BùÙµÝUzúƸ9Û`öä{ý×SìÑOãNé÷Žñâþ,²Ø:¦zZÞØUp£—iK‡žY¤s-{‹¯—­r ï³vÑ`åb{ûÝr°òíéÖ礼T™ôF<Ä™yW�C]ûJd“Í®JOÚåíK¸”kÃrí]óø*­v·TÍÖòýyÊ~}g¤�'5�‹Ì´Åõ†Á�17øk´›48g>…Þ…Û|RM"×¹8¸�²¶1‡4ç^^>Wjµ‚Ç™.°¤e‡ÛEkx—ÿ÷Îy:9æ_×Ë}wÎ>éÏ=ê�~mf wu' Žîfs®Ó{N**W”É*½o\Víî­^‚ñ”¿Ô”gJ±�€%�6 CŽ#6µ¯ êR&‡ÚÑQ_íJK:{ÈSjUj�:¦®)ù¨nÝ¢ôëïwµþ5SmÏ×/ûª‘yPy‡dÔÖ®_•.’¹]¨Å«˜ 7®ƒJ'¢�_Õ©©M¬¦ f€˜œ‡dš#©52H‰Æ è`o¥¿&Ù9‰PÐ ÑurÚáÄéãDÌhW€èT r'þão¯ô±€h¦¬À]>ž©}"�[Ò#Ç0¢�ü}éÛ|Þû#ÇÉ=|Ö#O¦€£D÷ɦ¡Óð±?SÝÔÑïD÷è¬Ññôï¼–ÑÍìÊP�×qRb#3š Ä«ø4»VL% �rþ®Lˆplª½ÌÑ•åZ¶¯IoùMõ¢wÆ?ª«§ýü-Göö¼ìº|h#âyA¤ïL£¤Rýøáýü&¤<-‡{®rF5ÞÏõã¹2ókcgò|%Ò!Tt­óT¢Ôa wÿ!x{ôâBµráê64ò–—ÓÁ°Û �Óe…R£Ëì×k`UNº‡ôçÄÁó¹Uã'ªû<‹>1rŸÁ#ñÖ.,ºüW,Wk¾=]ßdÔ¬×Ì¥lx¤¹µ ºÜÛ Mg–œ fívN~˜©žõ€ U‘<ò˜ãûØùR[àÏp(¬÷|æÓƒ÷e×9X8ÿ‚ª\е|F:±cć×{`G¡R`ùë;¯ÔVì¸büŸ6›J{»õŸòÔ÷–‰Õú² Q¤å’žWšl[3Ù]±+ÔN^ýÙ1 Eñ1YjÇ=\îÌœ#Aû+»6}½êaî+qÒ熰Föe­ îí��®~ƒ§ª=y�½s›ÜÉB®:®Ã {o‹×V{�u›âµ¢uÇÿ¿¶÷èÂÜ3—ºî5"*ëqÎS¸–¾-á¶�MV”àíä+ÕÏš¥]L4ˆ± ·TßÌ?Ìí¡‚­} 餸¼óniùCWcŸ4—çhP‘ä4W2n3Á_^a|v<ýçݤ)uÅ5›æÃïÏû6cÙÿWA²xðôké=Õ«Øv[u=™ÈÌgú§ù×ÕX\rÀó¶¤/Éw=ýîFç¼øÃ˜ !4žÎ¬¼v˜Q5wbÜîÆåiǹ.–+[ì¯/Š\S²ÇÚÜÏYÛÌö}zq2ïÜó9s–‘’N¬²{É�/˜³Ù°ú^©«æȸ̅v‚Í™žl¿yõ>ÀawŒ¶2»þõy3Œ�Ñ^ôn1MêñRàÈOggSÀDT•˜ %Ñmbÿÿÿÿfÿÿÿÿkÿÿÿÿfÿÿÿÿe^”[È[b‚‚V� Üd_S'AÁîP(ßXO4ð‡ÇSûþü¦}¨€ÌN&Ô=›ÿY»©à8æªÐ5#¨ÎôxjRƒhôêPå fvÀnR8>¨=AxÚ‚ÂNH­ÏO¡öýcoÕC*G%ºeî•$…�]g�ž3Á¡¾mfX{ÊêôÚ‡Ïe ‹f| ‘Χ‘}U¤çæÝ¹HÑ£•Ù¡då©8•Ø¥êŽ|3P%¢;wÉZu¨2iFgu´ÏUµ¨!Ó)U:?úç½µ.ztï3‹ÍŸ#óqøû=¸OòAˆÙ;dS|Ìžtf­�3vQhÈ9#Qâã ª¤Bs4»#NÔÌWç¨HE³âà:U刄‚p걎<“ÏÃ×O÷ÚÆ3€ „Z»xQçÈVÕ>ÂIö½“Ñîýˆ Nj]È®AÕ¹”y>Ÿr(¾ž>pØ L‘µµ"™òÐ[1%ó·õÒÇ©1UhpˆˆÞ¿|޶ÄÄãbâø¹ UH€#qˆ€ ½ž·;‚ ù¼ ¥hj'{0Þ'±çý‘ª3.E%e”?D7cl:2ƒ¤Þ½w$[Š4~ŸÑ ZÆ[žÇÛwê�š ×û „õ£áÚ¢~Ü”…ëWàØ­YW”•îÆÖSŒEKµõ“]o¨ïƒôŒYÜÿßL0-Ý8Em뼨¹M‡Û3ÞnV®»÷^>?yõŽl¿MŠÙ^—œÿ܇Žß®·Wû;ÎoÀÙæ€Tb�”$M¸øÞ”;Ñ5µ 4Œ` ·[לU``†kOžøì�Ú�>‘Ÿa®Àdž‡"~êÖÀÔ®Yi"Föúçy2×lmÿU"U#và®N蜊l]œÏ³C…É¢è_»…Ü•�Ÿu‡.©ë\Ÿi8Ä«:É‘{mn¢U®=9Ù€¨í|í%©B¨Ô<» £»:dOý˜�=j¢�â€�=Z²Ð¡k¿0Q@KJG0×ÚMîG2½²:¡ -NAmêõ8´�=_ë¹·HR©¯®¡UÃ9Úñ”Là©•˜ƒ‚êvÕÙIBÔI}‘ ‚ÔèY ¤ãì8ê¼ÀÔµó1Èa tg¿k4S�¹¢ÂAô¯T²)º3¢’$}è^˜jR¿îètEV²i¤a"S4ùŽ®8T4Èš KY?›U¥P"; È + Z�CPÐY÷¹#ôáQl8ø9P$²†ÔŒ@˜èmæ)ª}ïz2ã "’£âó[l×H纶gæïEŠä³žŠ9A5Ç‘<� 莓I¢1/{G_ˤ w¢÷�ˆš šv÷ùK…¿töká.jì¸Ñ™a?Äo$¿[øõÛÔ×�5ƒ‰}Tã®±ziÖ¶�;$íR· ±†OoÁ: wÓüŠL&#+—nOÕ•wL„þ¹pÆØš jî_OEßðŽÐzaiŸíÁähŒÀlaèò^£ØXã<eÝÅ>÷sÐ:æ<%ƒ�šÿîn&uAX±ÔE=LöwçÊLìøƒ•|?nùÆ™6üjL} ûºê£ÑöÖ‰Ôå™süîöŠlsŠy�‰\´\�i¬¤›ggûúg°�]>·Îi“‡øÜ}f‹{ÇÏñVÛGx|%^~UF gWY_yŽöלwÆøT´ç}cˆôa½®Z;ºªïÈ>>í_quxE&ä"ôpËFÍþ­Q·J*ˆ¦oõuS·hß—Õ=ìw<>¨þÛ͇’ŠÕ !bÍ»Z�wëuÀi\´c¦ÙR+»sv”?¹}lØ«êá!ö(ð¹°\úU‚DÒD;Çq^á(ÅPžÐ¤zŒkšÄ(®<.b,¾”Û*—ô^dfM¹S¹f� üx €Ê¿Ÿïý£B¡]ÕÜãXAïî}¯nž„€:KWe‡È{öŸú>j 0U�:ËÜhçûš�§aÊ�l½7•&çïC†TŽèçÓŒPÉ’”ÚÙS ’'yÐS y0Hô�T¦=©Ô�lÒù+ÔéZunn…Pó),±¾eÒŒlôÑ”)´§U꜑kÀ:Ñá©_U*�¡µ¹#ž#R‰‘ÉÍxÜÎOœ�ÂtœÎ^¯ ªÓáÕ¥ûéšœÚ5w™÷˜2Å¡+Ó%ôþ¨†F�Ž{×àH%S«#ÛêÈ×Qõ”ˆB¥35²jªUÐ#ʫ˜¢/rFŠ %GßóEÙ=¨Eí�¹˜Œ}Ž}O�‰<"A1‰@'?=A8ªnÇÃRý.‘9F˯tê·Ú z€T*zšdbÚ¡Œ. ŒøDD¦u®�> Ôš$G8 Ò¿ì¯û“ý.Á�]æ¾FÝyÚˆNÑž³Ò¤¡£-[Ì#"ŽÛ¥¿×ÁÿfÝ¿<¡V ¦ñãyL·›£±´ßPFfZ{i÷5Éðн³ŽîÞ&|†LsÇÞ�F²ë6"Áâ÷IÁ'hg÷*’à5€’! ±PX1ê“RÕkf¯k»(øòsjÃTŒû 828'îçÃÒ¢úÿª7S^#�²©üdô[÷(jäÏoWHÝßo­Héÿ¸+‘¡*ª>}–>oÊ÷7í§š,Azì„™ð àI.þ�ñ\@QUrgÚL·3â¡£è�ÅÌ]7®ä÷)ªdS¯�/R¾WLB)š‡‘^A’@¥¿„ò}KŸ”{ÚNÉ{3œ#&§5Ý4âÝpÄ�ó°,s×\s”ÛæUØËJ£§ÂÞŒoZ�êJOÿE¬�ûÊãËùÚÙýdæ–ËÌP€Ý�í׫†G Ý~óÏÄ�K~7°¼e¥†·Ú‹¿†­¤o!y*ŒE—QÓ:Ç Áܨ¼®ªªB‘‰J{_¿ÒÛ°�¬÷Vhÿl=#¹‡5©Ûõ4­pÓÕØ.á1FBŽ ¿i±¯Á||†ó Úëʬm¹'f¨)·³r,êÍÄÊ!§Gçk3ÿœ~¸…®Ì.å9¿('£{–Q5‡/^8húÿòÔ½È1{†±‹»åqßì¸ztÜx….¸ßÙ.ÚßKÞÞyæª$”Þ}âÿ��r [ÍFô‘:æÒ[Kðâ&ç»É>Ú“W*ÿË?åou”Þt»œÿýQ7ð(RÜÀ»¢æ=k]OþMGí]Û"°[÷Ç}Ù1ÚpMž„ÛòÛ´žè@ë…"Ü®lÃL຤÷g†/k8J-Œ{ßR�_YxÝ‹§Óuh 5PvP�Úÿ>®&É6ö&£¤C…½®+ðÐõBï�lhÌCàÝ»T'¾kÆQᡤ°†#û<,"ûWé@:«£î•:5m‘uBºÐGõ}™¤ˆ±8JרõJTæu|[hÑñGbbÙ'ÉJt­ª qü]O™€l�F‰¨I­ãMÕûIÉ®LÅQ�â±�þò¼Íg,ùvÿ›ÏvÐÉ™hZÐ�šIG¾ŠVrâe/r_B ­¢s×Þµ®= 5ác¦V´æáÔÙY‡è>T Üãeç`‡L•úí§†P�‰Žè¯ê¨ŽnC� âH�£éâ©¿-0¥(µîtÔˆ˜ê[¾ÖžI¢†R´dmªFÌ!{Ìð^G°ü=ƒ¯ŸfnÂõàbÉßçëêLÜz—0õùÜë¬NÔ dì$ÂPŒÔ~zæQßËþ¸‚Ù–£ ‡/ÞÏ�™ßü’—tp蟓ò×Çì­u^f·«|nYô¾CžwŽú¦•IDÿîVÑÖãt“ÄulÏgdº'µµHT¯Ã×ä‘iˆaK¢Ã• ¾ÁK€2€g”mmô}¹–wœŸ4d�?"”ÄRÊÜ.ï"Áå^βK·çZÝ•OÃF¢C)&� ±ßÓ)¬—9©ª#èÜFáþÁõƒÈ¦ÐŠ$îƒ\<^¢ÔÓÚäéԹéì{äKq·Öþ¿�&1ûüŽ0Ó¤¦7s3‡{<ƒ³û•ön�QΣ£¤9Ìä0(T¾¢óUr™Z,¥tæs4­jÆJúãîÀ•j2†ž§³Üª»z#ǧ^ÞÔO6øùï—²hbaõ· Ù#¿Õ€uìa<ìoPؤ�”ùd$Þ·˜Û¦jó·mŸCPò/üS(s¶íêZsO$ï¼µ§ÈÑ´1%Hm01ÚO~Û/öªNÞÔ•­ùøü)NÎ%4§/g*8JÚûÜïsM<óÞGNjÛ,§»´7Ÿ\×µ£.èFyaÑe÷§êž-[-i»b$]…ËoÊ‹±ÓAöœœö²£<ÚìÆþ’ðªr§,–ÖØñ°]_y|õm·bÀ‹(õÄ>±Døn»'g|‡ëf±ÍÁþÐÏ!|o±ƒŽäÉÍfÎppøWTÛ*Ê‘’ÕÞ6†©ò»t?£yÞ�zDÃä^ÈÀ¬ñ"©FNëý´ÊÆz’)²Þ@‰7ñ¹o$2¦¿·}j«=ˆaÃ2æ�Ç‘Q¯Zâ¨áÒ¦ì9-²ËÁü„Ù{urµþ–p>üÆmp°æãj�cÿSÍdÃj; 0ñ_ Bž±:›7í—2²Õÿ[Eñ¹ÐÇöÏb¸ng… e×É¢°ì³˜_rÝ)*Õ'˜´ÝW ó6ï— Aƒ|ó´]X™7ÎÎÉ$}­o©|u»g 9Šh¥¾š•[ÔÕ߯Æl,$‹4Ū‹È¬ª×«BmVvc^?»QD†}ªdGQ¼ùÉOggSÀTT•˜ &cÜ9¤ÿÿÿÿ[ÿÿÿÿmÿÿÿÿgÿÿÿÿiž„;øKúI0~p�»fí Vá:œçÿi¿ý%‹PÀgMû€ÞïÀ¿/]Rlà8NÚIuÒAåÅòº¾Z §p!Ý¿ZÂI´˜wxŠ"5Ì›Ž9 ªãì�¯%œŒï¹J;BLC½ÔJ@=U�«ì¬ÿe�œ²Š£5%iÍ™ÞSIž(#®¾ô};‚ä•d�Š ò×�p¨d&‘³\T¨ Ò8Χ"ç‹„¼T4÷Žœiú’˜,~ûa£ -–åßñ³S®æe^^�¿ùí/çÅÑÊQ‘P•$qZYq&§[¾Þs�ÈÎð:)rJ¢R¥*]—ã'¨Ï'H©ÑG•>œ †ÓU|F±¬<õIµŸH|FÎû¿�Wóñ�!³DBƒê¬$éäâD%´©­ u†(Šn©c,‡Ø|k¢Ú£Ã'*S<5W—öáz}~•c¿È�®)Ä!�‚~H…Â9:¡¤s? DpRŽ"� �jØeN@ZµcR~%„÷7����îkË8h&ѳ}<æS;˜Tý…Ï}‚ü=FT<¯ìØ&¶ãHÎoÝœ¼ÂýMz&óqmufvy�¿µ:žwžáy“ªÔ’!`åYôbït/7�ôÛ—ÛÍñ 'w>­‰Jjo)�­>õO_¾ –È–yf6ߤ[Û1=~§®£ûÐÌóuldá~ßÌŽd÷yqV;ù¹ó/œ.2QÛ¨-BÀ8™êå"A¿w|¤ÍPe+ói¯Ã{>ˆ²×†.ÑÄó-l±ÙÀåTc?+ô¥ìßÞEÄÄ•K\�ßFí¾,Òs=ƒF»;C¹A >»¬Á™ n$’üôsãâDâ¢ð?%€3¤#žv$ï1SøÀU¿ýKÍbleÈkq>k'¾t?‰‡ÿR²òÐ|¸ó닇dm:ºu<—ü�x˜³¾ð‰…z†¾À ¥e–ÍçQ¥b´2k] ÔõÖ÷‰Â%ˆœ›Ú=<EO™0.jˆ–å½uÎZì|Πúþj)hDúÇ�ÓÛ)ÝnÞÒ"½›|ú-˜¸ÄÒçß‚ŸWvÌÞ›íÒØÃoòúÿ«v_i²xží뇘uýkÁ”üí¤™çO˜~u®³Æ¸Ó+Š2J‰BÅûöëϯÑÿ¾]JçnJËæÈêÃô:­J7�[Ò·ÙUºu{À²Å]%fÂ騇MF€Tú¿­}iÔõe¥ü'ðÚïtô¿Ëþ˜R¼&­žó¨ª3™áôsLµ«ª8!Ž&±ƒLI'ÊYëujÒZL•.¡JæETùÚ³´3eEj‘ÎdÔ’8ê�þÜ5{O)fQGT±«ŠÔ)cOœGnt¥W6ҹס :Žêh8U;¿êˆƒÌB7’éÖŒ™ª¨äµÙk´ÈÕe*!Ò�UOøŒ=$Ƚpœn!ºOu:ÈCX9¸ÏWÍ™- v%‰]AÓ!•£º×MFÐB!u}Ýñ˜<>õ7¾‡(ŽR¥r¨d•n¡ÎÍ*kQ¥%�FÏÕyÕ{Ýz ­E£pÌbìÈ$Uö{sMˆª~¨Ñ*ÆPwG·Û³tä0³uºÚÄ5Ù�dj¶8JW0¾E};[êžbb"hnT’H²�eHxF(1–kM?¹¢–Y/tÏl/÷4×ÓïÄ[ ±ši�ù=†ÒRw T�Ã]f}ÏBŠÑÌ>j³¿·:‹Öñ_ÇóRêýõ'¼3ow�˜:Ú6›ž{ÊžŠi¿Ì1i Çç͘¡U†žÍ»º£7 rÅ-l~ù"=~òZ2›WwøåýÐý½-Þ1ÓËdwO¦~Ò?W²ÁÞ)Fx�Z8ŠqÖ~þW\ôCüh "+ñ¯ê¼ËÍqTï>&av2L.‘SÏøA¬¦aõñnå k”_\c6Ñï½?˜O¹aä»›ü�Ǥº{¡þæ­Z{¦Ç"‰Æ5y؜긯½Ð�—höà’=޵¢«[Î=9'�Ëto_~ê™þÍ€žF³Ÿ¡?ã£Kðãê¦ ¤�4¸u–žo=EV†22«˜/ûm¢Û#q@ní“cðÇ¿§ÍEþá—�ü|›XX¨ÆÌò3WÚÝ6`Åìr�&0ës¸×†É) µÚcGwìUÂìi4~½ÛAnYu SŸ¸­D>ES\ï^šþ.ÎaÍûÁ\~_izÛž™pÀO”àj³_únŠ`—Mã‰ÄE¿Å½¿oÞkwC1ô�2ï¸YHú¨ nÑ´W}¹ÿùu A!–›š­c•Ñóë‘ñùì2¶ºçEˆÒë2/cÓ5Ž@ï„ÿ=ÍZT“K;4ñ�ƒzÿIûº_TÃdª±^¼p5D"ÿ‹ç³SsÁÐI”ìš8¹Œñy·‹¬}Ü—èUÿüYÜ=Ñp‹2Ž8b¤$“’º#1ZLÔ&Î^Ìf-¾4Ü�HôúìšÚ—È÷süXN.}æF�;«MsYt³ø l;óŽ�?ή-9ÌÆô—w*·¡‹¡—‡ãk4û®ÙXôœLÜ/»ŠÁm†B Ö/É�r})¡>”»{V°…"Ü®lÓg‚‚.¦ÇïúãÙ2,G¶Õ’ù¬‘×ï)ÿŸO½"¤ãàD¥R› ö¯ñVH)¡oú¡w�ïµ+q%<"g�™}~St�쫪C“d~}^E@s ApZ¨íô¤ìB?h-@ 9*Gh 4O©•\0݂׬œž¦ž�Dã8J™@TާejpÂìZ5 =IÖŒPÑn=^d¯T�ÚÑ*’Ž„Ôáº$D¢ï8s×<¢�ÚsÉ*’Âz"ú•ÈùAŽ:¸ÉAd’±Rs'�`ЍÈQ‰p:Ï¢2»jDÀ8u•œUj®‡BèQq!óö �#ºÞ¢íÞB#Ôï)™:»]$ÐÚtÓ"Ç‹© ÇrÎÇÆò—üýþŽR u¢y€¹ 4íÈYgR2ƒäp8™"8¢€H~>‰úø»ÿõÀ5©mLhSs}¤¹1 ÇGçqî®ûTê^ëÜàTMz—¯[®ëã—SIéœçêHÐ�‘¿Èüe¦{9hÏ£G³å7¢®¤yì0¬e?ú|ü>#Et' Ä€Y˜Øî?™=èè�–-¶ŒIžpù¤ÊœãYC2$¨örîní>Oãó.¿ëÆHðÐf¥XáÁê†/\é�7‹wÝú¬€7L¥®?S½F¿á_c÷å?� `)¦R±¼Ùî]ˆˆó-má\º§.BÎŒ3û­�ñ´Dpì�L0î ÑñÞ-4ñ�+üù¸Öã*ÃŒj¥Rä£Ý”ajû(hæçÉ|톼À[|öSÚœ�ÔrKÃक़Z ÜÞGº_n%XÕ.ü4ý tJ`bÅNz°p)ÿ㻳…ü“8ûÌÑÕ�I9L>µ ¾+®Ò­ídž˜Ûå3.ÅUNê.»Úqž �UÝ4ËuЕ®}iž«×²—±»UˆÊ®ÅQâÛ¾VÊÑ.þAZOöÅŒ”´`í¤ÛÄŸÏDXg� Ep]4n`|µîÜT¯k$�…öL•¡a,¶§Ë—§Se粸µÞÔùHžÙ^±3 bÑ´ÊA+ù}™«Ó’”Ñüâ¢ßæ“¼ŠØHìó“»(“¦&Yk¸¿ß�Wu¡ž� =wU“‘o×]íÿŸ|þk³L=mŒê`@Ì$rrï6,°ìü§¥ Q»ß{¾ÿãÝncå|—øz ¿pk²�‘âÚ£ üz¡Œöbl×®éj3‘2Ï‹9¥¿±Ù¾„»*gæ,ô R`·£m˜ f¸Ž�Ð<ºÖí…¶ 4ÄEâ™Ï“ÎzV‘­H@ÕŠs‚hâüÁÑAåÄá×îЗR³*K­ÒðP…õ}(Ÿ˜Rr†F¤�§þ²æßÓ¥&Ž]�µJAtw梵s>þëiÉPOâ©xJ"UkÇ™KÅÑ?�žºÎ=xu$¨J×Ïl¹P4ת±gWŽ(ö¸9*ÎôqÔCëU¸Á*µU/$4Îä[+�\]™œ#îõF4sM©Íª2†¦ióõÂJÃ\£Y¬U{'\ëóéPi�(FÎÀ‘imáêNq‚Y�:%‰ñ4uð¡ÌèÇ×ÅpZߦà…4ØÂ€XßLî’/ñŸ. ›zcž0éeU®Žò«èBîlÂ(ððïåÒ ú÷‰—õ?új­'?×§é?­ÈV­ìúiƒ‚*‹{ñÖåwý—¨d“~‡\›„ãIuû¢¯ÎQ•5ì¢T©|NÒÜIVÇß©¯Ut¦çÉ„s^µ"¥m/„ªõ‰1ÝUÄØvk¼)èÍÖÏ ˆÄei-¯¥ÍH~J¸’#ˆ¢Ý$ÙÚW¼,-æk`káù¹ýH²kÌnËB_¯~°ðà·-T†šL$ðÌÉb½‚ÐZ\œ§šh´ñšêRœ¢?Ežæ/­cú2źŽ‡µ öî®�R‘…aS»¼½¨[ YÅëØë» < mŠÇ“àãNNÔU‡Ctÿ'J£«uÅÏpù½fó¯6Ê] u�ª?¢­a/ÎÚAK“„/Õåª1¯î¿sî_òI×m�Š#9¿Û»·4ý ëë–¶Øç®ÝÇ=µÕ ^šíóÓz—tÁIfPjGÿ[ߤ*ûîoøëëºxìSFÞ”é]±‹ƒGŸ ×·=õ!Æuìú�§TÄeBÑD‹Hý˜½¬¦ƒ—.1À·ÙŸëÊ2ów>¡µÄãS~YµŠ¾cöMÙöœ»ˆUFöÖ{ͱRŸ+‘Mê§]úÊ¢ð¢ëT"»«ÖPäï²Å“Ð"¯ˆ)=m?0%÷µ¥7Ë0vi²ö]rÏ‹ˆ‹EÓ�tuOggSîZT•˜ 'ò”À ÿÿÿÿnÿÿÿ^”»¨gZoD)°„»Û0¬á˜Àå|úê}Ø>'‘çm–ð z9ž(r�(ÅÅfÕöxŽüÎ,ϺçÌì(,'ÿùœÿ»ïËã�Χ£ä;=‡c>[„y-:æCj"u å�ø»!CÖ"®6jyU$B‘ÈîyýÎÖÄÁ‘CkŸ)ºÔìt‚ú¢Å^‹!�6d´´Cç�§�µöš¯¿‡–ùS¿Wîé߃P4kT©1qjDÌ©]«£îŠœ´ÿÈ Ûöi,ϤWvM*èÛ)jK½k‡v¤>*ÉîffÍUd© ¢k•{rtJíã%Õ‰”ºG�kdŸÑÓ®ñ ã¯ªBæ´g’Eýš©qd׎˜ö}Ûo¸ÆßÊÓ}yÈòê*µ+]Ä÷.ˆwæ‰lR©h�¢®•ˆ¬QDÕYúð*æ÷óYxÜÇý1—äSòËá¨òèúo‰fDÑËýø¬¶ç<9 ‚ŠCV8–ÿû8nÕçcªE;¡5¢ ź%ÜÙö¿ÑÂOкw'âˆJS×.í ´�êC&ˆ®„ÐÀôÆ{Ï‘ýïx�ççÝÇè¸ô ýÛ'Dà{AJEØçûö�K{‹­§;!Ä_³!Ÿ›pÝóhâ¡øý�ô‘"|ŒÎµdŠº š:Q)ƒ’PVÚ“(fœØöÕ]Hƒp¹ã½ûªu)Â�©Iïð¼P®yóÓpG³n »‡Muü~o¿:5�ëqoµÂ&�Wy¿ZÑjgŠùQ�Ï­ã;/M˜±"pùØ¢]×}Þ?Fˆú§ *²§*?ŽG3»€Ç¥8›ÛÂ$;�Ï•�zäÊ“ÿs9qÐÕ4ð¾¬Ö"ïØ°Z~£……›Ki=ÁÜÏÿrXyo?XO·az'˜£Ûó§*tÇ›_�¹¨�6®³ñÝ:oð~jæ±�e®«÷H¯�ø%õæÉxéÉ]þGùÙ¸ŸEBTãõ ãöFÞª¹#N> ›¥ËN�æ4ÏŸtO¬©ˆÜmÔFS"ËF:.í /¬ûŸç¡^ýWûñ?Zk"Ĺre5wîÙ£¿·bAT’Róàƒ2²Û¯{Hlì“^³‹OÝ ´®º&Õ¨>è5S�¿šéW;¸*œêÜde¬ÕØJõËõ^ïÉÖhhb\¥bÀÄÓXýÚðÑ¡?ïšZMähÆ›`9§„V­RÝWì`ýsi(ª_ÄÊ;¬øçžÍóŽ~I·b�MJOÞk«ñÅþÛJÏV”¥5M8hGýä¯NS¢ãÅAÖ{%½_`Ê1{ßHš§°¯#²3i’9k’:öxoÀówð –ßyºÞˆj\„—ùJ»ƒñ-ìÌ]»W!i²!�E†U¾ã«¶§¬I׊9ýcsy‚zgéÅ]Ødhò÷xyÌo›Ê£.nÍŸœs¦/ÙÞ ‡í“ÏÞW$}º¿Ç¶}º_k“-|vI³ƒtÙ²ðÃÍm8Æ Î?æX¶$×Í3¿-n#ܹÑÄ'iöcr†œ¼Þc{ÉÞ8fœloÑcp ”ÐY‚óAEE»îÇ>¦a®¼>úrnnŸ'%/Ã9”5]ÏU�Úµ�ùþ˜ö÷ëýìý¯«TÃ,k==îs¨hä´×@GÔ=Ž®ZmÇÃñpÜzú¾ž×tì[vu Cûîéy<Ïë ¯7áÎv<ì‘ÑSø¸îë¾æº÷\[FFR‘½^@àT¡¢’‘‘‘±ßWz*¨z®ûº[p ukui-media/ukui-volume-control-applet-qt/data/img/application.svg0000664000175000017500000000150715170052044024111 0ustar fengfeng ç”»æ�¿ 1 ukui-media/ukui-volume-control-applet-qt/data/img/mini-module-s.svg0000664000175000017500000000147215170052044024266 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-low-s.svg0000664000175000017500000000177615170052044025263 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/microphone-medium.svg0000664000175000017500000000174315170052044025231 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audiocard.svg0000664000175000017500000000144515170052044023542 0ustar fengfengaudiocard32ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-muted.svg0000664000175000017500000000176215170052044025333 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-low.svg0000664000175000017500000000220115170052044025003 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/tick.png0000664000175000017500000000024115170052044022517 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<CIDATxÚb`™àÿÿÿ@œ@‰æ÷@<i öƒ�m3HªÀ€lgc3„d?#Bv€!B^h#2„ä €Ù⎞QZ ‚IEND®B`‚ukui-media/ukui-volume-control-applet-qt/data/img/audio-headphones.svg0000664000175000017500000000144115170052044025020 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/microphone-mute.svg0000664000175000017500000000203415170052044024715 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-medium-s.svg0000664000175000017500000000220315170052044025724 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/device.svg0000664000175000017500000000162515170052044023046 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-muted-s.svg0000664000175000017500000000171115170052044025565 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-input-microphone.svg0000664000175000017500000000115615170052044026205 0ustar fengfengaudio-input-microphone32ukui-media/ukui-volume-control-applet-qt/data/img/setting.svg0000664000175000017500000000177215170052044023267 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/microphone-high.svg0000664000175000017500000000170115170052044024662 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-medium.svg0000664000175000017500000000216515170052044025473 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/mini-module.svg0000664000175000017500000000146715170052044024032 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/tick.svg0000664000175000017500000000102615170052044022534 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-high-s.svg0000664000175000017500000000162715170052044025374 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/complete-module-s.svg0000664000175000017500000000150115170052044025133 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/audio-volume-high.svg0000664000175000017500000000215115170052044025125 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/img/microphone-low.svg0000664000175000017500000000174315170052044024552 0ustar fengfeng ukui-media/ukui-volume-control-applet-qt/data/org.ukui.sound.gschema.xml0000664000175000017500000000476615170054730025351 0ustar fengfeng true

Sounds for events Whether to play sounds on user events. 'Light-Seeking' Sound theme name The XDG sound theme to use for event sounds. false Customize the sound theme Customize the sound theme false Mono Audio merge left and right channels true Noise Reduction Mic noise reduction option false LoopBack Monitor your own voice false Volume Increase Output volume Increase 125 Volume Increase's value Output volume Increase's Value true startup music Whether to play startup music '/usr/share/sounds/Light-Seeking/stereo/notification-general.ogg' Customize notification sound effects Customize notification sound effects '/usr/share/sounds/Light-Seeking/stereo/audio-volume-change.ogg' Custom volume control sound effects Custom volume control sound effects 100 Alert sound's value Alert sound's value ukui-media/common/0000775000175000017500000000000015170054730013024 5ustar fengfengukui-media/common/ukmedia_common.h0000664000175000017500000002375415170054730016177 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef UKMEDIACOMMON_H #define UKMEDIACOMMON_H #include #include #include #include #define UKMedia_Equal(a,b) (strcmp((a),(b)) == 0) #define SETTINGSWIDGET_WIDTH 760 #define SETTINGSWIDGET_HEIGHT 520 #define PA_VOLUME_NORMAL 65536.0 #define PA_VOLUME_MAX 81920.0 #define PA_VOLUME_MIN 0.0 #define UKMEDIA_VOLUME_NORMAL 100.0 #define UKMEDIA_VOLUME_MAX 125.0 // Init Port Volume #define MIC_VOLUME 100 #define HDMI_VOLUME 100 #define OUTPUT_VOLUME 67 #define HEADPHONE_VOLUME 17 #define HDMI "hdmi" #define BLUEZ "bluez" #define SPEAKER "speaker" #define HEADPHONE "headphone" #define HUAWEI_BTO_SINK "bt_sco_sink" #define HUAWEI_BTO_SOURCE "bt_sco_source" #define HEADSET_HEAD_UNIT "headset_head_unit" #define PA_ID_INVALID ((uint32_t)0xffffffff) #define PANGUW_SINK "alsa_output.platform-raoliang-sndcard.analog-stereo" #define HISTEN_SINK "histen_sink" #define NOISE_REDUCE_SOURCE "noiseReduceSource" // UKUI Audio #define KEY_SOUNDS_SCHEMA "org.ukui.sound" #define ALERT_VOLUME "alert-volume" #define AUDIO_VOLUME_CHANGE "audio-volume-change" #define SOUND_CUSTOM_THEME_KEY "custom-theme" #define DNS_NOISE_REDUCTION "dns-noise-reduction" #define EVENT_SOUNDS_KEY "event-sounds" #define LOOP_BACK "loopback" #define MONO_AUDIO "mono-audio" #define NOTIFICATION_GENGERAL "notification-general" #define SOUND_THEME_KEY "theme-name" #define VOLUME_INCREASE "volume-increase" #define VOLUME_INCREASE_VALUE "volume-increase-value" #define SOUND_FILE_PATH "/usr/share/sounds/xxxTheme/stereo/xxxFile.ogg" // UKUI Session #define UKUI_SWITCH_SETTING "org.ukui.session" #define UKUI_STARTUP_MUSIC_KEY "startup-music" #define UKUI_POWEROFF_MUSIC_KEY "poweroff-music" #define UKUI_LOGOUT_MUSIC_KEY "logout-music" #define UKUI_WAKEUP_MUSIC_KEY "weakup-music" // UKUI Theme #define UKUI_THEME_SETTING "org.ukui.style" #define UKUI_THEME_NAME "style-name" #define UKUI_THEME_LIGHT "ukui-light" #define UKUI_THEME_DARK "ukui-dark" #define UKUI_THEME_DEFAULT "ukui-default" // UKUI Global Theme #define UKUI_GLOBALTHEME_SETTINGS "org.ukui.globaltheme.settings" #define GLOBAL_THEME_NAME "global-theme-name" #define SYSTEM_VOLUME_CTRL "kylin-settings-system" #define UKUI_MEDIA_PATH "/org/ukui/media" #define UKUI_MEDIA_CONTROL_PATH "/org/ukui/media/control" #define UKUI_MEDIA_SERVICE "org.ukui.media" #define UKUI_MEDIA_INTERFACE "org.ukui.media" #define PULSEAUDIO_DEVICECONTROL_PATH "/org/pulseaudio/device_control" #define PULSEAUDIO_DEVICECONTROL_SERVICE "org.PulseAudio.DeviceControl" #define PULSEAUDIO_DEVICECONTROL_INTERFACE "org.PulseAudio.DeviceControl" //设备æ�’入状æ€� typedef enum pa_device_plugged_stauts { PORT_STAUTS_UNKNOWN = 0, PORT_STAUTS_PLUGGED = 1, PORT_STAUTS_UNPLUGGED = 2, } pa_device_plugged_stauts; enum SoundType { SINK, SOURCE, }; struct portInfo { QString name; /**< Name of this port */ QString description; /**< Description of this port */ uint32_t priority; /**< The higher this value is, the more useful this port is as a default. */ int available; /**< A flags (see #pa_port_available), indicating availability status of this port. \since 2.0 */ }; struct sinkInfo { QString name; /**< Name of the sink */ uint32_t index; /**< Index of the sink */ QString description; /**< Description of this sink */ pa_cvolume volume; /**< Volume of the sink */ int mute; /**< Mute switch of the sink */ uint32_t card; /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */ QString active_port_name = ""; QString active_port_description = ""; QString master_device = ""; QList sink_port_list; }; struct sourceInfo { QString name; /**< Name of the source */ uint32_t index; /**< Index of the source */ QString description; /**< Description of this source */ pa_cvolume volume; /**< Volume of the source */ int mute; /**< Mute switch of the source */ uint32_t card; /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */ QString active_port_name = ""; QString active_port_description = ""; QString master_device = ""; QList source_port_list; }; struct pa_device_port_info { /*card index*/ int card; /* port direction. Input or Output */ int direction; /* port available. */ int available; /* port plugged stauts. */ int plugged_stauts; /* port name. Example: analog-output-speak */ QString name; /* port description */ QString description; /* device description */ QString device_description; /* device product name */ QString device_product_name; friend const QDBusArgument& operator>>(const QDBusArgument &argument, pa_device_port_info &info) { argument.beginStructure(); argument >> info.card; argument >> info.direction; argument >> info.available; argument >> info.plugged_stauts; argument >> info.name; argument >> info.description; argument >> info.device_description; argument >> info.device_product_name; argument.endStructure(); return argument; } friend const QDBusArgument &operator<<(QDBusArgument &argument, const pa_device_port_info &info) { argument.beginStructure(); argument << info.card; argument << info.direction; argument << info.available; argument << info.plugged_stauts; argument << info.name; argument << info.description; argument << info.device_description; argument << info.device_product_name; argument.endStructure(); return argument; } }; typedef pa_device_port_info pa_device_port_info; Q_DECLARE_METATYPE(pa_device_port_info) /* some information of sink-input or source-output */ struct appInfo { int index; int volume; int channel; bool mute; int direction; #ifdef PA_PROP_APPLICATION_MOVE QString move; #endif /* name eg: kylin-music*/ QString name; /* sink-input's sink index*/ int masterIndex; /* sink-input's sink name*/ QString masterDevice; friend QDBusArgument &operator<<(QDBusArgument &argument, const appInfo &mystruct) { argument.beginStructure(); argument << mystruct.index << mystruct.volume << mystruct.channel << mystruct.mute << mystruct.direction #ifdef PA_PROP_APPLICATION_MOVE << mystruct.move #endif << mystruct.name << mystruct.masterIndex << mystruct.masterDevice; argument.endStructure(); return argument; } friend const QDBusArgument &operator>>(const QDBusArgument &argument, appInfo &mystruct) { argument.beginStructure(); argument >> mystruct.index >> mystruct.volume >> mystruct.channel >> mystruct.mute >> mystruct.direction #ifdef PA_PROP_APPLICATION_MOVE >> mystruct.move #endif >> mystruct.name >> mystruct.masterIndex >> mystruct.masterDevice; argument.endStructure(); return argument; } }; typedef appInfo appInfo; Q_DECLARE_METATYPE(appInfo) enum class SystemVersion { SYSTEM_VERSION_KYLIN, // 主线版本 SYSTEM_VERSION_OKYANGTZE, // openkylin yangtze版本 SYSTEM_VERSION_OKNILE, // openkylin nile版本 SYSTEM_VERSION_KYLIN_2501_V11, // 主线版本 V11/2501 版本 SYSTEM_VERSION_UNKNOWN }; class UkmediaCommon { public: static UkmediaCommon& getInstance(); /** * @brief 获å�–系统版本信æ�¯ * * @return 返回当å‰�系统版本信æ�¯ */ SystemVersion getSystemVersion(); /** * @brief 判断该机器是ä¸�是å�Žä¸ºå¹³å�° * * @return 是返回true,å�¦åˆ™è¿”回false */ bool isHuaweiPlatform(); /** * @brief 判断当å‰�系统语言环境å�˜é‡�是ä¸�是哈维柯 * * @param str 语言环境å�˜é‡� ç»´å�¾å°”语:ug_CN 哈è�¨å…‹è¯­:kk_KZ 柯尔克孜语:ky_KG * * @return 是返回true,å�¦åˆ™è¿”回false */ bool isHWKLanguageEnv(const QString& str); /** * @brief 音é‡�æ�¢ç®— * * @param volume 音é‡�值 * * @return 转æ�¢å�Žçš„音é‡�值 */ int paVolumeToMediaVolume(int volume); int mediaVolumeToPaVolume(int volume); private: UkmediaCommon(); UkmediaCommon(const UkmediaCommon&) = delete; UkmediaCommon(UkmediaCommon&&) = delete; UkmediaCommon operator=(const UkmediaCommon&) = delete; UkmediaCommon operator=(UkmediaCommon&&) = delete; ~UkmediaCommon() = default; }; #endif // UKMEDIACOMMON_H ukui-media/common/sound_effect_json.h0000664000175000017500000000342615170054730016677 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SOUNDEFFECTJSON_H #define SOUNDEFFECTJSON_H #include "json.h" #define SOUND_EFFECT_JSON "/tmp/PlayStartupWav.json" /* 判断是å�¦ä¸ºé¦–次登录系统 */ #define FIRST_TIME_LOGIN_KEY "first-time-login" /* 首次登录系统 */ #define DEFAULT_FIRST_TIME_LOGIN_VALUE true /* 默认为首次登录系统 */ class SoundEffectJson : public IJson { public: SoundEffectJson(const QString& name, const JsonType& type = JsonType::JSON_TYPE_SOUNDEFFECT); virtual ~SoundEffectJson(); public: virtual void init() override; virtual void remove(const QString& key) override; virtual void insert(const QString& key, const QJsonValue& value) override; virtual QJsonValue getValue(QString key) const override; private: QMap m_keys { {FIRST_TIME_LOGIN_KEY, DEFAULT_FIRST_TIME_LOGIN_VALUE}, }; }; #endif // SOUNDEFFECTJSON_H ukui-media/common/user_info_json.h0000664000175000017500000000564515170054730016231 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef USERINFOJSON_H #define USERINFOJSON_H #include "json.h" #define INVAILD_PATH "invaild path" #define DEFAULT_PATH "/home/" #define AUDIO_JSON "/.config/audio.json" /* ä¿�存用户默认的输出设备ã€�音é‡�ã€�é�™éŸ³çжæ€�å�Šå¼€æœºéŸ³æ•ˆå¼€å…³çš„é…�ç½® */ #define AUDIO_CARD_KEY "card" /* 声å�¡å­—符串 */ #define DEFAULT_AUDIO_CARD_VALUE "default" /* 系统默认的音频设备 */ #define AUDIO_CARDID_KEY "cardid" /* 声å�¡ID */ #define DEFAULT_AUDIO_CARDID_VALUE 0 /* 默认声å�¡ID为0 */ #define AUDIO_MUTE_KEY "mute" /* é�™éŸ³çжæ€� */ #define DEFAULT_AUDIO_MUTE_VALUE false /* 默认é�™éŸ³çжæ€�为false */ #define AUDIO_VOLUME_KEY "volume" /* 当å‰�用户的音é‡�值 */ #define DEFAULT_AUDIO_VOLUME_VALUE 67 /* 默认音é‡�为67 */ #define AUDIO_STRATUP_SOUNDEFFECT_KEY "startup-soundeffect" /* 当å‰�用户开机音效的开å�¯çжæ€� */ #define DEFAULT_STARTUP_SOUNDEFFECI_VALUE true /* 默认开å�¯çжæ€�为true */ class UserInfoJson : public IJson { public: UserInfoJson(const QString& name, const JsonType& type = JsonType::JSON_TYPE_USERINFO); virtual ~UserInfoJson(); public: virtual void init() override; virtual void remove(const QString& key) override; virtual void insert(const QString& key, const QJsonValue& value) override; virtual QJsonValue getValue(QString key) const override; private: QMap m_keys { {AUDIO_CARD_KEY, DEFAULT_AUDIO_CARD_VALUE}, {AUDIO_CARDID_KEY, DEFAULT_AUDIO_CARDID_VALUE}, {AUDIO_MUTE_KEY, DEFAULT_AUDIO_MUTE_VALUE}, {AUDIO_VOLUME_KEY, DEFAULT_AUDIO_VOLUME_VALUE}, {AUDIO_STRATUP_SOUNDEFFECT_KEY, DEFAULT_STARTUP_SOUNDEFFECI_VALUE}, }; }; #endif // USERINFOJSON_H ukui-media/common/user_config.h0000664000175000017500000000354015170054730015502 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef USERCONFIG_H #define USERCONFIG_H #include #include #include "json.h" #define LIGHTDM_CONF_FILE "/etc/lightdm/lightdm.conf" #define LIGHTDM_CONF_KEY "SeatDefaults/autologin-user" #define UKUI_GREETER_CONF_FILE "/var/lib/lightdm/.cache/ukui-greeter.conf" #define UKUI_GREETER_CONF_KEY "Greeter/lastLoginUser" class UserConfig { public: UserConfig(); ~UserConfig(); public: virtual void initJsonMap() = 0; virtual void insert(std::shared_ptr json, const QString& key, const QJsonValue& vaule); QJsonValue getValueFromJson(std::shared_ptr json, const QString& key) const; std::shared_ptr getJsonByType(std::unordered_map> map, const JsonType& type); std::function getJsonFileNameByType(std::unordered_map> keys, const JsonType& type); protected: std::unordered_map> m_jsonMap; }; #endif // USERCONFIG_H ukui-media/common/user_info_json.cpp0000664000175000017500000000347615170054730016564 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "user_info_json.h" #include UserInfoJson::UserInfoJson(const QString& name, const JsonType& type) : IJson(name, type) { } UserInfoJson::~UserInfoJson() { } void UserInfoJson::init() { for (const auto& it : m_keys.toStdMap()) { insert(it.first, it.second); } } void UserInfoJson::remove(const QString& key) { if (m_rootObj.contains(key)) { m_rootObj.remove(key); } update(); } void UserInfoJson::insert(const QString& key, const QJsonValue& value) { // 如果json文件中存在相å�Œçš„键值对则ä¸�进行任何æ“�作 if (m_rootObj.contains(key) && m_rootObj.value(key) == value) { return; } m_rootObj.insert(key, value); update(); } QJsonValue UserInfoJson::getValue(QString key) const { if (!m_rootObj.contains(key)) { syslog(LOG_INFO, "the json file does not contain the %s key", key.toLatin1().data()); return QJsonValue(); } return m_rootObj.value(key); } ukui-media/common/sound_effect_json.cpp0000664000175000017500000000354715170054730017236 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "sound_effect_json.h" #include SoundEffectJson::SoundEffectJson(const QString& name, const JsonType& type) : IJson(name, type) { } SoundEffectJson::~SoundEffectJson() { } void SoundEffectJson::init() { for (const auto& it : m_keys.toStdMap()) { insert(it.first, it.second); } update(); } void SoundEffectJson::remove(const QString& key) { if (m_rootObj.contains(key)) { m_rootObj.remove(key); } update(); } void SoundEffectJson::insert(const QString& key, const QJsonValue& value) { // 如果json文件中存在相å�Œçš„键值对则ä¸�进行任何æ“�作 if (m_rootObj.contains(key) && m_rootObj.value(key) == value) { return; } m_rootObj.insert(key, value); update(); } QJsonValue SoundEffectJson::getValue(QString key) const { if (!m_rootObj.contains(key)) { syslog(LOG_INFO, "the json file does not contain the %s key", key.toLatin1().data()); return QJsonValue(); } return m_rootObj.value(key); } ukui-media/common/user_config.cpp0000664000175000017500000000365015170054730016037 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "user_config.h" UserConfig::UserConfig() { } UserConfig::~UserConfig() { } void UserConfig::insert(std::shared_ptr json, const QString &key, const QJsonValue& vaule) { json->insert(key, vaule); } QJsonValue UserConfig::getValueFromJson(std::shared_ptr json, const QString &key) const { return json->getValue(key); } std::shared_ptr UserConfig::getJsonByType(std::unordered_map> map, const JsonType& type) { if (const auto& itr = map.find(type); itr != map.end() && itr->second != nullptr) { return itr->second; } syslog(LOG_ERR, "JsonType error, jsonMap dosnot exit %d json type.", int(type)); return nullptr; } std::function UserConfig::getJsonFileNameByType(std::unordered_map> keys, const JsonType& type) { if (const auto& itr = keys.find(type); itr != keys.end() && itr->second != nullptr) { return itr->second; } syslog(LOG_ERR, "JsonType error, keys dosnot exit %d json type.", int(type)); return nullptr; } ukui-media/common/json.h0000664000175000017500000000621315170054730014150 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef JSON_H #define JSON_H #include #include #include #include #include #include #include /** * @brief json文件的类型 */ enum class JsonType { JSON_TYPE_SOUNDEFFECT = 0, // 开机音效类型的json文件 JSON_TYPE_USERINFO, // 用户信æ�¯ç±»åž‹çš„json文件 JSON_TYPE_UNKNOWN // 未知类型的json文件 }; class IJson { public: IJson(const QString& name, const JsonType& type) : m_filename(name), m_type(type) { load(); } virtual ~IJson() { save(); } /** * @brief åˆ�始化json文件 */ virtual void init() = 0; /** * @brief 删除json文件中键为key的键值对 * * @param key 需è¦�删除的键 */ virtual void remove(const QString& key) = 0; /** * @brief 在json文件æ�’入键值对 * * @param key æ�’入的键 * value æ�’入的值 */ virtual void insert(const QString& key, const QJsonValue& value) = 0; /** * @brief 获å�–json文件指定键值 * * @param key 获å�–的键 * @return */ virtual QJsonValue getValue(QString key) const = 0; void update() { save(); } private: void load() { QFile file(m_filename); if (!file.open(QFile::ReadWrite)) { return; } QTextStream m_textStream(&file); QString str = m_textStream.readAll(); file.close(); QJsonParseError jsonError; QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError); if (jsonError.error != QJsonParseError::NoError) { return; } m_rootObj = doc.object(); } void save() { QJsonDocument doc(m_rootObj); QFile file(m_filename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { syslog(LOG_ERR, "open %s failed, %s", m_filename.toLatin1().data(), strerror(errno)); return; } QTextStream m_textStream(&file); m_textStream.setEncoding(QStringConverter::Utf8); m_textStream << doc.toJson(); file.close(); } protected: QString m_filename; QJsonObject m_rootObj; JsonType m_type; }; #endif // IJSON_H ukui-media/common/ukmedia_common.cpp0000664000175000017500000000634715170054730016531 0ustar fengfeng/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "ukmedia_common.h" #include #include UkmediaCommon::UkmediaCommon() { } UkmediaCommon& UkmediaCommon::getInstance() { static UkmediaCommon instance; return instance; } SystemVersion UkmediaCommon::getSystemVersion() { auto systemName = QString(QLatin1String(kdk_system_get_systemName())); auto version = QString(QLatin1String(kdk_system_get_version(0))); auto majorVersion = QString(QLatin1String(kdk_system_get_major_version())); if(majorVersion.compare("V11", Qt::CaseInsensitive) == 0) { return SystemVersion::SYSTEM_VERSION_KYLIN_2501_V11; } if (systemName.compare("openkylin", Qt::CaseInsensitive) == 0 && version.contains("nile", Qt::CaseInsensitive)) { return SystemVersion::SYSTEM_VERSION_OKNILE; } else if (systemName.compare("openkylin", Qt::CaseInsensitive) == 0) { return SystemVersion::SYSTEM_VERSION_OKYANGTZE; } else if (systemName.compare("kylin", Qt::CaseInsensitive) == 0) { return SystemVersion::SYSTEM_VERSION_KYLIN; } return SystemVersion::SYSTEM_VERSION_UNKNOWN; } bool UkmediaCommon::isHuaweiPlatform() { bool isHuaweiPlatform = false; const char *cpuInfo = kdk_cpu_get_model(); QString cpuStr = QString::fromLocal8Bit(cpuInfo); if (cpuStr.contains("HUAWEI", Qt::CaseInsensitive) || cpuStr.contains("Kirin", Qt::CaseInsensitive)) { if (cpuStr.contains("990") || cpuStr.contains("9006C") || cpuStr.contains("9000C")) isHuaweiPlatform = true; } else if (cpuStr.contains("PANGU", Qt::CaseInsensitive) && cpuStr.contains("M900", Qt::CaseInsensitive)) { isHuaweiPlatform = true; } qInfo() << __func__ << isHuaweiPlatform << cpuStr; return isHuaweiPlatform; } bool UkmediaCommon::isHWKLanguageEnv(const QString &str) { return ("ug_CN" == str || "kk_KZ" == str || "ky_KG" == str); } int UkmediaCommon::paVolumeToMediaVolume(int volume) { if (volume < PA_VOLUME_MIN || volume > PA_VOLUME_MAX) volume = (volume < PA_VOLUME_MIN)? PA_VOLUME_MIN : PA_VOLUME_MAX; return (volume / PA_VOLUME_NORMAL * UKMEDIA_VOLUME_NORMAL) + 0.5; } int UkmediaCommon::mediaVolumeToPaVolume(int volume) { if (volume < PA_VOLUME_MIN || volume > UKMEDIA_VOLUME_MAX) volume = (volume < PA_VOLUME_MIN)? PA_VOLUME_MIN : UKMEDIA_VOLUME_MAX; return volume / UKMEDIA_VOLUME_NORMAL * PA_VOLUME_NORMAL; } ukui-media/README0000664000175000017500000000045415170052044012413 0ustar fengfengThese are the media tools for UKUI: ukui-volume-control - UKUI volume control application and applet Refer to the following files for license information for each sub-component of ukui-media: ukui-volume-control - COPYING documentation - COPYING-DOCS UKUI-Media is a fork of MATE-Media. ukui-media/build-aux/0000775000175000017500000000000015170052044013422 5ustar fengfengukui-media/build-aux/git-version-gen0000775000175000017500000001272615170052044016375 0ustar fengfeng#!/bin/sh # Print a version string. scriptversion=2009-05-04.22 # Copyright (C) 2007-2008 Free Software Foundation # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/. # It may be run two ways: # - from a git repository in which the "git describe" command below # produces useful output (thus requiring at least one signed tag) # - from a non-git-repo directory containing a .tarball-version file, which # presumes this script is invoked like "./git-version-gen .tarball-version". # In order to use intra-version strings in your project, you will need two # separate generated version string files: # # .tarball-version - present only in a distribution tarball, and not in # a checked-out repository. Created with contents that were learned at # the last time autoconf was run, and used by git-version-gen. Must not # be present in either $(srcdir) or $(builddir) for git-version-gen to # give accurate answers during normal development with a checked out tree, # but must be present in a tarball when there is no version control system. # Therefore, it cannot be used in any dependencies. GNUmakefile has # hooks to force a reconfigure at distribution time to get the value # correct, without penalizing normal development with extra reconfigures. # # .version - present in a checked-out repository and in a distribution # tarball. Usable in dependencies, particularly for files that don't # want to depend on config.h but do want to track version changes. # Delete this file prior to any autoconf run where you want to rebuild # files to pick up a version string change; and leave it stale to # minimize rebuild time after unrelated changes to configure sources. # # It is probably wise to add these two files to .gitignore, so that you # don't accidentally commit either generated file. # # Use the following line in your configure.ac, so that $(VERSION) will # automatically be up-to-date each time configure is run (and note that # since configure.ac no longer includes a version string, Makefile rules # should not depend on configure.ac for version updates). # # AC_INIT([GNU project], # m4_esyscmd([build-aux/git-version-gen .tarball-version]), # [bug-project@example]) # # Then use the following lines in your Makefile.am, so that .version # will be present for dependencies, and so that .tarball-version will # exist in distribution tarballs. # # BUILT_SOURCES = $(top_srcdir)/.version # $(top_srcdir)/.version: # echo $(VERSION) > $@-t && mv $@-t $@ # dist-hook: # echo $(VERSION) > $(distdir)/.tarball-version case $# in 1) ;; *) echo 1>&2 "Usage: $0 \$srcdir/.tarball-version"; exit 1;; esac tarball_version_file=$1 nl=' ' # First see if there is a tarball-only version file. # then try "git describe", then default. if test -f $tarball_version_file then v=`cat $tarball_version_file` || exit 1 case $v in *$nl*) v= ;; # reject multi-line output [0-9]*) ;; *) v= ;; esac test -z "$v" \ && echo "$0: WARNING: $tarball_version_file seems to be damaged" 1>&2 fi if test -n "$v" then : # use $v elif test -d .git \ && v=`git describe --abbrev=4 --match='${UKUI_TAG_PATTERN}_*' HEAD 2>/dev/null \ || git describe --abbrev=4 HEAD 2>/dev/null` \ && case $v in ${UKUI_TAG_PATTERN}_[0-9]*) ;; *) (exit 1) ;; esac then # Is this a new git that lists number of commits since the last # tag or the previous older version that did not? # Newer: v6.10-77-g0f8faeb # Older: v6.10-g0f8faeb case $v in *-*-*) : git describe is okay three part flavor ;; *-*) : git describe is older two part flavor # Recreate the number of commits and rewrite such that the # result is the same as if we were using the newer version # of git describe. vtag=`echo "$v" | sed 's/-.*//'` numcommits=`git rev-list "$vtag"..HEAD | wc -l` v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`; ;; esac # Change the first '-' to a '.', so version-comparing tools work properly. # Remove the "g" in git describe's output string, to save a byte. v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`; else v=UNKNOWN fi #v=`echo "$v" |sed 's/^v//'` v=`echo "$v" | sed "s/${UKUI_TAG_PATTERN}_//" | tr _ .` # Don't declare a version "dirty" merely because a time stamp has changed. git status > /dev/null 2>&1 dirty=`sh -c 'git diff-index --name-only HEAD' 2>/dev/null` || dirty= case "$dirty" in '') ;; *) # Append the suffix only if there isn't one already. case $v in *-dirty) ;; *) v="$v-dirty" ;; esac ;; esac # Omit the trailing newline, so that m4_esyscmd can use the result directly. echo "$v" | tr -d '\012' # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: ukui-media/ChangeLog0000664000175000017500000000016615170052044013305 0ustar fengfengThe ChangeLog is auto-generated when releasing. If you are seeing this, use 'git log' for a detailed list of changes. ukui-media/scripts/0000775000175000017500000000000015170054730013223 5ustar fengfengukui-media/scripts/detection_output_mode.sh0000775000175000017500000000155015170052044020161 0ustar fengfeng#!/bin/bash for USER in $(who | grep tty | awk '{print $1}' | sort | uniq);do USER_NAME=$USER # USER_NAME=$USER USER_ID=$(id -u "$USER_NAME") PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native" OUTPUT_MODE="not available" FIND_STR=" analog-output" sudo -H -u ${USER_NAME} pactl --server $PULSE_SERVER list cards |grep analog-output > /tmp/kylin_headphone.tmp while read line;do index="$line" echo $line if [ -n "$index" ];then OUTPUT_MODE=${index#*usec, } OUTPUT_MODE=${OUTPUT_MODE%%)} echo "输出模å¼�为" $OUTPUT_MODE fi if [[ $line =~ "analog-output-speaker" ]] && [[ $OUTPUT_MODE == "available" ]];then exit 0 elif [[ $line =~ "analog-output-headphone" ]] && [[ $OUTPUT_MODE == "available" ]];then exit 1 fi done < /tmp/kylin_headphone.tmp done rm -rf /tmp/kylin_headphone.tmp exit -1 ukui-media/scripts/99-soundCardAdaptation0000775000175000017500000003204615170054730017344 0ustar fengfeng#!/bin/bash #-------------------------- 全局é…�ç½® --------------------------# set -o errexit # é�‡åˆ°é”™è¯¯ç«‹å�³é€€å‡º set -o nounset # é�‡åˆ°æœªå®šä¹‰å�˜é‡�报错 set -o pipefail # 管é�“命令错误传递 #-------------------------- 常é‡�定义 --------------------------# readonly LOG_FILE="/var/log/audio_config.log" readonly ALSA_MIXER_PATH="/usr/share/pulseaudio/alsa-mixer" #--------------------- Pulseaudio 路径定义 --------------------# ANALOG_INPUT_MIC_CONF="/usr/share/pulseaudio/alsa-mixer/paths/analog-input-mic.conf" ANALOG_INPUT_LINEIN_CONF="/usr/share/pulseaudio/alsa-mixer/paths/analog-input-linein.conf" ANALOG_INPUT_REAR_MIC_CONF="/usr/share/pulseaudio/alsa-mixer/paths/analog-input-rear-mic.conf" ANALOG_INPUT_FRONT_MIC_CONF="/usr/share/pulseaudio/alsa-mixer/paths/analog-input-front-mic.conf" ANALOG_INPUT_INTERNAL_MIC_CONF="/usr/share/pulseaudio/alsa-mixer/paths/analog-input-internal-mic.conf" MIC_BOOST_1="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-mic-1.conf" MIC_BOOST_2="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-mic-2.conf" MIC_BOOST_3="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-mic-3.conf" LINEIN_BOOST_1="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-linein-1.conf" LINEIN_BOOST_2="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-linein-2.conf" LINEIN_BOOST_3="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-linein-3.conf" REAR_MIC_BOOST_0="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-rear-mic-0.conf" REAR_MIC_BOOST_1="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-rear-mic-1.conf" REAR_MIC_BOOST_2="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-rear-mic-2.conf" REAR_MIC_BOOST_3="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-rear-mic-3.conf" FRONT_MIC_BOOST_0="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-front-mic-0.conf" FRONT_MIC_BOOST_1="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-front-mic-1.conf" FRONT_MIC_BOOST_2="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-front-mic-2.conf" FRONT_MIC_BOOST_3="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-front-mic-3.conf" INTERNAL_MIC_BOOST_1="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-internal-mic-1.conf" INTERNAL_MIC_BOOST_2="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-internal-mic-2.conf" INTERNAL_MIC_BOOST_3="/usr/share/pulseaudio/alsa-mixer/paths/kylin-paths/analog-input-internal-mic-3.conf" #-------------------------- 日志函数 --------------------------# log() { local level=$1 local message=$2 local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo "[${timestamp}] [${level}] ${message}" | tee -a "${LOG_FILE}" } #-------------------------- 链接函数 --------------------------# ukmedia_symlink() { local target_file=$1 local link_name=$2 # 验è¯�目标文件 if [[ ! -e "$target_file" ]]; then log "ERROR" "目标文件ä¸�存在: $target_file" return 0 fi # 清ç�†æ—§é“¾æŽ¥ if [[ -e "$link_name" ]]; then log "WARN" "移除旧链接: $link_name" rm -f "$link_name" || { log "ERROR" "删除失败: $link_name" return 0 } fi # 创建新链接 if ln -sf "$target_file" "$link_name"; then log "INFO" "创建链接: $link_name -> $target_file" else log "ERROR" "链接创建失败: $target_file -> $link_name" return 0 fi } #-------------------------- 硬件信æ�¯èŽ·å�– --------------------------# get_hw_info() { # 缓存硬件信æ�¯é�¿å…�é‡�å¤�查询 local -g _vendor_id local -g _subsystem_id local -g _system_product_name local -g _baseboard_product_name if [[ -z "${_vendor_id:-}" ]]; then _vendor_id=$(grep 'Vendor Id' /proc/asound/card*/codec#0 2>/dev/null || true) fi if [[ -z "${_subsystem_id:-}" ]]; then _subsystem_id=$(grep 'Subsystem Id' /proc/asound/card*/codec#0 2>/dev/null || true) fi if [[ -z "${_system_product_name:-}" ]]; then _system_product_name=$(dmidecode -s system-product-name 2>/dev/null || true) fi if [[ -z "${_baseboard_product_name:-}" ]]; then _baseboard_product_name=$(dmidecode -s baseboard-product-name 2>/dev/null || true) fi } handle_realtek_alc222() { log "INFO" "检测到Realtek ALC222声å�¡" ukmedia_symlink "$FRONT_MIC_BOOST_0" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_0" "$ANALOG_INPUT_REAR_MIC_CONF" } handle_realtek_alc897() { log "INFO" "检测到Realtek ALC897声å�¡" if [[ "${_baseboard_product_name}" == "CE720F" ]] || [[ "${_baseboard_product_name}" == "GW-001M1A-FTF" ]] || [[ "${_baseboard_product_name}" == "THTF-6780A-1W-JZXETH01" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 1, Rear Mic Boot = 1" ukmedia_symlink "$FRONT_MIC_BOOST_1" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_1" "$ANALOG_INPUT_REAR_MIC_CONF" elif [[ "${_baseboard_product_name}" == "FD2000ZX200MB1" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 0, Rear Mic Boot = 0" ukmedia_symlink "$FRONT_MIC_BOOST_0" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_0" "$ANALOG_INPUT_REAR_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®: Front Mic Boost = 1, Rear Mic Boot = 1" ukmedia_symlink "$FRONT_MIC_BOOST_1" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_1" "$ANALOG_INPUT_REAR_MIC_CONF" fi } handle_realtek_alc269() { log "INFO" "检测到Realtek ALC269声å�¡" if [[ "${_baseboard_product_name}" == "CE720F" ]] || [[ "${_baseboard_product_name}" == "MAXHUB-NZ61-6780A" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = 1" ukmedia_symlink "$INTERNAL_MIC_BOOST_1" "$ANALOG_INPUT_INTERNAL_MIC_CONF" elif [[ "${_baseboard_product_name}" == "BM6J80" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = 2" ukmedia_symlink "$INTERNAL_MIC_BOOST_2" "$ANALOG_INPUT_INTERNAL_MIC_CONF" elif [[ "${_baseboard_product_name}" == "Phytium D3000 Desktop Board" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 1, Rear Mic Boot = 1" ukmedia_symlink "$FRONT_MIC_BOOST_1" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_1" "$ANALOG_INPUT_REAR_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®: Internal Mic Boost = 1" ukmedia_symlink "$INTERNAL_MIC_BOOST_1" "$ANALOG_INPUT_INTERNAL_MIC_CONF" fi } handle_realtek_alc623() { log "INFO" "检测到Realtek ALC623声å�¡" if [[ "${_baseboard_product_name}" == "LXKT-ZX-KX7000" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 1, Rear Mic Boot = 1" ukmedia_symlink "$FRONT_MIC_BOOST_1" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_1" "$ANALOG_INPUT_REAR_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®" fi } handle_realtek_alc662() { log "INFO" "检测到Realtek ALC662声å�¡" if [[ "${_baseboard_product_name}" == "THTF-FTD2000-1W-MBX-F20ER100" ]] || [[ "${_baseboard_product_name}" == "THTF-ZXE-KX-U66780A-ZX200-JZXEMA03" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 1, Rear Mic Boot = 1" ukmedia_symlink "$FRONT_MIC_BOOST_1" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_1" "$ANALOG_INPUT_REAR_MIC_CONF" elif [[ "${_baseboard_product_name}" == "LM-LS3A4000-7A1000-1w-V01-pc-A2005" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Front Mic Boost = 0, Rear Mic Boot = 2" ukmedia_symlink "$FRONT_MIC_BOOST_0" "$ANALOG_INPUT_FRONT_MIC_CONF" ukmedia_symlink "$REAR_MIC_BOOST_2" "$ANALOG_INPUT_REAR_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®" fi } handle_conexant_cx20632() { log "INFO" "检测到Conexant CX20632声å�¡" if [[ "${_baseboard_product_name}" == "EAECIS-FT_D2000_X100-1W-V0.1-NF14" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = merge, Mic Boot = merge" ukmedia_symlink "$MIC_BOOST_3" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_3" "$ANALOG_INPUT_INTERNAL_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®: Internal Mic Boost = 2, Mic Boot = merge" ukmedia_symlink "$MIC_BOOST_3" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_2" "$ANALOG_INPUT_INTERNAL_MIC_CONF" fi } handle_conexant_cx11880() { log "INFO" "检测到Conexant CX11880声å�¡" if [[ "${_baseboard_product_name}" == "LXKT-ZXE-N70" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = 2, Mic Boot = merge" ukmedia_symlink "$MIC_BOOST_3" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_2" "$ANALOG_INPUT_INTERNAL_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®" fi } handle_conexant_sn6140() { log "INFO" "检测到Conexant SN6140声å�¡" log "INFO" "æ ¹æ�®é€‚é…�记录,此声å�¡ç›®å‰�统一使用:Internal Mic Boost = 2, Mic Boost = 2" ukmedia_symlink "$MIC_BOOST_2" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_2" "$ANALOG_INPUT_INTERNAL_MIC_CONF" } handle_conexant_sn6180() { log "INFO" "检测到Conexant SN6180声å�¡" if [[ "${_baseboard_product_name}" == "LXKT-ZXE-N70" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = 2, Mic Boot = 2" ukmedia_symlink "$MIC_BOOST_2" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_2" "$ANALOG_INPUT_INTERNAL_MIC_CONF" else log "INFO" "未识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用通用é…�ç½®" fi } handle_realtek_alc3328() { log "INFO" "检测到Realtek ALC3328声å�¡" if [[ "${_baseboard_product_name}" == "FD2000ZX200MB1" ]]; then log "INFO" "识别到基æ�¿åž‹å�· ${_baseboard_product_name},使用é…�ç½®: Internal Mic Boost = 1, Mic Boot = 1" ukmedia_symlink "$MIC_BOOST_1" "$ANALOG_INPUT_MIC_CONF" ukmedia_symlink "$INTERNAL_MIC_BOOST_1" "$ANALOG_INPUT_INTERNAL_MIC_CONF" fi } #-------------------------- 特殊硬件处ç�† --------------------------# handle_special_hardware() { # å�Žä¸ºç‰¹æ®Šå¤„ç�† if [[ -f "/usr/share/pulseaudio/alsa-mixer/profile-sets/pulse-huawei.conf" ]]; then [[ -f "/etc/pulse/daemon-i2s-huawei.conf" ]] && \ mv -f "/etc/pulse/daemon-i2s-huawei.conf" "/etc/pulse/daemon.conf" fi if [[ $(dmidecode | grep -c "UNIS D3830 G3") -ne 0 ]]; then log "INFO" "UNIS D3830 G3 udev 自定义é…�置文件" ukmedia_symlink "/usr/share/pulseaudio/alsa-mixer/profile-sets/UNIS-D3830-G3-audio.conf" \ "/usr/share/pulseaudio/alsa-mixer/profile-sets/alc4080-mh243a-usb-audio.conf" fi if [[ `dmidecode |grep -c "706-LS3A5000-4-V1.0-B40L-41A1"` != "0" ]]; then log "INFO" "特殊硬件处ç�† AutoMute处ç�†" ukmedia_symlink "/usr/share/pulseaudio/alsa-mixer/paths/analog-output-headphones-enabled-AutoMute.conf" \ "/usr/share/pulseaudio/alsa-mixer/paths/analog-output-headphones.conf" fi } #-------------------------- 主逻辑 --------------------------# main() { log "INFO" "====== 开始音频é…�ç½® ======" # 获å�–硬件信æ�¯ get_hw_info log "DEBUG" "硬件信æ�¯: Vendor ID: ${_vendor_id} Subsystem ID: ${_subsystem_id} System Product: ${_system_product_name} Baseboard Product: ${_baseboard_product_name}" # 声å�¡ç±»åž‹åˆ¤æ–­ case "${_vendor_id}" in *"0x10ec0222"*) handle_realtek_alc222 ;; *"0x10ec0257"*) handle_realtek_alc3328 ;; *"0x10ec0269"*) handle_realtek_alc269 ;; *"0x10ec0623"*) handle_realtek_alc623 ;; *"0x10ec0662"*) handle_realtek_alc662 ;; *"0x10ec0897"*) handle_realtek_alc897 ;; *"0x14f15098"*) handle_conexant_cx20632 ;; *"0x14f11f86"*) handle_conexant_cx11880 ;; *"0x14f120d1"*) handle_conexant_sn6180 ;; *"0x14f11f87"*) handle_conexant_sn6140 ;; *) log "INFO" "暂未适é…�的声å�¡åž‹å�·: ${_vendor_id}" ;; esac # 特殊硬件处ç�† handle_special_hardware log "INFO" "====== 音频é…�置完æˆ� ======" return 0 } #-------------------------- 执行入å�£ --------------------------# main "$@" ukui-media/ukui-media.pro0000664000175000017500000000033315170054730014307 0ustar fengfengTEMPLATE = subdirs CONFIG += ordered SUBDIRS = \ audio \ ukui-volume-control-applet-qt \ ukui-media-control-led \ ukui-login-sound \ sound-theme-player \ tests ukui-media/tests/0000775000175000017500000000000015170054730012676 5ustar fengfengukui-media/tests/unit_test_ukcc_audio_dev_ctrl/0000775000175000017500000000000015170054730020764 5ustar fengfengukui-media/tests/unit_test_ukcc_audio_dev_ctrl/main.cpp0000664000175000017500000000350715170054730022421 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "../../audio/audio-device-control/ukmedia_device_control_widget.h" #include class ukccAudioCtrlTest : public testing::Test { protected: static void SetUpTestCase() { int argc = 1; char *argv[] = {"ukccAudioCtrlTest"}; //需加å�‚数,å�¦åˆ™å› SDK Kwidgetè¿�行构造函数报错 app = new QApplication(argc, argv); ukccAudioCtrl = new UkmediaDevControlWidget(); } static void TearDownTestCase() { delete ukccAudioCtrl; delete app; } static UkmediaDevControlWidget* ukccAudioCtrl; static QApplication* app; }; // é�™æ€�æˆ�员å�˜é‡�åˆ�始化测试 UkmediaDevControlWidget* ukccAudioCtrlTest::ukccAudioCtrl = nullptr; QApplication* ukccAudioCtrlTest::app = nullptr; TEST_F(ukccAudioCtrlTest, getPaOutputDevInfoTest) { ukccAudioCtrl->outputDevWidget->getPaDevInfo(); } TEST_F(ukccAudioCtrlTest, getPaInputDevInfoTest) { ukccAudioCtrl->inputDevWidget->getPaDevInfo(); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/tests/unit_test_ukcc_audio_dev_ctrl/unit_test_ukcc_audio_dev_ctrl.pro0000664000175000017500000000166215170054730027601 0ustar fengfengQT += dbus xml testlib widgets TEMPLATE = app CONFIG += c++14 link_pkgconfig no_keywords PKGCONFIG += gio-2.0 \ libxml-2.0 \ dconf \ gsettings-qt6 \ kysdk-qtwidgets \ kysdk-sysinfo \ kysdk-hardware TARGET = unit_test_ukcc_audio_dev_ctrl #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov LIBS += -lukcc HEADERS += \ # ../../common/ukmedia_common.h \ # ../../audio/ukui_custom_style.h \ ../../audio/audio-device-control/ukmedia_device_control_widget.h SOURCES += \ # ../../common/ukmedia_common.cpp \ # ../../audio/ukui_custom_style.cpp \ ../../audio/audio-device-control/ukmedia_device_control_widget.cpp \ main.cpp ukui-media/tests/unit_test_sound_theme_player/0000775000175000017500000000000015170054730020662 5ustar fengfengukui-media/tests/unit_test_sound_theme_player/unit_test_sound_theme_player.pro0000664000175000017500000000123715170054730027373 0ustar fengfengQT += core gui dbus xml testlib TEMPLATE = app CONFIG += c++14 link_pkgconfig no_keywords PKGCONFIG += \ glib-2.0 \ gio-2.0 \ dconf \ gsettings-qt6 \ libxml-2.0 \ libcanberra \ libpulse TARGET = unit_test_sound_theme_player #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov SOURCES += ../../sound-theme-player/sound_theme_player.cpp \ main.cpp HEADERS += ../../sound-theme-player/sound_theme_player.h ukui-media/tests/unit_test_sound_theme_player/main.cpp0000664000175000017500000000317415170054730022317 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "../../sound-theme-player/sound_theme_player.h" #include class soundThemePlayerTest:public testing::Test { protected: void SetUp() override { player = new SoundThemePlayer(); sleep(1); } void TearDown() override { delete player; } SoundThemePlayer* player; }; // 播放音效测试 TEST_F(soundThemePlayerTest, Test_playAlertSound) { player->playAlertSound("audio-volume-change"); } // 播放自定义音效测试 TEST_F(soundThemePlayerTest, Test_playCustomAlertSound) { player->playCustomAlertSound("/usr/share/sounds/Light-Seeking/stereo/audio-volume-change.ogg"); } // 音é‡�转化测试 TEST_F(soundThemePlayerTest, Test_alertVolumeTodB) { char *dB_value = player->alertVolumeTodB(100); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/tests/unit_test_ukcc_audio_plugin/0000775000175000017500000000000015170054730020460 5ustar fengfengukui-media/tests/unit_test_ukcc_audio_plugin/unit_test_ukcc_audio_plugin.pro0000664000175000017500000000412315170054730026764 0ustar fengfengQT += dbus xml testlib widgets TEMPLATE = app CONFIG += c++14 link_pkgconfig no_keywords PKGCONFIG += gio-2.0 \ libxml-2.0 \ gsettings-qt6 \ libcanberra \ dconf \ libpulse \ libpulse-mainloop-glib \ kysdk-qtwidgets \ kysdk-sysinfo \ kysdk-hardware TARGET = unit_test_ukcc_audio_plugin #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov LIBS += -lukcc HEADERS += \ ../../common/ukmedia_common.h \ # ../../audio/audio.h \ ../../audio/customstyle.h \ ../../audio/ukui_custom_style.h \ ../../audio/ukui_list_widget_item.h \ ../../audio/ukmedia_main_widget.h \ ../../audio/ukmedia_input_widget.h \ ../../audio/ukmedia_output_widget.h \ ../../audio/ukmedia_volume_control.h \ ../../audio/ukmedia_settings_widget.h \ ../../audio/ukmedia_sound_effects_widget.h \ ../../audio/ukmedia_slider_tip_label_helper.h \ ../../audio/app-device-control/ukmedia_app_device_ctrl.h \ ../../audio/app-device-control/ukmedia_app_item_widget.h \ ../../audio/audio-device-control/ukmedia_device_control_widget.h SOURCES += \ ../../common/ukmedia_common.cpp \ # ../../audio/audio.cpp \ ../../audio/customstyle.cpp \ ../../audio/ukui_custom_style.cpp \ ../../audio/ukui_list_widget_item.cpp \ ../../audio/ukmedia_main_widget.cpp \ ../../audio/ukmedia_input_widget.cpp \ ../../audio/ukmedia_output_widget.cpp \ ../../audio/ukmedia_volume_control.cpp \ ../../audio/ukmedia_settings_widget.cpp \ ../../audio/ukmedia_sound_effects_widget.cpp \ ../../audio/ukmedia_slider_tip_label_helper.cpp \ ../../audio/app-device-control/ukmedia_app_device_ctrl.cpp \ ../../audio/app-device-control/ukmedia_app_item_widget.cpp \ ../../audio/audio-device-control/ukmedia_device_control_widget.cpp \ main.cpp ukui-media/tests/unit_test_ukcc_audio_plugin/main.cpp0000664000175000017500000004144015170054730022113 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include #include "../../audio/ukmedia_main_widget.h" #include class ukccAudioTest:public testing::Test { protected: static void SetUpTestCase() { int argc = 0; char *argv[] = {}; app = new QApplication(argc, argv); ukccAudioPlugin = new UkmediaMainWidget(); // å› ukui-media与pulseaudio建立连接需è¦�3s,因此需è¦�延迟3.5s执行测试用例 QTest::qWait(3500); } static void TearDownTestCase() { delete ukccAudioPlugin; delete app; } static UkmediaMainWidget* ukccAudioPlugin; static QApplication* app; }; // é�™æ€�æˆ�员å�˜é‡�åˆ�始化测试 UkmediaMainWidget* ukccAudioTest::ukccAudioPlugin = nullptr; QApplication* ukccAudioTest::app = nullptr; /* -------------------- UkmediaVolumeControl ----------------------- */ // 获å�–默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSinkMute) { bool muteState = ukccAudioPlugin->m_pVolumeControl->getSinkMute(); qDebug() << "Test: getSinkMute" << muteState; } // 获å�–默认输出设备音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSinkVolume) { int paVolume = ukccAudioPlugin->m_pVolumeControl->getSinkVolume(); qDebug() << "Test: getSinkVolume" << paVolume; } // 获å�–默认输出设备音é‡�å·¦å�³å£°é�“平衡值测试 TEST_F(ukccAudioTest, Test_volumeControl_getBalanceVolume) { float balanceValue = ukccAudioPlugin->m_pVolumeControl->getBalanceVolume(); qDebug() << "Test: getBalanceVolume" << balanceValue; } // 获å�–默认输出设备索引测试 TEST_F(ukccAudioTest, Test_volumeControl_getDefaultSinkIndex) { int index = ukccAudioPlugin->m_pVolumeControl->getDefaultSinkIndex(); qDebug() << "Test: getDefaultSinkIndex" << index; } // 设置默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSinkMute) { ukccAudioPlugin->m_pVolumeControl->setSinkMute(true); qDebug() << "Test: setSinkMute" << ukccAudioPlugin->m_pVolumeControl->getSinkMute(); } // 设置默认输出设备音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSinkVolume) { int index = ukccAudioPlugin->m_pVolumeControl->getDefaultSinkIndex(); ukccAudioPlugin->m_pVolumeControl->setSinkVolume(index, 18350); qDebug() << "Test: setSinkVolume" << ukccAudioPlugin->m_pVolumeControl->getSinkVolume(); } // 设置默认输出设备音é‡�å·¦å�³å£°é�“平衡值测试 TEST_F(ukccAudioTest, Test_volumeControl_setBalanceVolume) { int index = ukccAudioPlugin->m_pVolumeControl->getDefaultSinkIndex(); ukccAudioPlugin->m_pVolumeControl->setBalanceVolume(index, 65536, 1.0); qDebug() << "Test: setBalanceVolume" << ukccAudioPlugin->m_pVolumeControl->getBalanceVolume(); } // 获å�–默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSourceMute) { bool muteState = ukccAudioPlugin->m_pVolumeControl->getSourceMute(); qDebug() << "Test: getSourceMute" << muteState; } // 获å�–默认输入设备音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSourceVolume) { int paVolume = ukccAudioPlugin->m_pVolumeControl->getSourceVolume(); qDebug() << "test getSourceVolume" << paVolume; } // 获å�–默认输入设备索引测试 TEST_F(ukccAudioTest, Test_volumeControl_getDefaultSourceIndex) { int index = ukccAudioPlugin->m_pVolumeControl->getDefaultSourceIndex(); qDebug() << "Test: getDefaultSourceIndex" << index; } // 设置默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSourceMute) { ukccAudioPlugin->m_pVolumeControl->setSourceMute(true); qDebug() << "Test: setSourceMute" << ukccAudioPlugin->m_pVolumeControl->getSourceMute(); } // 设置默认输入设备音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSourceVolume) { int index = ukccAudioPlugin->m_pVolumeControl->getDefaultSourceIndex(); ukccAudioPlugin->m_pVolumeControl->setSourceVolume(index, 65536); qDebug() << "Test: setSourceVolume" << index << ukccAudioPlugin->m_pVolumeControl->getSourceVolume(); } // 设置sink-input音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSinkInputVolume) { ukccAudioPlugin->m_pVolumeControl->setSinkInputVolume(1, 100); } // 设置sink-inputé�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSinkInputMuted) { ukccAudioPlugin->m_pVolumeControl->setSinkInputMuted(1, true); } // 设置source-output音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSourceOutputVolume) { ukccAudioPlugin->m_pVolumeControl->setSourceOutputVolume(1, 100); } // 设置source-outputé�™éŸ³çжæ€�测试 TEST_F(ukccAudioTest, Test_volumeControl_setSourceOutputMuted) { ukccAudioPlugin->m_pVolumeControl->setSourceOutputMuted(1, true); } // 设置默认输出设备测试 TEST_F(ukccAudioTest, Test_volumeControl_setDefaultSink) { ukccAudioPlugin->m_pVolumeControl->setDefaultSink("TEST"); } // 设置默认输入设备测试 TEST_F(ukccAudioTest, Test_volumeControl_setDefaultSource) { ukccAudioPlugin->m_pVolumeControl->setDefaultSource("TEST"); } // 设置默认输出设备端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_setSinkPort) { ukccAudioPlugin->m_pVolumeControl->setSinkPort("TEST", "TEST"); } // 设置默认输入设备端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_setSourcePort) { ukccAudioPlugin->m_pVolumeControl->setSourcePort("TEST", "TEST"); } // 寻找sink活跃端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_findSinkActivePortName) { ukccAudioPlugin->m_pVolumeControl->findSinkActivePortName("TEST"); } // 移除输出声å�¡idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeCardSink) { ukccAudioPlugin->m_pVolumeControl->removeCardSink(99, "TEST"); } // 移除声å�¡idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeCard) { ukccAudioPlugin->m_pVolumeControl->removeCard(99); } // 移除输出idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeSink) { ukccAudioPlugin->m_pVolumeControl->removeSink(99); } // 移除输入声å�¡idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeCardSource) { ukccAudioPlugin->m_pVolumeControl->removeCardSource(99, "TEST"); } // 移除输入idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeSource) { ukccAudioPlugin->m_pVolumeControl->removeSource(99); } // 移除sink-input idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeSinkInput) { ukccAudioPlugin->m_pVolumeControl->removeSinkInput(99); } // 移除source-output idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeSourceOutput) { ukccAudioPlugin->m_pVolumeControl->removeSourceOutput(99); } // 移除客户端idx测试 TEST_F(ukccAudioTest, Test_volumeControl_removeClient) { ukccAudioPlugin->m_pVolumeControl->removeClient(99); } // 设置连接信æ�¯æ��示测试 TEST_F(ukccAudioTest, Test_volumeControl_setConnectingMessage) { ukccAudioPlugin->m_pVolumeControl->setConnectingMessage("TEST"); } // 获å�–sink-input音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSinkInputVolume) { ukccAudioPlugin->m_pVolumeControl->getSinkInputVolume("kylin-music"); } // 获å�–source-output音é‡�测试 TEST_F(ukccAudioTest, Test_volumeControl_getSourceOutputVolume) { ukccAudioPlugin->m_pVolumeControl->getSourceOutputVolume("kylin-recorder"); } // 移除输入端å�£ä¿¡æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_removeInputPortMap) { ukccAudioPlugin->m_pVolumeControl->removeInputPortMap(99); } // 移除声å�¡ä¿¡æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_removeCardMap) { ukccAudioPlugin->m_pVolumeControl->removeCardMap(99); } // 移除声å�¡é…�置文件测试 TEST_F(ukccAudioTest, Test_volumeControl_removeCardProfileMap) { ukccAudioPlugin->m_pVolumeControl->removeCardProfileMap(99); } // 移除输出端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_removeSinkPortMap) { ukccAudioPlugin->m_pVolumeControl->removeSinkPortMap(99); } // 移除输入端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_removeSourcePortMap) { ukccAudioPlugin->m_pVolumeControl->removeSourcePortMap(99); } // 移除声å�¡é…�置文件测试 TEST_F(ukccAudioTest, Test_volumeControl_removeProfileMap) { ukccAudioPlugin->m_pVolumeControl->removeProfileMap(99); } // 移除声å�¡è¾“å…¥é…�置文件测试 TEST_F(ukccAudioTest, Test_volumeControl_removeInputProfile) { ukccAudioPlugin->m_pVolumeControl->removeInputProfile(99); } // 通过输出设备idx获å�–输出结构体信æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_getSinkInfoByIndex) { ukccAudioPlugin->m_pVolumeControl->getSinkInfoByIndex(0); } // 通过输出设备å��获å�–输出结构体信æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_getSinkInfoByName) { ukccAudioPlugin->m_pVolumeControl->getSinkInfoByName("TEST"); } // 通过输入设备idx获å�–输入结构体信æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_getSourceInfoByIndex) { ukccAudioPlugin->m_pVolumeControl->getSourceInfoByIndex(0); } // 通过输入设备å��获å�–输入结构体信æ�¯æµ‹è¯• TEST_F(ukccAudioTest, Test_volumeControl_getSourceInfoByName) { ukccAudioPlugin->m_pVolumeControl->getSourceInfoByName("TEST"); } // -------------------- UkmediaMainWidget----------------------- // gsettings值å�˜åŒ–测试 TEST_F(ukccAudioTest, Test_mainWidget_onKeyChanged) { ukccAudioPlugin->onKeyChanged("TEST"); } // 开机音ä¹�开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_startupButtonSwitchChangedSlot) { ukccAudioPlugin->startupButtonSwitchChangedSlot(true); } // 关机音ä¹�开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_poweroffButtonSwitchChangedSlot) { ukccAudioPlugin->poweroffButtonSwitchChangedSlot(true); } // 注销音ä¹�开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_logoutMusicButtonSwitchChangedSlot) { ukccAudioPlugin->logoutMusicButtonSwitchChangedSlot(true); } // 唤醒音ä¹�开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_wakeButtonSwitchChangedSlot) { ukccAudioPlugin->wakeButtonSwitchChangedSlot(true); } // æ��示音开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_alertSoundButtonSwitchChangedSlot) { ukccAudioPlugin->alertSoundButtonSwitchChangedSlot(true); } // é™�噪开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_noiseReductionButtonSwitchChangedSlot) { ukccAudioPlugin->noiseReductionButtonSwitchChangedSlot(false); } // 侦å�¬å¼€å…³slot测试 TEST_F(ukccAudioTest, Test_mainWidget_loopbackButtonSwitchChangedSlot) { ukccAudioPlugin->loopbackButtonSwitchChangedSlot(false); } // 音é‡�增强开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_volumeIncreaseBtuuonSwitchChangedSlot) { ukccAudioPlugin->volumeIncreaseBtuuonSwitchChangedSlot(false); } // 开机音ä¹�开关slot测试 TEST_F(ukccAudioTest, Test_mainWidget_bootMusicSettingsChanged) { ukccAudioPlugin->bootMusicSettingsChanged("TEST"); } // 系统主题gsettingså�˜åŒ–slot测试 TEST_F(ukccAudioTest, Test_mainWidget_ukuiThemeChangedSlot) { ukccAudioPlugin->ukuiThemeChangedSlot("ukui-light"); } // 获å�–系统默认输入音é‡�测试 TEST_F(ukccAudioTest, Test_mainWidget_getInputVolume) { ukccAudioPlugin->getInputVolume(); } // 获å�–系统默认输出音é‡�测试 TEST_F(ukccAudioTest, Test_mainWidget_getOutputVolume) { ukccAudioPlugin->getOutputVolume(); } // 系统全局主题å�˜åŒ–slot测试 TEST_F(ukccAudioTest, Test_mainWidget_globalThemeChangedSlot) { ukccAudioPlugin->globalThemeChangedSlot("HeYin"); } // 更新主题测试 TEST_F(ukccAudioTest, Test_mainWidget_updateTheme) { ukccAudioPlugin->updateTheme(ukccAudioPlugin); } // 查找输出端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_findPortSink) { ukccAudioPlugin->findPortSink(99, "TEST"); } // 查找输入端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_findPortSource) { ukccAudioPlugin->findPortSource(99, "TEST"); } // 增加‘无’端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_addNoneItem) { ukccAudioPlugin->addNoneItem(SoundType::SINK); } // 增加‘无’端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_addNoneItem2) { ukccAudioPlugin->addNoneItem(SoundType::SOURCE); } // 输入端å�£ç´¢å¼•查询测试 TEST_F(ukccAudioTest, Test_mainWidget_indexOfInputPortInInputCombobox) { ukccAudioPlugin->indexOfInputPortInInputCombobox("TEST"); } // 输入é�™éŸ³æŒ‰é’®slot测试 TEST_F(ukccAudioTest, Test_mainWidget_inputMuteButtonSlot) { ukccAudioPlugin->inputMuteButtonSlot(); } // 输出é�™éŸ³æŒ‰é’®slot测试 TEST_F(ukccAudioTest, Test_mainWidget_outputMuteButtonSlot) { ukccAudioPlugin->outputMuteButtonSlot(); } // 音效主题下拉框slot测试 TEST_F(ukccAudioTest, Test_mainWidget_themeComboxIndexChangedSlot) { ukccAudioPlugin->themeComboxIndexChangedSlot(1); } // 输出音é‡�滑动æ�¡slot测试 TEST_F(ukccAudioTest, Test_mainWidget_outputWidgetSliderChangedSlot) { ukccAudioPlugin->outputWidgetSliderChangedSlot(100); } // 输出音é‡�滑动æ�¡slot测试 TEST_F(ukccAudioTest, Test_mainWidget_outputWidgetSliderChangedSlotInBlue) { ukccAudioPlugin->outputWidgetSliderChangedSlotInBlue(100); } // 定时器slot测试 TEST_F(ukccAudioTest, Test_mainWidget_timeSliderSlot) { ukccAudioPlugin->timeSliderSlot(); } // 输入音é‡�滑动æ�¡slot测试 TEST_F(ukccAudioTest, Test_mainWidget_inputWidgetSliderChangedSlot) { ukccAudioPlugin->inputWidgetSliderChangedSlot(100); } // 声é�“平衡滑动æ�¡slot测试 TEST_F(ukccAudioTest, Test_mainWidget_balanceSliderChangedMono) { ukccAudioPlugin->balanceSliderChangedMono(0.0, 65536, 0); } // 声é�“平衡滑动æ�¡slot测试 TEST_F(ukccAudioTest, Test_mainWidget_balanceSliderChangedSlot) { ukccAudioPlugin->balanceSliderChangedSlot(0.0); } // 寻找输出端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_findOutputPortName) { ukccAudioPlugin->findOutputPortName(0, "TEST"); } // 寻找输入端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_findInputPortName) { ukccAudioPlugin->findInputPortName(0, "TEST"); } // 寻找高优先级é…�置文件测试 TEST_F(ukccAudioTest, Test_mainWidget_findHighPriorityProfile) { ukccAudioPlugin->findHighPriorityProfile(0, "TEST"); } // å�¯ç”¨è¾“入设备是å�¦åŒ…å�«è“�牙设备测试 TEST_F(ukccAudioTest, Test_mainWidget_inputComboboxDeviceContainBluetooth) { ukccAudioPlugin->inputComboboxDeviceContainBluetooth(); } // è“�牙声å�¡å��获å�–测试 TEST_F(ukccAudioTest, Test_mainWidget_blueCardNameInCombobox) { ukccAudioPlugin->blueCardNameInCombobox(); } // 设置声å�¡é…�置文件测试 TEST_F(ukccAudioTest, Test_mainWidget_setCardProfile) { ukccAudioPlugin->setCardProfile("TEST", "TEST"); } // 更新设备端å�£æµ‹è¯• TEST_F(ukccAudioTest, Test_mainWidget_updateCboxDevicePort) { ukccAudioPlugin->updateCboxDevicePort(); } // 输出设备下拉框slot测试 TEST_F(ukccAudioTest, Test_mainWidget_cboxoutputListWidgetCurrentRowChangedSlot) { ukccAudioPlugin->cboxoutputListWidgetCurrentRowChangedSlot(); } // 输入设备下拉框slot测试 TEST_F(ukccAudioTest, Test_mainWidget_cboxinputListWidgetCurrentRowChangedSlot) { ukccAudioPlugin->cboxinputListWidgetCurrentRowChangedSlot(); } // 自定义音效下拉框slot测试 TEST_F(ukccAudioTest, Test_mainWidget_customSoundEffectsSlot) { ukccAudioPlugin->customSoundEffectsSlot(1); } // é‡�置自定义音效测试 TEST_F(ukccAudioTest, Test_mainWidget_resetCustomSoundEffects) { ukccAudioPlugin->resetCustomSoundEffects("HeYin", "audio-volume-change"); } TEST_F(ukccAudioTest, Test_mainWidget_addValue) { ukccAudioPlugin->addValue("TEST", "TEST"); } // These methods no longer exist in the current version // TEST_F(ukccAudioTest, Test_mainWidget_inputStreamMapCardName) { // ukccAudioPlugin->inputStreamMapCardName("TEST", "TEST"); // } // TEST_F(ukccAudioTest, Test_mainWidget_outputStreamMapCardName) { // ukccAudioPlugin->outputStreamMapCardName("TEST", "TEST"); // } // TEST_F(ukccAudioTest, Test_mainWidget_findInputStreamCardName) { // ukccAudioPlugin->findInputStreamCardName("TEST"); // } // TEST_F(ukccAudioTest, Test_mainWidget_findOutputStreamCardName) { // ukccAudioPlugin->findOutputStreamCardName("TEST"); // } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/tests/unit_test_ukui_media_tray/0000775000175000017500000000000015170054730020147 5ustar fengfengukui-media/tests/unit_test_ukui_media_tray/unit_test_ukui_media_tray.pro0000664000175000017500000000604515170054730026147 0ustar fengfengQT += core gui widgets dbus xml network testlib TEMPLATE = app CONFIG += c++14 link_pkgconfig no_keywords PKGCONFIG += \ gsettings-qt6 \ Qt6Svg \ gio-2.0 \ dconf \ x11 \ libcanberra \ libpulse \ libpulse-mainloop-glib \ alsa \ kysdk-sysinfo \ kysdk-hardware \ kysdk-waylandhelper \ KF6WindowSystem \ kysdk-qtwidgets TARGET = unit_test_ukui_media_tray #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov HEADERS += \ ../../common/json.h \ ../../common/user_config.h \ ../../common/user_info_json.h \ ../../common/ukmedia_common.h \ ../../common/sound_effect_json.h \ ../../ukui-volume-control-applet-qt/config.h \ ../../ukui-volume-control-applet-qt/custom_sound.h \ ../../ukui-volume-control-applet-qt/ukmedia_main_widget.h \ ../../ukui-volume-control-applet-qt/ukmedia_custom_class.h \ ../../ukui-volume-control-applet-qt/ukmedia_volume_control.h \ ../../ukui-volume-control-applet-qt/ukmedia_application_volume_widget.h \ ../../ukui-volume-control-applet-qt/ukmedia_osd_display_widget.h \ ../../ukui-volume-control-applet-qt/ukmedia_system_volume_widget.h \ ../../ukui-volume-control-applet-qt/ukui_volume_control_user_config.h \ ../../ukui-volume-control-applet-qt/ukui_list_widget_item.h \ ../../ukui-volume-control-applet-qt/ukui_media_set_headset_widget.h \ ../../ukui-volume-control-applet-qt/dbus-adaptor/dbus-adaptor.h \ ../../ukui-volume-control-applet-qt/dbus-adaptor/bluez-adaptor.h \ ../../ukui-volume-control-applet-qt/QtSingleApplication/qtlocalpeer.h \ ../../ukui-volume-control-applet-qt/QtSingleApplication/qtsingleapplication.h SOURCES += \ ../../common/user_config.cpp \ ../../common/user_info_json.cpp \ ../../common/ukmedia_common.cpp \ ../../common/sound_effect_json.cpp \ ../../ukui-volume-control-applet-qt/custom_sound.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_main_widget.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_custom_class.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_volume_control.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_osd_display_widget.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_system_volume_widget.cpp \ ../../ukui-volume-control-applet-qt/ukmedia_application_volume_widget.cpp \ ../../ukui-volume-control-applet-qt/ukui_list_widget_item.cpp \ ../../ukui-volume-control-applet-qt/ukui_media_set_headset_widget.cpp \ ../../ukui-volume-control-applet-qt/ukui_volume_control_user_config.cpp \ ../../ukui-volume-control-applet-qt/dbus-adaptor/dbus-adaptor.cpp \ ../../ukui-volume-control-applet-qt/dbus-adaptor/bluez-adaptor.cpp \ ../../ukui-volume-control-applet-qt/QtSingleApplication/qtlocalpeer.cpp \ ../../ukui-volume-control-applet-qt/QtSingleApplication/qtsingleapplication.cpp \ main.cpp ukui-media/tests/unit_test_ukui_media_tray/main.cpp0000664000175000017500000005441015170054730021603 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "../../ukui-volume-control-applet-qt/ukmedia_main_widget.h" #include #include "../../ukui-volume-control-applet-qt/QtSingleApplication/QtSingleApplication" #include class ukuiMediaTrayTest:public testing::Test { protected: static void SetUpTestCase() { int argc = 0; char *argv[] = {}; app = new QtSingleApplication(argc, argv); mediaTray = new UkmediaMainWidget(); // å› ukui-media与pulseaudio建立连接需è¦�3s,因此需è¦�延迟3.5s执行测试用例 QTest::qWait(3500); } static void TearDownTestCase() { delete mediaTray; delete app; } static UkmediaMainWidget* mediaTray; static QtSingleApplication *app; }; // é�™æ€�æˆ�员å�˜é‡�åˆ�始化 UkmediaMainWidget* ukuiMediaTrayTest::mediaTray = nullptr; QtSingleApplication* ukuiMediaTrayTest::app = nullptr; /* -------------------- UkmediaVolumeControl----------------------- */ // 获å�–默认输出设备idx测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_getDefaultSinkIndex) { int index = mediaTray->m_pVolumeControl->getDefaultSinkIndex(); } // 获å�–sink-inputé�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_getSinkInputMuted) { bool muteState = mediaTray->m_pVolumeControl->getSinkInputMuted("kylin-music"); } // 设置sink-input音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSinkInputVolume) { mediaTray->m_pVolumeControl->setSinkInputVolume(9, 30000, 2); } // 获å�–sink-input音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_getSinkInputVolume) { mediaTray->m_pVolumeControl->getSinkInputVolume("kylin-music"); } // 设置sink-inputé�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSinkInputMuted) { mediaTray->m_pVolumeControl->setSinkInputMuted("kylin-music", true); } // 更改sink-input默认设备测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_moveSinkInput) { mediaTray->m_pVolumeControl->moveSinkInput("kylin-music", "alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp__sink"); } // 更改source-output默认设备测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_moveSoureOutput) { mediaTray->m_pVolumeControl->moveSoureOutput("kylin-recorder", "alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source"); } // 获å�–source-output音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_getSourceOutputVolume) { mediaTray->m_pVolumeControl->getSourceOutputVolume("kylin-recorder"); } // 设置source-output音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSourceOutputVolume) { mediaTray->m_pVolumeControl->setSourceOutputVolume(9, 30000, 2); } // 设置source-outputé�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSourceOutputMuted) { mediaTray->m_pVolumeControl->setSourceOutputMuted("kylin-recorder", true); } // 设置声å�¡é…�置文件测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setCardProfile) { mediaTray->m_pVolumeControl->setCardProfile(0, "test"); } // 设置默认输出设备测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setDefaultSink) { mediaTray->m_pVolumeControl->setDefaultSink("test"); } // 设置默认输入设备测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_setDefaultSource) { mediaTray->m_pVolumeControl->setDefaultSource("test"); } // 设置默认输出端å�£æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSinkPort) { mediaTray->m_pVolumeControl->setSinkPort("test", "test"); } // 设置默认输入端å�£æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_setSourcePort) { mediaTray->m_pVolumeControl->setSourcePort("test", "test"); } // kill sink-input 测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_killSinkInput) { mediaTray->m_pVolumeControl->killSinkInput(1); } // 移除输出设备信æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeSink) { mediaTray->m_pVolumeControl->removeSink(99); } // 移除输入设备信æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeSource) { mediaTray->m_pVolumeControl->removeSource(99); } // 移除输出类应用信æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeSinkInput) { mediaTray->m_pVolumeControl->removeSinkInput(99); } // 获å�–è“�牙电é‡�测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_getBatteryLevel) { mediaTray->m_pVolumeControl->getBatteryLevel("test"); } // 移除输出端å�£ä¿¡æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeOutputPortMap) { mediaTray->m_pVolumeControl->removeOutputPortMap(99); } // 移除输入端å�£ä¿¡æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeInputPortMap) { mediaTray->m_pVolumeControl->removeInputPortMap(99); } // 移除声å�¡ä¿¡æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeCardMap) { mediaTray->m_pVolumeControl->removeCardMap(99); } // 移除声å�¡é…�置文件测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeCardProfileMap) { mediaTray->m_pVolumeControl->removeCardProfileMap(99); } // 移除输出端å�£ä¿¡æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeSinkPortMap) { mediaTray->m_pVolumeControl->removeSinkPortMap(99); } // 移除输入端å�£ä¿¡æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeSourcePortMap) { mediaTray->m_pVolumeControl->removeSourcePortMap(99); } // 移除声å�¡é…�置文件测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeProfileMap) { mediaTray->m_pVolumeControl->removeProfileMap(99); } // 移除输入é…�置文件测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_removeInputProfile) { mediaTray->m_pVolumeControl->removeInputProfile(99); } // 查找输出端å�£æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_volumeControl_findOutputPort) { mediaTray->m_pVolumeControl->findOutputPort("Speaker"); } // 查找输出端å�£idx测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_findPortSinkIndex) { mediaTray->m_pVolumeControl->findPortSinkIndex("Speaker"); } // 查找输出端å�£å��测试 TEST_F(ukuiMediaTrayTest, Test_volumeControl_findSinkPortName) { mediaTray->m_pVolumeControl->findSinkPortName(0); } /* -------------------- UkmediaMainWidget----------------------- */ // 获å�–默认输入设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultInputDevice) { QString defaultInputDev = mediaTray->getDefaultInputDevice(); qDebug() << "test getDefaultInputDevice" << defaultInputDev; } // 获å�–默认输出设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultOutputDevice) { QString defaultOutputDev = mediaTray->getDefaultOutputDevice(); qDebug() << "test getDefaultOutputDevice" << defaultOutputDev; } // 获å�–所有输出设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAllOutputDevices) { QStringList devicesList = mediaTray->getAllOutputDevices(); qDebug() << "test getAllOutputDevices" << devicesList; } // 获å�–所有输入设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAllInputDevices) { QStringList devicesList = mediaTray->getAllInputDevices(); qDebug() << "test getAllInputDevices" << devicesList; } // 获å�–默认输出设备音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultOutputVolume) { int mediaVolume = mediaTray->getDefaultOutputVolume(); qDebug() << "Test: getDefaultOutputVolume" << mediaVolume; } // 获å�–默认输入设备音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultInputVolume) { int mediaVolume = mediaTray->getDefaultInputVolume(); qDebug() << "Test: getDefaultInputVolume" << mediaVolume; } // 获å�–默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultOutputMuteState) { bool muteState = mediaTray->getDefaultOutputMuteState(); qDebug() << "Test: getDefaultOutputMuteState" << muteState; } // 获å�–默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getDefaultInputMuteState) { bool muteState = mediaTray->getDefaultInputMuteState(); qDebug() << "Test: getDefaultInputMuteState" << muteState; } // 设置默认输出设备音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setDefaultOutputVolume) { bool isSucceed = mediaTray->setDefaultOutputVolume(100); qDebug() << "Test: setDefaultOutputVolume" << isSucceed; } // 设置默认输入设备音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setDefaultInputVolume) { bool isSucceed = mediaTray->setDefaultInputVolume(100); qDebug() << "Test: setDefaultInputVolume" << isSucceed; } // 设置默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setDefaultOutputMuteState) { bool isSucceed = mediaTray->setDefaultOutputMuteState(false); qDebug() << "Test: setDefaultOutputMuteState" << isSucceed; } // 设置默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setDefaultInputMuteState) { bool isSucceed = mediaTray->setDefaultInputMuteState(false); qDebug() << "Test: setDefaultInputMuteState" << isSucceed; } // 获å�–系统默认输入设备端å�£å�� TEST_F(ukuiMediaTrayTest, Test_mainWidget_getSystemInputDevice) { QString portName = mediaTray->getSystemInputDevice(); qDebug() << "Test: getSystemInputDevice" << portName; } // 获å�–系统默认输出设备端å�£å�� TEST_F(ukuiMediaTrayTest, Test_mainWidget_getSystemOutputDevice) { QString portName = mediaTray->getSystemOutputDevice(); qDebug() << "Test: getSystemOutputDevice" << portName; } // 获å�–系统当å‰�正在使用音频设备的应用å��å�•列表测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAppList) { QStringList appList = mediaTray->getAppList(); qDebug() << "Test: getAppList" << appList; } // åˆ�始化é�™éŸ³ç�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_mainWidget_initVolumeLed) { mediaTray->initVolumeLed(); } // 设置耳机端å�£æµ‹è¯•测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setHeadsetPort) { mediaTray->setHeadsetPort("test"); } // æ��示音测试测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_handleTimeout) { mediaTray->handleTimeout(); } // 字体gsettingså�˜åŒ–slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_fontSizeChangedSlot) { mediaTray->fontSizeChangedSlot("systemFont"); } // 主题gsettingså�˜åŒ–slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_ukuiThemeChangedSlot) { mediaTray->ukuiThemeChangedSlot("ukui-light"); } // 音效主题gsettingså�˜åŒ–slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_soundThemeChangedSlot) { mediaTray->soundThemeChangedSlot("HeYin"); } // 系统音é‡�滑动æ�¡slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_systemVolumeSliderChangedSlot) { mediaTray->systemVolumeSliderChangedSlot(100); } // 系统音é‡�滑动æ�¡slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_advancedSystemSliderChangedSlot) { mediaTray->advancedSystemSliderChangedSlot(100); } // 系统é�™éŸ³æŒ‰é’®slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_systemVolumeButtonClickedSlot) { mediaTray->systemVolumeButtonClickedSlot(); } // 系统é�™éŸ³æŒ‰é’®slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_appWidgetMuteButtonCLickedSlot) { mediaTray->appWidgetMuteButtonCLickedSlot(); } // 声音托盘鼠标事件slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_activatedSystemTrayIconSlot) { mediaTray->activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason::Trigger); } // 声音托盘鼠标事件slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_activatedSystemTrayIconSlot1) { mediaTray->activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason::MiddleClick); } // 声音托盘鼠标事件slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_activatedSystemTrayIconSlot2) { mediaTray->activatedSystemTrayIconSlot(QSystemTrayIcon::ActivationReason::DoubleClick); } // 声音设置跳转slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_jumpControlPanelSlot) { mediaTray->jumpControlPanelSlot(); } TEST_F(ukuiMediaTrayTest, Test_mainWidget_verifyAlsaCard) { gboolean hsmic = TRUE; gboolean hpmic = TRUE; mediaTray->verifyAlsaCard(0, &hsmic, &hpmic); } // 鼠标滚轮设置é�™éŸ³çжæ€�slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_mouseMeddleClickedTraySlot) { mediaTray->mouseMeddleClickedTraySlot(); } // è“�牙耳机电é‡�å�˜åŒ–slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_batteryLevelChanged) { mediaTray->batteryLevelChanged("TEST", 100); } // åˆ�始化è“�牙设备音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_initBlueDeviceVolume) { mediaTray->initBlueDeviceVolume(99, "TEST"); } // 绘制图标测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_drawLightColoredPixmap) { QSize iconSize(24,24); mediaTray->drawLightColoredPixmap(QIcon::fromTheme("audio-volume-medium-symbolic").pixmap(iconSize)); } // 绘制图标测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_drawDarkColoredPixmap) { QSize iconSize(24,24); mediaTray->drawDarkColoredPixmap(QIcon::fromTheme("audio-volume-medium-symbolic").pixmap(iconSize)); } // 计算托盘弹出ä½�置测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_caculatePosition) { mediaTray->caculatePosition(); } // 开机音ä¹�是å�¦å¼€å�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_mainWidget_switchStartupPlayMusic) { mediaTray->switchStartupPlayMusic(); } // 系统声音相关é…�ç½®gsettingså�˜åŒ–测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_soundSettingChanged) { mediaTray->soundSettingChanged("TEST"); } // s3/s4音频设备挂起测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_onPrepareForSleep) { mediaTray->onPrepareForSleep(0); } // 选择输出设备slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_outputListWidgetCurrentRowChangedSlot) { mediaTray->outputListWidgetCurrentRowChangedSlot(1); } // 选择输入设备slot测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_inputListWidgetCurrentRowChangedSlot) { mediaTray->inputListWidgetCurrentRowChangedSlot(1); } // 更新应用音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_updateAppVolume) { mediaTray->updateAppVolume("kylin-music", 100, false); } // 字符串整ç�†å‡½æ•°æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_mainWidget_stringRemoveUnrecignizedChar) { mediaTray->stringRemoveUnrecignizedChar("test"); } // 获å�–è“�牙声å�¡å��测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_blueCardName) { mediaTray->blueCardName(); } // 查找文件函数测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_findFile) { mediaTray->findFile("/usr/share/sounds/", "test"); } TEST_F(ukuiMediaTrayTest, Test_mainWidget_getSessionActive) { mediaTray->getSessionActive(); } // 播放æ��示音测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_playAlertSound) { mediaTray->playAlertSound("audio-volume-change"); } // 获å�–输出类应用信æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_mainWidget_getPlaybackAppInfo) { mediaTray->getPlaybackAppInfo(); } // 获å�–输入类应用信æ�¯æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_mainWidget_getRecordAppInfo) { mediaTray->getRecordAppInfo(); } // 获å�–应用音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAppVolume) { mediaTray->getAppVolume("kylin-music"); } // 获å�–应用é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAppMuteState) { mediaTray->getAppMuteState("kylin-music"); } // 获å�–应用当å‰�默认输出设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAppOutputDevice) { mediaTray->getAppOutputDevice("kylin-music"); } // 获å�–应用当å‰�默认输入设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_getAppInputDevice) { mediaTray->getAppInputDevice("kylin-recorder"); } // 设置应用é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setAppMuteState) { mediaTray->setAppMuteState("kylin-music", false); } // 设置应用音é‡�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setAppVolume) { mediaTray->setAppVolume("kylin-music", 100); } // 设置系统输出设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setSystemOutputDevice) { mediaTray->setSystemOutputDevice("test"); } // 设置系统输入设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setSystemInputDevice) { mediaTray->setSystemInputDevice("test"); } // 设置应用输出设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setAppOutputDevice) { mediaTray->setAppOutputDevice("kylin-music", 99, "test"); } // 设置应用输入设备测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_setAppInputDevice) { mediaTray->setAppInputDevice("kylin-recorder", 99, "test"); } // 设置端å�£æ˜¯å�¦éœ€è¦�éš�è—�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_isPortHidingNeeded) { mediaTray->isPortHidingNeeded(0, 0, "HDMI"); } // 设置端å�£æ˜¯å�¦éœ€è¦�éš�è—�测试 TEST_F(ukuiMediaTrayTest, Test_mainWidget_isPortHidingNeeded2) { mediaTray->isPortHidingNeeded(1, 0, "HDMI"); } /* -------------------- Bluetooth_Dbus ----------------------- */ // å�‘é€�è“�牙耳机电é‡�å�‘生å�˜åŒ–ä¿¡å�·æµ‹è¯• TEST_F(ukuiMediaTrayTest, Test_sendBatteryChangedSignal) { mediaTray->m_pBluetoothDbus->sendBatteryChangedSignal("test", 100); } // 获å�–è“�牙耳机电é‡�测试 TEST_F(ukuiMediaTrayTest, Test_getBatteryLevel) { mediaTray->m_pBluetoothDbus->getBatteryLevel("test"); } /* -------------------- MediaAdaptor ----------------------- */ // 获å�–所有输入设备测试 TEST_F(ukuiMediaTrayTest, dbus_GetAllInputDevicesTest) { QStringList list = mediaTray->m_pMediaDbus->getAllInputDevices(); } // 获å�–所有输出设备测试 TEST_F(ukuiMediaTrayTest, dbus_GetAllOutputDevicesTest) { QStringList list = mediaTray->m_pMediaDbus->getAllOutputDevices(); } // 获å�–默认输出设备测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultOutputDeviceTest) { QString device = mediaTray->m_pMediaDbus->getDefaultOutputDevice(); } // 获å�–默认输入设备测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultInputDeviceTest) { QString device = mediaTray->m_pMediaDbus->getDefaultInputDevice(); } // 获å�–默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultInputMuteStateTest) { bool state = mediaTray->m_pMediaDbus->getDefaultInputMuteState(); } // 获å�–默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultOutputMuteStateTest) { bool state = mediaTray->m_pMediaDbus->getDefaultOutputMuteState(); } // 获å�–默认输入设备音é‡�测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultInputVolumeTest) { int value = mediaTray->m_pMediaDbus->getDefaultInputVolume(); } // 获å�–默认输出设备音é‡�测试 TEST_F(ukuiMediaTrayTest, dbus_GetDefaultOutputVolumeTest) { int value = mediaTray->m_pMediaDbus->getDefaultOutputVolume(); } // 设置默认输入设备测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultInputDeviceTest) { bool state = mediaTray->m_pMediaDbus->setDefaultInputDevice("test"); } // 设置默认输出设备测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultOutputDeviceTest) { bool state = mediaTray->m_pMediaDbus->setDefaultOutputDevice("test"); } // 设置默认输入设备音é‡�测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultInputVolumeTest) { bool state = mediaTray->m_pMediaDbus->setDefaultInputVolume(100); } // 设置默认输出设备音é‡�测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultOutputVolumeTest) { bool state = mediaTray->m_pMediaDbus->setDefaultOutputVolume(100); } // 设置默认输入设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultInputMuteStateTest) { bool state = mediaTray->m_pMediaDbus->setDefaultInputMuteState(true); } // 设置默认输出设备é�™éŸ³çжæ€�测试 TEST_F(ukuiMediaTrayTest, dbus_SetDefaultOutputMuteStateTest) { bool state = mediaTray->m_pMediaDbus->setDefaultOutputMuteState(true); } // 获å�–è“�牙耳机电é‡�测试 TEST_F(ukuiMediaTrayTest, dbus_GetBatteryLevelTest) { int battery_value = mediaTray->m_pMediaDbus->getBatteryLevel("TEST"); } /* -------------------- UkmediaOsdDisplayWidget ----------------------- */ // 获å�–osd弹窗ä½�置测试 TEST_F(ukuiMediaTrayTest, osd_caculatePositionTest) { mediaTray->osdWidget->caculatePosition(); } // 设置osd弹窗图标测试 TEST_F(ukuiMediaTrayTest, osd_setIconTest) { mediaTray->osdWidget->setIcon("audio-headphones-symbolic"); } // osd弹窗定时器函数测试 TEST_F(ukuiMediaTrayTest, osd_timeoutHandleTest) { mediaTray->osdWidget->timeoutHandle(); } // osd弹窗é‡�绘函数测试 TEST_F(ukuiMediaTrayTest, osd_repaintWidgetTest) { mediaTray->osdWidget->repaintWidget(); } // osd弹窗主题gsettingå�˜åŒ–测试 TEST_F(ukuiMediaTrayTest, osd_ukuiThemeChangedSlotTest) { mediaTray->osdWidget->ukuiThemeChangedSlot("ukui-light"); } // osd弹窗获å�–é€�明度测试 TEST_F(ukuiMediaTrayTest, osd_getGlobalOpacityTest) { mediaTray->osdWidget->getGlobalOpacity(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_headphoneButtonClickedSlot) { mediaTray->headsetWidget->headphoneButtonClickedSlot(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_headsetButtonClickedSlot) { mediaTray->headsetWidget->headsetButtonClickedSlot(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_microphoneButtonClickedSlot) { mediaTray->headsetWidget->microphoneButtonClickedSlot(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_soundSettingButtonClickedSlot) { mediaTray->headsetWidget->soundSettingButtonClickedSlot(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_cancelButtonClickedSlot) { mediaTray->headsetWidget->cancelButtonClickedSlot(); } TEST_F(ukuiMediaTrayTest, Test_HeadsetWidget_cset) { mediaTray->headsetWidget->cset("name= Capture Switch", HW_CARD, "0", 0, 0); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/tests/tests.pro0000664000175000017500000000041715170054730014564 0ustar fengfengTEMPLATE = subdirs SUBDIRS += unit_test_sound_theme_player \ unit_test_ukui_login_sound \ unit_test_ukui_media_tray \ unit_test_ukcc_audio_plugin \ unit_test_ukcc_app_dev_ctrl \ unit_test_ukcc_audio_dev_ctrl ukui-media/tests/unit_test_ukcc_app_dev_ctrl/0000775000175000017500000000000015170054730020443 5ustar fengfengukui-media/tests/unit_test_ukcc_app_dev_ctrl/main.cpp0000664000175000017500000001020315170054730022067 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "../../audio/ukmedia_main_widget.h" #include class ukccAppCtrlTest : public testing::Test { protected: static void SetUpTestCase() { int argc = 1; char *argv[] = {"ukccAppCtrlTest"}; //需加å�‚数,å�¦åˆ™å› SDK Kwidgetè¿�行构造函数报错 app = new QApplication(argc, argv); ukccAppCtrl = new UkmediaAppCtrlWidget(); } static void TearDownTestCase() { delete ukccAppCtrl; delete app; } static UkmediaAppCtrlWidget* ukccAppCtrl; static QApplication* app; }; // é�™æ€�æˆ�员å�˜é‡�åˆ�始化测试 UkmediaAppCtrlWidget* ukccAppCtrlTest::ukccAppCtrl = nullptr; QApplication* ukccAppCtrlTest::app = nullptr; // 获å�–系统音é‡� TEST_F(ukccAppCtrlTest, Test_getSystemVolume) { int value = ukccAppCtrl->getSystemVolume(); } // 设置应用音é‡�测试 TEST_F(ukccAppCtrlTest, Test_setAppVolume) { QSlider *slider = ukccAppCtrl->stackWidget->findChild("kylin-music"); if (slider) slider->setValue(58); else ukccAppCtrl->setAppVolume(100); } // 设置系统音é‡�测试 TEST_F(ukccAppCtrlTest, Test_setSystemVolume) { bool state = ukccAppCtrl->setSystemVolume(100); } // 设置应用é�™éŸ³çжæ€�测试 TEST_F(ukccAppCtrlTest, Test_setAppMuteState) { UkuiButtonDrawSvg *btn = ukccAppCtrl->stackWidget->findChild("kylin-music"); if (btn) btn->click(); else ukccAppCtrl->setAppMuteState(); } // 设置系统输出设备é�™éŸ³çжæ€�测试 TEST_F(ukccAppCtrlTest, Test_setSystemOutputDevice) { bool state = ukccAppCtrl->setSystemOutputDevice("Speaker(sof-hda-dsp)"); } // 设置系统输入设备é�™éŸ³çжæ€�测试 TEST_F(ukccAppCtrlTest, Test_setSystemInputDevice) { bool state = ukccAppCtrl->setSystemInputDevice("Digital Microphone(sof-hda-dsp)"); } // 设置应用输出设备测试 TEST_F(ukccAppCtrlTest, Test_setAppOutputDevice) { QComboBox *box = ukccAppCtrl->stackWidget->findChild("kylin-music-output"); if (box) box->setCurrentIndex(1); else ukccAppCtrl->setAppOutputDevice("Speaker(sof-hda-dsp)"); } // 设置应用输入设备测试 TEST_F(ukccAppCtrlTest, Test_setAppInputDevice) { QComboBox *box = ukccAppCtrl->stackWidget->findChild("kylin-recorder-input"); if (box) box->setCurrentIndex(1); else ukccAppCtrl->setAppInputDevice("Digital Microphone(sof-hda-dsp)"); } // 更新端å�£æµ‹è¯• TEST_F(ukccAppCtrlTest, Test_updatePort) { ukccAppCtrl->updatePort(); } // 更新应用列表测试 TEST_F(ukccAppCtrlTest, Test_updateAppItem) { ukccAppCtrl->updateAppItem(SYSTEM_VOLUME_CTRL); } // 移除应用列表测试 TEST_F(ukccAppCtrlTest, Test_removeAppItem) { ukccAppCtrl->removeAppItem("Test"); } // 更新系统音é‡�测试 TEST_F(ukccAppCtrlTest, Test_updateSystemVolume) { ukccAppCtrl->updateSystemVolume(50); } // 更新系统é�™éŸ³çжæ€�测试 TEST_F(ukccAppCtrlTest, Test_updateSystemMuteState) { ukccAppCtrl->updateSystemMuteState(true); } // 应用索引查询测试 TEST_F(ukccAppCtrlTest, Test_indexOfItemCombobox) { QComboBox *box = new QComboBox(); box->addItem(SYSTEM_VOLUME_CTRL); int index = ukccAppCtrl->indexOfItemCombobox(SYSTEM_VOLUME_CTRL, box); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/tests/unit_test_ukcc_app_dev_ctrl/unit_test_ukcc_app_dev_ctrl.pro0000664000175000017500000000203415170054730026731 0ustar fengfengQT += dbus xml testlib widgets TEMPLATE = app CONFIG += c++14 link_pkgconfig no_keywords PKGCONFIG += gio-2.0 \ libxml-2.0 \ dconf \ gsettings-qt6 \ kysdk-qtwidgets \ kysdk-sysinfo \ kysdk-hardware TARGET = unit_test_ukcc_app_dev_ctrl #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov LIBS += -lukcc HEADERS += \ ../../common/ukmedia_common.h \ ../../audio/ukui_custom_style.h \ ../../audio/app-device-control/ukmedia_app_device_ctrl.h \ ../../audio/app-device-control/ukmedia_app_item_widget.h SOURCES += \ ../../common/ukmedia_common.cpp \ ../../audio/ukui_custom_style.cpp \ ../../audio/app-device-control/ukmedia_app_device_ctrl.cpp \ ../../audio/app-device-control/ukmedia_app_item_widget.cpp \ main.cpp ukui-media/tests/unit_test_ukui_login_sound/0000775000175000017500000000000015170054730020351 5ustar fengfengukui-media/tests/unit_test_ukui_login_sound/unit_test_ukui_login_sound.pro0000664000175000017500000000201415170054730026543 0ustar fengfengQT += core gui testlib TEMPLATE = app CONFIG += c++17 link_pkgconfig no_keywords PKGCONFIG += alsa TARGET = unit_test_ukui_login_sound #代ç �覆盖率工具gcov QMAKE_LFLAGS +=-fprofile-arcs -ftest-coverage QMAKE_CXXFLAGS += --coverage -fno-inline -fno-access-control INCLUDEPATH += /usr/include/gtest LIBS += -lgtest_main -lpthread LIBS += -L$$[QT_INSTALL_LIBS] -lgsettings-qt6 -lgtest -lgcov SOURCES += ../../common/user_config.cpp \ ../../common/user_info_json.cpp \ ../../common/sound_effect_json.cpp \ ../../ukui-login-sound/ukui_login_sound.cpp \ ../../ukui-login-sound/ukui_login_sound_user_config.cpp \ main.cpp HEADERS += ../../common/json.h \ ../../common/user_config.h \ ../../common/user_info_json.h \ ../../common/sound_effect_json.h \ ../../ukui-login-sound/formats.h \ ../../ukui-login-sound/ukui_login_sound_h \ ../../ukui-login-sound/ukui_login_sound_user_config.h ukui-media/tests/unit_test_ukui_login_sound/main.cpp0000664000175000017500000000263415170054730022006 0ustar fengfeng/* * Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see #include #include "../../ukui-login-sound/ukui_login_sound.h" class soundThemePlayerTest:public testing::Test { protected: void SetUp() override { player = new UkuiLoginSound(); sleep(1); } void TearDown() override { delete player; } UkuiLoginSound* player; }; // 播放音效测试 TEST_F(soundThemePlayerTest, playStartMusicTest) { QString defaultOutputDev = "default"; player->checkPcm(defaultOutputDev.toLatin1().data()); player->aplayMain(PLAY_STARTUP_WAV, defaultOutputDev.toLatin1().data()); } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ukui-media/configuration/0000775000175000017500000000000015170054730014403 5ustar fengfengukui-media/configuration/99-ukui-media.rules0000664000175000017500000000423415170054730017753 0ustar fengfeng# do not edit this file, it will be overwritten on update # This file is part of UKUI-MEDIA # Author: Zoey SUBSYSTEM!="sound", GOTO="pulseaudio_end" ACTION!="change", GOTO="pulseaudio_end" KERNEL!="card*", GOTO="pulseaudio_end" SUBSYSTEMS=="usb", GOTO="pulseaudio_check_usb" SUBSYSTEMS=="platform", DRIVERS=="thinkpad_acpi", ENV{PULSE_IGNORE}="1" SUBSYSTEMS=="platform", DRIVERS=="ft-hda", ENV{PULSE_PROFILE_SET}="pulse-ft-hda.conf" SUBSYSTEMS=="platform", DRIVERS=="pmdk_dp", ENV{PULSE_PROFILE_SET}="pulse-X100-hdmi.conf" GOTO="pulseaudio_end" LABEL="pulseaudio_check_usb" # Inspur Camera ATTRS{idVendor}=="f00f", ATTRS{idProduct}=="0e01", ENV{PULSE_PROFILE_SET}="kylin-inspur-usb-audio.conf" # Lenovo MH243A ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4f18", ENV{PULSE_PROFILE_SET}="alc4080-mh243a-usb-audio.conf" # Lenovo M90H ATTRS{idVendor}=="17aa", ATTRS{idProduct}=="3501", ENV{PULSE_PROFILE_SET}="lenovo-m90h-usb-audio.conf" #LENOVO P90H ATTRS{idVendor}=="17aa", ATTRS{idProduct}=="3507", ENV{PULSE_PROFILE_SET}="lenovo-p90h-usb-audio.conf" # MCA500 usb audio ATTRS{idVendor}=="20b1", ATTRS{idProduct}=="3079", ENV{PULSE_PROFILE_SET}="mca500-usb-audio.conf" # Audio fs 1.0 ATTRS{idVendor}=="31b2", ATTRS{idProduct}=="0020", ENV{PULSE_PROFILE_SET}="fs-hygon-usb-audio.conf" # HUAWEI Kunpeng 920 0bda~4987 ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4987", ENV{PULSE_PROFILE_SET}="0bda-4987-usb-audio.conf" # 三诺一体机 ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4f39", ENV{PULSE_PROFILE_SET}="0bda-4f39-usb-audio.conf" # 海康å¨�视P514p ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4f36", ENV{PULSE_PROFILE_SET}="0bda-4f36-usb-audio.conf" # Douyu G591 ATTRS{idVendor}=="2b0d", ATTRS{idProduct}=="0031", ENV{PULSE_VOLUME_IGNORE_DB}="1" # C-media ATTRS{idVendor}=="0d8c", ATTRS{idProduct}=="0012", ENV{PULSE_VOLUME_IGNORE_DB}="1" # AEEVISION Camera ATTRS{idVendor}=="058e", ATTRS{idProduct}=="3863", ENV{PULSE_VOLUME_IGNORE_DB}="1" # EDIFIER M16 ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0201", ENV{PULSE_VOLUME_IGNORE_DB}="1" # JBL USB ATTRS{idVendor}=="e5b7", ATTRS{idProduct}=="0811", ENV{PULSE_VOLUME_IGNORE_DB}="1" GOTO="pulseaudio_end" LABEL="pulseaudio_end" ukui-media/configuration/kylin-paths/0000775000175000017500000000000015170054730016646 5ustar fengfengukui-media/configuration/kylin-paths/analog-output-jbl.conf0000664000175000017500000000431215170054730023061 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; Intended for the 'default' output. Note that a-o-speaker.conf has a ; higher priority than this ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 99 [Element Hardware Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element PCM] switch = mute volume = 216 override-map.1 = all override-map.2 = all-left,all-right [Element Headphone] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Front Microphone] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master Mono] switch = off volume = off [Element Front] switch = mute volume = merge override-map.1 = all-front override-map.2 = front-left,front-right [Element Rear] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right [Element Surround] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right [Element Side] switch = mute volume = merge override-map.1 = all-side override-map.2 = side-left,side-right [Element Center] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,all-center [Element LFE] switch = mute volume = merge override-map.1 = lfe override-map.2 = lfe,lfe [Element CLFE] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,lfe #.include analog-output.conf.common ukui-media/configuration/kylin-paths/analog-input-rear-mic-hikvision.conf0000664000175000017500000000212415170054730025610 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; For devices where a 'Mic' or 'Mic Boost' element exists ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 87 description-key = analog-input-microphone-rear [Jack Mic - Input] required-any = any [Jack Mic - Input,1] state.plugged = no state.unplugged = unknown [Element Mic] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right ukui-media/configuration/kylin-paths/iec958-stereo-output-jbl.conf0000664000175000017500000000207015170054730024124 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . [Element IEC958] switch = mute [Element Headphone] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element PCM] required-any = any switch = mute volume = 216 override-map.1 = all override-map.2 = all-left,all-right [Element Speaker] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right ukui-media/configuration/kylin-paths/Desktop-speakers.conf0000664000175000017500000001116615170054730022746 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; Path for mixers that don't have a 'Speaker' control, but where we ; force enable the speaker paths nonetheless. ; Needed for some older Dell laptops. ; See analog-output.conf.common for an explanation on the directives [General] priority = 100 description-key = analog-output-speaker [Properties] device.icon_name = audio-speakers [Jack Headphone - Output] state.plugged = no state.unplugged = unknown [Jack Dock Headphone] state.plugged = no state.unplugged = unknown [Jack Front Headphone] state.plugged = no state.unplugged = unknown [Jack Line Out] state.plugged = no state.unplugged = unknown [Jack Line Out Front] state.plugged = no state.unplugged = unknown [Jack Front Line Out] state.plugged = no state.unplugged = unknown [Jack Rear Line Out] state.plugged = no state.unplugged = unknown [Jack Dock Line Out] state.plugged = no state.unplugged = unknown [Jack Speaker - Output] state.plugged = no state.unplugged = unknown [Jack Speaker Phantom] required-any = any state.plugged = unknown state.unplugged = unknown [Jack Speaker Front Phantom] required-any = any state.plugged = unknown state.unplugged = unknown [Element Hardware Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master Mono] switch = off volume = off ; This profile path is intended to control the speaker, not the ; headphones. But it should not hurt if we leave the headphone jack ; enabled nonetheless. [Element Headphone] switch = mute volume = zero [Element Headphone2] switch = mute volume = zero [Element Headphone+LO] switch = off volume = off [Element Speaker+LO] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Speaker] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Desktop Speaker] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Front] switch = mute volume = merge override-map.1 = all-front override-map.2 = front-left,front-right [Element Front Speaker] switch = mute volume = merge override-map.1 = all-front override-map.2 = front-left,front-right required-any = any [Element Speaker Front] switch = mute volume = merge override-map.1 = all-front override-map.2 = front-left,front-right required-any = any [Element Rear] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right [Element Surround] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right [Element Surround Speaker] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right required-any = any [Element Speaker Surround] switch = mute volume = merge override-map.1 = all-rear override-map.2 = rear-left,rear-right required-any = any [Element Side] switch = mute volume = merge override-map.1 = all-side override-map.2 = side-left,side-right [Element Speaker Side] switch = mute volume = merge override-map.1 = all-side override-map.2 = side-left,side-right [Element Center] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,all-center [Element Center Speaker] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,all-center required-any = any [Element LFE] switch = mute volume = merge override-map.1 = lfe override-map.2 = lfe,lfe [Element LFE Speaker] switch = mute volume = merge override-map.1 = lfe override-map.2 = lfe,lfe required-any = any [Element Bass Speaker] switch = mute volume = merge override-map.1 = lfe override-map.2 = lfe,lfe required-any = any [Element CLFE] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,lfe [Element Speaker CLFE] switch = mute volume = merge override-map.1 = all-center override-map.2 = all-center,lfe .include analog-output.conf.common ukui-media/configuration/kylin-paths/analog-output-headphones-enabled-AutoMute.conf0000664000175000017500000000713415170054730027566 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; Path for mixers that have a 'Headphone' control ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 99 description-key = analog-output-headphones [Properties] device.icon_name = audio-headphones [Jack Dock Headphone] required-any = any [Jack Dock Headphone Phantom] required-any = any state.plugged = unknown state.unplugged = unknown [Jack Front Headphone] required-any = any [Jack Headphone - Output] required-any = any [Jack Front Headphone,1] required-any = any [Jack Front Headphone Front] required-any = any [Jack Front Headphone Surround] required-any = any [Jack Front Headphone Phantom] required-any = any state.plugged = unknown state.unplugged = unknown [Jack Headphone] required-any = any [Jack Headphone Phantom] required-any = any state.plugged = unknown state.unplugged = unknown # This jack can be either a headphone *or* a mic. Used on some ASUS netbooks. [Jack Headphone Mic] required-any = any [Element Hardware Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element DAC] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Master Mono] switch = off volume = off [Element Speaker+LO] switch = off volume = off [Element Headphone+LO] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Headphone] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Front] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Headset] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Line HP Swap] switch = on required-any = any [Element Auto-Mute Mode] enumeration = select [Option Auto-Mute Mode:Disabled] name = analog-output-headphones ; This profile path is intended to control the first headphones, not ; the second headphones. But it should not hurt if we leave the second ; headphone jack enabled nonetheless. [Element Headphone2] switch = mute volume = zero [Element Speaker] switch = off volume = off [Element Desktop Speaker] switch = off volume = off ; On some machines Front is actually a part of the Headphone path #[Element Front] #switch = off #volume = off [Element Rear] switch = off volume = off [Element Surround] switch = off volume = off [Element Side] switch = off volume = off [Element Center] switch = off volume = off [Element LFE] switch = off volume = off [Element Bass Speaker] switch = off volume = off [Element Speaker Front] switch = off volume = off [Element Speaker Surround] switch = off volume = off [Element Speaker Side] switch = off volume = off [Element Speaker CLFE] switch = off volume = off .include analog-output.conf.common ukui-media/configuration/kylin-paths/analog-input-lenveo-p90h.conf0000664000175000017500000000531415170054730024162 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; For devices where a 'Rear Mic' or 'Rear Mic Boost' element exists ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 82 description-key = analog-input [Jack Rear Mic] required-any = any [Jack Rear Mic - Input] required-any = any [Jack Rear Mic Phantom] required-any = any state.plugged = unknown state.unplugged = unknown [Jack Front Mic] state.plugged = no state.unplugged = unknown [Jack Mic] state.plugged = no state.unplugged = unknown [Element Capture] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Rear Mic Boost] required-any = any switch = select volume = merge override-map.1 = all override-map.2 = all-left,all-right [Option Rear Mic Boost:on] name = input-boost-on [Option Rear Mic Boost:off] name = input-boost-off [Element Rear Mic] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Rear Panel Mic in] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right ###适é…�Rear Stereo Mic 输入设备 [Element Rear Stereo Mic] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element Channel Mode] enumeration = select [Option Channel Mode:2ch] name = analog-input-microphone-rear required-any = any [Element Input Source] enumeration = select [Option Input Source:Rear Mic] name = analog-input-microphone-rear required-any = any [Element Capture Source] enumeration = select [Option Capture Source:Rear Mic] name = analog-input-microphone-rear required-any = any [Element Mic] switch = off volume = off [Element Internal Mic] switch = off volume = off [Element Front Mic] switch = off volume = off [Element Dock Mic] switch = off volume = off [Element Mic Boost] switch = off volume = off [Element Dock Mic Boost] switch = off volume = off [Element Internal Mic Boost] switch = off volume = off [Element Front Mic Boost] switch = off volume = off .include analog-input-mic.conf.common ukui-media/configuration/kylin-paths/iec958-stereo-output-inspur.conf0000664000175000017500000000171215170054730024677 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . [General] description-key = iec958-stereo-output [Element IEC958] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element PCM] required-any = any switch = mute volume = 999 override-map.1 = all override-map.2 = all-left,all-right ukui-media/configuration/kylin-paths/analog-input-front-mic-hikvision.conf0000664000175000017500000000202615170054730026010 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; For devices where a 'Mic' or 'Mic Boost' element exists ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 85 description-key = analog-input-microphone-front [Jack Mic - Input,1] required-any = any [Element Mic,1] required-any = any switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right ukui-media/configuration/kylin-paths/analog-output-headphones-hikvision.conf0000664000175000017500000000212515170054730026431 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; Path for mixers that have a 'Headphone' control ; ; See analog-output.conf.common for an explanation on the directives [General] priority = 99 description-key = analog-output-headphones [Properties] device.icon_name = audio-headphones [Jack Headphone - Output] required-any = any [Element PCM,1] switch = mute volume = merge override-map.1 = all override-map.2 = all-left,all-right [Element PCM] switch = off volume = off ukui-media/configuration/kylin-profiles/0000775000175000017500000000000015170054730017352 5ustar fengfengukui-media/configuration/kylin-profiles/alc4080-mh243a-usb-audio.conf0000664000175000017500000000323415170054730024160 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; ; ; See default.conf for an explanation on the directives used here. [General] auto-profiles = yes [Mapping analog-stereo-speaker] description = Analog Stereo Speaker device-strings = hw:%f,0,0 channel-map = left,right direction = output paths-output = analog-output-speaker [Mapping analog-stereo-headphone] description = Analog Stereo Headphones device-strings = hw:%f,1,0 channel-map = left,right direction = output paths-output = analog-output-headphones [Mapping analog-stereo-desktop-speaker] description = Analog Stereo Desktop Speaker device-strings = hw:%f,2,0 channel-map = left,right direction = output paths-output = Desktop-speakers [Mapping analog-mic] description = Analog Microphone device-strings = hw:%f,2,0 channel-map = left,right direction = input paths-input = analog-input-mic [Mapping analog-line-in] description = Analog Line-In device-strings = hw:%f,1,0 channel-map = left,right direction = input paths-input = analog-input-linein [DecibelFix Mic] db-values = 30:-37.25 63:0 ukui-media/configuration/kylin-profiles/UNIS-D3830-G3-audio.conf0000664000175000017500000000324215170054730023045 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; ; ; See default.conf for an explanation on the directives used here. [General] auto-profiles = yes [Mapping analog-stereo-speaker] description = Analog Stereo Speaker device-strings = hw:%f,0,0 channel-map = left,right direction = output paths-output = analog-output-speaker [Mapping analog-stereo-headphone] description = Analog Stereo Headphones device-strings = hw:%f,1,0 channel-map = left,right direction = output paths-output = analog-output-headphones #[Mapping analog-stereo-desktop-speaker] #description = Analog Stereo Desktop Speaker #device-strings = hw:%f,2,0 #channel-map = left,right #direction = output #paths-output = Desktop-speakers [Mapping analog-mic] description = Analog Microphone device-strings = hw:%f,2,0 channel-map = left,right direction = input paths-input = analog-input-mic [Mapping analog-line-in] description = Analog Line-In device-strings = hw:%f,1,0 channel-map = left,right direction = input paths-input = analog-input-linein [DecibelFix Mic] db-values = 30:-37.25 63:0 ukui-media/configuration/kylin-profiles/0bda-4f36-usb-audio.conf0000664000175000017500000000353015170054730023376 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . # vendor.id = 0bda product.id = 4f36 # 海康P514P # Speaker = device:0 # Headphone = device:1 # Front Mic = device:2 # Rear Mic = device:0 # Linein = device:1 # 声å�¡è¾“出control项å�ªæœ‰PCMå’ŒPCM1,还需æ�­é…�定制端å�£é…�置文件 # 声å�¡è¾“å…¥Jack事件与通用也ä¸�一致,还需æ�­é…�定制端å�£é…�置文件 [General] auto-profiles = yes [Mapping analog-stereo-headphone] description = Front Headphone paths-output = analog-output-headphones-hikvision device-strings = hw:%f,1 channel-map = left,right direction = output [Mapping analog-stereo-speaker] description = Rear Speaker paths-output = analog-output-speaker device-strings = hw:%f,0 channel-map = left,right direction = output [Mapping analog-front-mic] description = Front Microphone paths-input = analog-input-front-mic-hikvision device-strings = hw:%f,2 channel-map = left,right direction = input [Mapping analog-rear-mic] description = Rear Microphone paths-input = analog-input-rear-mic-hikvision device-strings = hw:%f,0 channel-map = left,right direction = input [Mapping analog-linein] description = Linein paths-input = analog-input-linein device-strings = hw:%f,1 channel-map = left,right direction = input ukui-media/configuration/kylin-profiles/pulse-ft-hda.conf0000664000175000017500000000234515170054730022516 0ustar fengfeng[General] auto-profiles = yes #[Mapping analog-stereo] #device-strings = hw:%f #channel-map = left,right #paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 #paths-input = analog-input-front-mic analog-input-rear-mic analog-input-alc269vc-internal-mic analog-input-dock-mic analog-input analog-input-alc269vc-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic #priority = 15 [Mapping stereo-fallback] device-strings = hw:%f fallback = yes channel-map = front-left,front-right paths-output = analog-output-lineout analog-output-speaker analog-output-headphones paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-mic analog-input-linein priority = 9 #[Mapping hdmi-stereo] #description = Digital Stereo (HDMI) #device-strings = hw:%f #paths-output = hdmi-output-0 #channel-map = left,right #priority = 7 #direction = output #[Mapping hdmi-stereo-extra1] #description = Digital Stereo (HDMI 2) #device-strings = hw:%f,1 #paths-output = hdmi-output-1 #channel-map = left,right #priority = 7 #direction = output ukui-media/configuration/kylin-profiles/0bda-4f39-usb-audio.conf0000664000175000017500000000246115170054730023403 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . # vendor.id = 0bda product.id = 4f39 # 三诺一体机 # Speaker = device:1 # Headphone = device:0 # Headphone Mic = device:0 [General] auto-profiles = yes [Mapping analog-stereo-headphone] description = Headphone paths-output = analog-output-headphones device-strings = hw:%f,0 channel-map = left,right direction = output [Mapping analog-stereo-speaker] description = Speaker paths-output = analog-output-speaker device-strings = hw:%f,1 channel-map = left,right direction = output [Mapping analog-stereo-mic] description = Headphone Microphone paths-input = analog-input-mic device-strings = hw:%f,0 channel-map = left,right direction = input ukui-media/configuration/kylin-profiles/fs-hygon-usb-audio.conf0000664000175000017500000000275215170054730023647 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; M-Audio FastTrack Pro ; ; This card has one duplex stereo channel called A and an additional ; stereo output channel called B. ; ; We knowingly only define a subset of the theoretically possible ; mapping combinations as profiles here. ; ; See default.conf for an explanation on the directives used here. [General] auto-profiles = yes [Mapping analog-stereo] device-strings = front:%f channel-map = left,right paths-output = analog-output paths-input = analog-input-mic priority = 15 [Mapping analog-mono] device-strings = hw:%f channel-map = mono #paths-output = analog-output paths-input = analog-input-mic priority = 15 [Mapping iec958-stereo] device-strings = iec958:%f channel-map = left,right paths-input = iec958-stereo-input #paths-output = iec958-stereo-output priority = 5 [DecibelFix PCM] db-values = 0:-65.25 100:0 ukui-media/configuration/kylin-profiles/mca500-usb-audio.conf0000664000175000017500000000262715170054730023103 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . [General] auto-profiles = yes [Mapping mono-fallback] device-strings = hw:%f fallback = yes channel-map = mono paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headset-mic priority = 1 [Mapping iec958-stereo] device-strings = iec958:%f channel-map = left,right paths-input = iec958-stereo-input paths-output = iec958-stereo-output priority = 5 [DecibelFix PCM] db-values = 0:-65.62 100:0 ukui-media/configuration/kylin-profiles/lenovo-p90h-usb-audio.conf0000664000175000017500000000436015170054730024172 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; ; ; See default.conf for an explanation on the directives used here. [General] auto-profiles = yes [Mapping analog-stereo-speaker-output] description = Analog Stereo Speaker device-strings = hw:%f,0,0 channel-map = left,right direction = output paths-output = analog-output-speaker [Mapping analog-stereo-headphone-output] description = Analog Stereo Headphones device-strings = hw:%f,1,0 channel-map = left,right direction = output paths-output = analog-output-headphones [Mapping analog-stereo-desktop-speaker] description = Analog Stereo Desktop Speaker device-strings = hw:%f,2,0 channel-map = left,right direction = output paths-output = Desktop-speakers #[Mapping analog-stereo-spdif-output] #description = Analog Stereo SPDIF #device-strings = hw:%f,2,0 #channel-map = left,right #direction = output #paths-output = iec958-stereo-output #[Mapping analog-stereo-spdif-input] #description = Analog Stereo SPDIF #device-strings = hw:%f,0,0 #channel-map = left,right #direction = input #paths-input = iec958-stereo-input [Mapping analog-stereo-rear-mic-input] #description = Analog Stereo Rear Input device-strings = hw:%f,2,0 channel-map = left,right direction = input paths-input = analog-input-lenveo-p90h #paths-input = analog-input-rear-mic [Mapping analog-stereo-line-input] description = Analog Stereo Line Input device-strings = hw:%f,1,0 channel-map = left,right direction = input paths-input = analog-input-linein [Mapping analog-stereo-mic-input] description = Analog Stereo Input device-strings = hw:%f,2,0 channel-map = left,right direction = input paths-input = analog-input-mic ukui-media/configuration/kylin-profiles/lenovo-m90h-usb-audio.conf0000664000175000017500000000350615170054730024170 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . ; ; ; See default.conf for an explanation on the directives used here. [General] auto-profiles = yes [Mapping analog-stereo-speaker-output] description = Analog Stereo Speaker device-strings = hw:%f,0,0 channel-map = left,right direction = output paths-output = analog-output-speaker [Mapping analog-stereo-headphone-output] description = Analog Stereo Headphones device-strings = hw:%f,1,0 channel-map = left,right direction = output paths-output = analog-output-headphones [Mapping analog-stereo-spdif-output] description = Analog Stereo SPDIF device-strings = hw:%f,2,0 channel-map = left,right direction = output paths-output = iec958-stereo-output [Mapping analog-stereo-spdif-input] description = Analog Stereo SPDIF device-strings = hw:%f,0,0 channel-map = left,right direction = input paths-input = iec958-stereo-input [Mapping analog-stereo-line-input] description = Analog Stereo Line Input device-strings = hw:%f,1,0 channel-map = left,right direction = input paths-input = analog-input-linein [Mapping analog-stereo-mic-input] description = Analog Stereo Input device-strings = hw:%f,2,0 channel-map = left,right direction = input paths-input = analog-input-mic ukui-media/configuration/kylin-profiles/0bda-4987-usb-audio.conf0000664000175000017500000000304115170054730023324 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . # vendor.id = 0bda product.id = 4987 # Front Mic = device:0 # Rear Mic = device:1 # Line in = device:2 # 输出默认模拟耳机ã€�数字输出端å�£ä¸€ç›´å­˜åœ¨ [General] auto-profiles = yes [Mapping analog-stereo-headphone] description = Headphone paths-output = analog-output-headphones device-strings = hw:%f,0 channel-map = left,right direction = output [Mapping mono-fallback-front-mic] description = Front Microphone paths-input = analog-input analog-input-front-mic device-strings = hw:%f,0 channel-map = mono direction = input [Mapping analog-stereo-rear-mic] description = Rear Microphone paths-input = analog-input analog-input-rear-mic device-strings = hw:%f,1 channel-map = left,right direction = input [Mapping analog-stereo-linein] description = Linein paths-input = analog-input analog-input-linein device-strings = hw:%f,2 channel-map = left,right direction = input ukui-media/configuration/kylin-profiles/pulse-x100-hdmi.conf0000664000175000017500000001252015170054730022756 0ustar fengfeng# This file is part of PulseAudio. ; [General] ; auto-profiles = no | yes # Instead of defining all profiles manually, autogenerate ; # them by combining every input mapping with every output mapping. ; ; [Mapping id] ; device-strings = ... # ALSA device string. %f will be replaced by the card identifier. ; channel-map = ... # Channel mapping to use for this device ; description = ... ; paths-input = ... # A list of mixer paths to use. Every path in this list will be probed. ; # If multiple are found to be working they will be available as device ports ; paths-output = ... ; element-input = ... # Instead of configuring a full mixer path simply configure a single ; # mixer element for volume/mute handling ; element-output = ... ; priority = ... ; direction = any | input | output # Only useful for? ; ; exact-channels = yes | no # If no, and the exact number of channels is not supported, ; # allow device to be opened with another channel count ; fallback = no | yes # This mapping will only be considered if all non-fallback mappings fail ; [Profile id] ; input-mappings = ... # Lists mappings for sources on this profile, those mapping must be ; # defined in this file too ; output-mappings = ... # Lists mappings for sinks on this profile, those mappings must be ; # defined in this file too ; description = ... ; priority = ... # Numeric value to deduce priority for this profile ; skip-probe = no | yes # Skip probing for availability? If this is yes then this profile ; # will be assumed as working without probing. Makes initialization ; # a bit faster but only works if the card is really known well. ; ; fallback = no | yes # This profile will only be considered if all non-fallback profiles fail ; [DecibelFix element] # Decibel fixes can be used to work around missing or incorrect dB ; # information from alsa. A decibel fix is a table that maps volume steps ; # to decibel values for one volume element. The "element" part in the ; # section title is the name of the volume element. ; # ; # NOTE: This feature is meant just as a help for figuring out the correct ; # decibel values. PulseAudio is not the correct place to maintain the ; # decibel mappings! ; # ; # If you need this feature, then you should make sure that when you have ; # the correct values figured out, the alsa driver developers get informed ; # too, so that they can fix the driver. ; ; db-values = ... # The option value consists of pairs of step numbers and decibel values. ; # The pairs are separated with whitespace, and steps are separated from ; # the corresponding decibel values with a colon. The values must be in an ; # increasing order. Here's an example of a valid string: ; # ; # "0:-40.50 1:-38.70 3:-33.00 11:0" ; # ; # The lowest step imposes a lower limit for hardware volume and the ; # highest step correspondingly imposes a higher limit. That means that ; # that the mixer will never be set outside those values - the rest of the ; # volume scale is done using software volume. ; # ; # As can be seen in the example, you don't need to specify a dB value for ; # each step. The dB values for skipped steps will be linearly interpolated ; # using the nearest steps that are given. [General] auto-profiles = yes [Mapping hdmi-stereo] description = Digital Stereo (HDMI) device-strings = hw:%f paths-output = hdmi-output-0 channel-map = left,right priority = 9 direction = output [Mapping hdmi-stereo-extra1] description = Digital Stereo (HDMI 2) device-strings = hw:%f,1 paths-output = hdmi-output-1 channel-map = left,right priority = 7 direction = output [Mapping hdmi-stereo-extra2] description = Digital Stereo (HDMI 3) device-strings = hw:%f,2 paths-output = hdmi-output-2 channel-map = left,right priority = 5 direction = output ukui-media/configuration/kylin-profiles/kylin-inspur-usb-audio.conf0000664000175000017500000000155715170054730024563 0ustar fengfeng# This file is part of PulseAudio. # # PulseAudio is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # PulseAudio is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with PulseAudio; if not, see . [General] auto-profiles = yes [Mapping iec958-stereo] device-strings = iec958:%f channel-map = left,right paths-input = iec958-stereo-input paths-output = iec958-stereo-output-inspur priority = 5 ukui-media/configuration/kylin-profiles/pulse-X100-hdmi.conf0000664000175000017500000001252015170054730022716 0ustar fengfeng# This file is part of PulseAudio. ; [General] ; auto-profiles = no | yes # Instead of defining all profiles manually, autogenerate ; # them by combining every input mapping with every output mapping. ; ; [Mapping id] ; device-strings = ... # ALSA device string. %f will be replaced by the card identifier. ; channel-map = ... # Channel mapping to use for this device ; description = ... ; paths-input = ... # A list of mixer paths to use. Every path in this list will be probed. ; # If multiple are found to be working they will be available as device ports ; paths-output = ... ; element-input = ... # Instead of configuring a full mixer path simply configure a single ; # mixer element for volume/mute handling ; element-output = ... ; priority = ... ; direction = any | input | output # Only useful for? ; ; exact-channels = yes | no # If no, and the exact number of channels is not supported, ; # allow device to be opened with another channel count ; fallback = no | yes # This mapping will only be considered if all non-fallback mappings fail ; [Profile id] ; input-mappings = ... # Lists mappings for sources on this profile, those mapping must be ; # defined in this file too ; output-mappings = ... # Lists mappings for sinks on this profile, those mappings must be ; # defined in this file too ; description = ... ; priority = ... # Numeric value to deduce priority for this profile ; skip-probe = no | yes # Skip probing for availability? If this is yes then this profile ; # will be assumed as working without probing. Makes initialization ; # a bit faster but only works if the card is really known well. ; ; fallback = no | yes # This profile will only be considered if all non-fallback profiles fail ; [DecibelFix element] # Decibel fixes can be used to work around missing or incorrect dB ; # information from alsa. A decibel fix is a table that maps volume steps ; # to decibel values for one volume element. The "element" part in the ; # section title is the name of the volume element. ; # ; # NOTE: This feature is meant just as a help for figuring out the correct ; # decibel values. PulseAudio is not the correct place to maintain the ; # decibel mappings! ; # ; # If you need this feature, then you should make sure that when you have ; # the correct values figured out, the alsa driver developers get informed ; # too, so that they can fix the driver. ; ; db-values = ... # The option value consists of pairs of step numbers and decibel values. ; # The pairs are separated with whitespace, and steps are separated from ; # the corresponding decibel values with a colon. The values must be in an ; # increasing order. Here's an example of a valid string: ; # ; # "0:-40.50 1:-38.70 3:-33.00 11:0" ; # ; # The lowest step imposes a lower limit for hardware volume and the ; # highest step correspondingly imposes a higher limit. That means that ; # that the mixer will never be set outside those values - the rest of the ; # volume scale is done using software volume. ; # ; # As can be seen in the example, you don't need to specify a dB value for ; # each step. The dB values for skipped steps will be linearly interpolated ; # using the nearest steps that are given. [General] auto-profiles = yes [Mapping hdmi-stereo] description = Digital Stereo (HDMI) device-strings = hw:%f paths-output = hdmi-output-0 channel-map = left,right priority = 9 direction = output [Mapping hdmi-stereo-extra1] description = Digital Stereo (HDMI 2) device-strings = hw:%f,1 paths-output = hdmi-output-1 channel-map = left,right priority = 7 direction = output [Mapping hdmi-stereo-extra2] description = Digital Stereo (HDMI 3) device-strings = hw:%f,2 paths-output = hdmi-output-2 channel-map = left,right priority = 5 direction = output ukui-media/NEWS0000664000175000017500000000005115170052044012223 0ustar fengfeng### ukui-media 1.1.0 Fork mate-media ukui-media/data/0000775000175000017500000000000015170054730012445 5ustar fengfengukui-media/data/ukui-media-control-mute-led.service0000664000175000017500000000027715170052044021253 0ustar fengfeng[Unit] Description=Mate media control leds daemon After=lightdm.service [Service] Restart=always RestartSec=2 ExecStart=/usr/bin/ukui-media-control-led [Install] WantedBy=multi-user.target ukui-media/data/Makefile.am0000664000175000017500000000161215170052044014475 0ustar fengfengNULL = SUBDIRS = \ icons \ $(NULL) @INTLTOOL_DESKTOP_RULE@ autostartdir = $(sysconfdir)/xdg/autostart autostart_in_files = ukui-volume-control-applet.desktop.in autostart_DATA = $(autostart_in_files:.desktop.in=.desktop) appsdir = $(datadir)/applications apps_in_files = ukui-volume-control.desktop.in apps_DATA = $(apps_in_files:.desktop.in=.desktop) gsettingsschema_in_files = org.ukui.media.gschema.xml.in gsettings_SCHEMAS = $(gsettingsschema_in_files:.xml.in=.xml) @GSETTINGS_RULES@ @INTLTOOL_XML_RULE@ EXTRA_DIST = \ $(autostart_in_files) \ ukui-volume-control.desktop.in.in \ $(gsettingsschema_in_files) \ $(NULL) CLEANFILES = \ ukui-volume-control.desktop \ $(gsettings_SCHEMAS) \ $(NULL) DISTCLEANFILES = \ ukui-volume-control-applet.desktop \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(gsettings_SCHEMAS:.xml=.valid) -include $(top_srcdir)/git.mk ukui-media/data/images/0000775000175000017500000000000015170052044013706 5ustar fengfengukui-media/data/images/blank.png0000664000175000017500000000016315170052044015503 0ustar fengfeng‰PNG  IHDRKm)ÜIDAT×cüÿÿ?6ÀÄ€ N VÔ aëh~tEXtSoftwaregnome-screenshotï¿>IEND®B`‚ukui-media/data/images/audio-volume-high.png0000664000175000017500000000037715170052044017746 0ustar fengfeng‰PNG  IHDRóÿa pHYs  ÒÝ~ü±IDAT8Ë­“[ Ã0 E¯† a¡ (ƒB…1(„B„08ûXªE®“©j-åÃq|tã‡9'5óM|Í‹,ÀµüÌÜ ¯�:8–D« ±ò‡YV@m©’º&ÄIF @PC.ŽôlŠ˜€¹ÀH�Àl¿Ü$»{þE­xHzVþ(éUùƒ$í)"åßn{mœLlÓÆƒô6íÛ Òi£|Ê2í^çé«ã�©¤|IEND®B`‚ukui-media/data/images/audio-input-microphone-medium.png0000664000175000017500000000125715170052044022276 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<QIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ä}:”½;<ð8àpMUƒ”¤ÞG¾ÿøÉß6€…‘™è‰Ù ¾�¸LPV”g8sþƒ¢‚<$%ÄárLw7—ÞæçåòâçŸl?U› [ õ´Ž;Å §£ÁððÑc°8È‹L Þ—¿}úñAH„o¿ p 68ØÙÎ_º Ö¼eûi)°80Y™øøx—Šów ®AÖs�ž¶Ã�Ã',L�ž=“�b’R’\¤¡©âÄËÏuGHXP¦9,"hãB›“ƒ�áÒÕ –æÆ »÷ìe…)[Àv ýÏþóÿÿì0™U+ÖÀÈ×oßt4ÕŽŸ<Ë`mmÍððñSD >»÷<îúõ{ûþ¾£óîíÇkØÂÿ §Î^`�–g8zô(ƒ¬´$€ϟ>G¾ù¾âÃG ýöÝ:,ú]JÊkT•4TÜ]ìfΚ Ÿ 6àþÖ v^.ùwo?D}zõm.šæ5À$»H»6µt0Lœ2“aË6pú™½dÁ¬4 ½ŽEÙ¯Sîïßÿ˜²îm©x‰fÀm``Ãc$Ö‘c(H]fTñì”ùýÿ¯Þƒí•Û°ùh@�Jb$á'@<hp#1¹jP�ªâv Æ*x ’¨*¡|00 õÀÝR²LIEND®B`‚ukui-media/data/images/audio-volume-muted.png0000664000175000017500000000036315170052044020140 0ustar fengfeng‰PNG  IHDRóÿa pHYs  ÒÝ~ü¥IDAT8Ë�“Á Ã0EUè©#x¤ÐC†É ½às6 ‡ÄªEmçK\@<}0ÆÌèÄ2ÈÿE/ù²]—Ù~š<�Æi­êì§wv TD· ˜ŠÈVDò ž�ÏÈ®™ ‹‚)ä¶®�k>ô ms»Ä!ÀAÞÞÑ)ÀY+dúÛkÏAxH~f¿“ð”}so±ÃϤ�zͲ}g…�±Bú(¢„v™·FbIEND®B`‚ukui-media/data/images/images.qrc0000664000175000017500000000107015170052044015660 0ustar fengfeng blank.png emblem-unreadable.png audio-volume-muted.png audio-volume-medium.png audio-volume-low.png audio-volume-high.png application-audio.png audio-input-microphone-muted.png audio-input-microphone-medium.png audio-input-microphone-low.png audio-input-microphone-high.png ukui-media/data/images/audio-input-microphone-high.png0000664000175000017500000000152515170052044021733 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<÷IDATxÚbüÿÿ?ƒ¢wGÛ–‡Û*Ê�\ Ä&¦Û©ÃHB¶‹çÏ<ÂÈÈÈÀ2@! A@Á³ýРnÇ$¤Ùñÿ›·ïþÿùóçÿÛwïÿñ�Ød“¼O‡Ã/v n>7._ƒè)îh8\SUÆ %)Á°çÀ†ï?~2„……€Äw� `adfºyö—ïŸ\�Äñððô]ƈl‚²¢<Ùó—äví=Ä )!—cº»¹ô6?/—§?ÿä¿¿ÜòØ£x•² [ õ´Ž;Å §£ÁððÑc°8È‹L Þ—¿}úñAH„o¿ p 77ç n^žd8ØÙÎ_º Ö¼eûi)°80Y™øøx—Šów ®áàå8ÊËÃe Rs�ž¶Ã�Ã',L�ž=Á•�b’R’\¤¡©âÄËÏuGHXP…‡_è/—XXDÐÆ… …œì —®Þ`°47fؽg/ƒ¸˜(Ìq ˜ÀNâ¯ÿÙþÿÿ�ýû§·€\–U+ÖÀÓÃ×oßt4ÕŽŸ<Ë`mmÍððñSD >»÷<îúõ{ûþ¾£óîíÇkÿ™å¿|þþ9 €ñÏpêìiIq†£G�2ÈJK" øüésäû—ï+>|Òoß­ûññ‡Ñç/_/ éw))¯aPUVdÐPU`pw±g˜9k.H|6Ø€û[+ Øy¹äß½ýõéÕ·¹_¿~‹ýòåë2¨æ5À$»H»6µt0Lœ2“aË6pú™½dÁ¬4 ½ŽEÙ¯Sîïßÿ˜²ÄÄÅ´€¶«²J)ì„p˜Àð˜‰5DúÆ@>�ºÌ¨âÙ)óûÿ_=f^¦£\L\§YY Ï/ÏÜ S4 H%± ’·žñ\ Á Œ Ô¤êÕÈ÷‡‘}ÐWïn©ÈfÀ€µ©J nj¬‚"ˆøÍÄ^4èÒ=.å<šA Ê€új-Õd_J£IEND®B`‚ukui-media/data/images/emblem-unreadable.png0000664000175000017500000000021115170052044017747 0ustar fengfeng‰PNG  IHDRľ‹ pHYs  ÒÝ~ü;IDATÓcüÿÿ?>ÀÄÀÀÀÀ¡Œ© &öÿÿWú��͈bL׊»Œ¨Và„¬À”DSÄHÈ› çS‡¥š„IEND®B`‚ukui-media/data/images/audio-input-microphone-low.png0000664000175000017500000000104415170052044021611 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ÆIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ƒÃ5Ue R’ {aøþã'CXXH|±0(+Ê3œ9‰AQAža×ÞC ’âp9¢ Ùj¨§ÍpäØ)= †‡�ƒÅA^dRðêÕ%ƒÏv6†ó—®‚5oÙ¾‡AFZ , DV&>>Þ%‚âüØ4††ÇÁ\ §­Ápàð  S#†gÏ_À䣘¤”$ihª8¡k‹ZÀ¸Äæä`g¸tõƒ¥¹1Ãî={ÄÅDaʀÀ‹í«V¬�'�¯ß¾3èhª1?y–ÁÚÚšáá㧈@|vïyÜõë÷öá `ü3œ:{�AZRœáèÑ£ ²Ò’>úùþåû <ú]JÊkT•4TÜ]ìfΚ Ÿ v=¾¤ ‡Õ@¯„“² �»Ijö’³Ò€�¸–…@¸ 4¤hÈH¬1"ÇP>�ºÌH(3 hRÉ@ŒœVžñ\ Á ŒÄäF¨Am@ªˆÛ�«`âD€¤à†Z¢Àõb¾<˜IEND®B`‚ukui-media/data/images/audio-input-microphone-muted.png0000664000175000017500000000101015170052044022117 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ƒÃ5Ue R’ {aøþã'CXXH|±0(+Ê3œ9‰AQAža×ÞC ’âp9d…µ´¶CÄ Yl2ËÌd0ìícXµn ƒžŽÃÃG�Ár /¢¸¤YàÚ5ûßÑ£ ç/]kÞ²}ƒŒ´Xˆ¬8½3ô´5>Á`ajÄðìù °Xhxp†´´°ò/]½Á`in̰{Ï^q1Q˜ô&B6Ãø:šj ÇOže°¶¶fxøø)\§Ð]rêìiIq†£Àð�•–Ä Àtµ ¨Ñ Ý�kB ªÊŠ …ß3°2Û3Ìœ5$<ˆSñ%å°ˆ�Õ«V¬ &e w7’Ôì% f¥q- �4thHÐ� �Xc„K5ç©ËŒ„2Ѐ • Ä2HÂO€x.ÐàFbr#Ô 6 U Äí@�Uc‡f¨„òÁ À÷µ¶r‹‰-»IEND®B`‚ukui-media/data/images/audio-volume-low.png0000664000175000017500000000046315170052044017624 0ustar fengfeng‰PNG  IHDRóÿa pHYs  ÒÝ~üåIDAT8Ë­“A 1 EŸŽ¸aÀ… ¸t%xo 7QoàôžHÜ ‚ +ù.L1–Πà‡B“´¯iÚ ‰ÄØ–øóØ—Z´ÑK©ØTÒXR³ °Ð[)@Ë“ñÁ™mŒ3˜Hê9;3È8¼ÂÝ= g�A”ÉTR^“$ Æ§b_ ' 0ßhÖ)—€•ÍoÀÈ]ü´«;`éì+Ðvö  ð•ªs`í쎥”4*q»À!^ë®`¶ PYõ/˜EÃ�4öQšá¤£{¾ÌžðýÊi¦ŸÛù WK°„Î#IEND®B`‚ukui-media/data/images/audio-volume-medium.png0000664000175000017500000000042415170052044020300 0ustar fengfeng‰PNG  IHDRóÿa pHYs  ÒÝ~üÆIDAT8Ë­“Á Â0 E¿¨Ä©§.À‰CO•²#t2JØ #d6aFèŸCaÜ$©_ªÛéÓOì€$2_,ä;›Ëmš¸(Ws${’ÇÀó£à$€!Atq”­ƒ™dPq#�>´ÒÙ5 $'Žd‡‚]›âUîLòr@Ydý0ðª>hk¢©]MÜ’t5›TÜÜU<x¨¸Yºý)­þºÄ-mœLmÕÆ_ƒô2í[ Òn£¼Ëcúû9¿�¢ƒá+VÀIEND®B`‚ukui-media/data/images/application-audio.png0000664000175000017500000000061015170052044020013 0ustar fengfeng‰PNG  IHDRóÿa pHYs  ÒÝ~ü:IDAT8Ë�’½NAF�‰ ¡³¢411Jeb³�¶>‡�?•D}C!A„Ž’ÁÆFcµQÔ¬ dXvv®ÅºËÏΦºùæÞsÏlvMDØÛ¼é 9�Îû�Êw^NwÖã°XÈyG;Î*€ê“ÛŽë @l3{ÊgIýpÝJzS“žG€úU+Ófj ÚÀáydQ«4“ÞÀˆ -¸»|dÞT2 Bc}Âbži0 £›ãJy¦yš/50mR`šÛ>öœ�¯£›Å‡Äùrþÿ¦Û“êÒÉ‹A(ÂXëÀ¶³•Ôj¬é¸½’Å@ð“±1RV¾æ¾ÞWîÀs, 2ÚÀب5ž•;ðö{¯Ý@a„VÀHÔ›éá9ÀÐòo_ö ðÑè—>¿�Åa€?Å"¬ä¸4IEND®B`‚ukui-media/data/org.ukui.media.sound.gschema.xml0000664000175000017500000000077615170052044020553 0ustar fengfeng '' Filename Prompt sound file name. '' Name Description associated with a custom keybinding. ukui-media/data/org.ukui.sound.gschema.xml0000664000175000017500000000254115170052044017465 0ustar fengfeng '' Default mixer device The default mixer device used by the multimedia key bindings. [] Default mixer tracks The default mixer tracks used by the multimedia key bindings. false Enable ESD Enable sound server startup. false Sounds for events Whether to play sounds on user events. 'freedesktop' Sound theme name The XDG sound theme to use for event sounds. false Input feedback sounds Whether to play sounds on input events. ukui-media/data/ukui-volume-control.desktop.in.in0000664000175000017500000000072715170052044021014 0ustar fengfeng[Desktop Entry] _Name=Sound _Comment=Change sound volume and sound events Exec=ukui-volume-control Icon=multimedia-volume-control Terminal=false Type=Application StartupNotify=true Categories=AudioVideo;Mixer;Settings;HardwareSettings; Keywords=UKUI;volume;control;mixer;settings;sound;events; OnlyShowIn=UKUI; X-UKUI-Bugzilla-Bugzilla=UKUI X-UKUI-Bugzilla-Product=ukui-media X-UKUI-Bugzilla-Component=ukui-volume-control X-UKUI-Bugzilla-Version=@VERSION@ NoDisplay=true ukui-media/data/icons/0000775000175000017500000000000015170052044013554 5ustar fengfengukui-media/data/icons/Makefile.am0000664000175000017500000000100015170052044015577 0ustar fengfengNULL = SUBDIRS = \ scalable \ 16x16 \ 22x22 \ 24x24 \ 32x32 \ $(NULL) gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/ukui install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi -include $(top_srcdir)/git.mk ukui-media/data/icons/32x32/0000775000175000017500000000000015170052044014335 5ustar fengfengukui-media/data/icons/32x32/Makefile.am0000664000175000017500000000006115170052044016366 0ustar fengfengSUBDIRS = status -include $(top_srcdir)/git.mk ukui-media/data/icons/32x32/status/0000775000175000017500000000000015170052044015660 5ustar fengfengukui-media/data/icons/32x32/status/Makefile.am0000664000175000017500000000057015170052044017716 0ustar fengfengNULL = themedir = $(pkgdatadir)/icons/hicolor size = 32x32 context = status iconsdir = $(themedir)/$(size)/$(context) icons_DATA = \ audio-input-microphone-high.png \ audio-input-microphone-low.png \ audio-input-microphone-medium.png \ audio-input-microphone-muted.png \ $(NULL) EXTRA_DIST = \ $(icons_DATA) \ $(NULL) -include $(top_srcdir)/git.mk ukui-media/data/icons/32x32/status/audio-input-microphone-medium.png0000664000175000017500000000367515170052044024256 0ustar fengfeng‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe<_IDATxÚÄWkl“×~¿‹ïv.&Ž“ qmçFJç2Z~D$YÉ&&[Yµ²?“6­kU4•M�Z„`ŒIÓ~LTH 0mÒªNc´�ÐÒÅ©í�†ÆvÁ Ihb; â»ý]öžo¥¢$NuÒ>éø;þ¾ãsžó¾ÏyÞÇ”(Šðÿ¼ØÕ ¦(*í»Þ‹=ÛY†ý-ÏsO‘MQ@ ‹ ¾ùlË÷ßK÷ióäãÑÖÕ%Ò�?{ØÒ.þáû‡ìŽ+‘H4"ò/r<'g‚âÅË"çzϾµúñ‡‘ ןúå)ךL£ráBÏ3¬LþÒwêŸQ«”*p9]…€ÆhÙ6Õ«öËdLºßÓ‹ã̇d¢|[¦’|òwe•Z’ž��hhh·Û±xîÝ¿ùyºp8ø)”””€×ëE° ÌÌ‘ˆ1ø×Ù³Òo'–䧤ŸÆóï"ýâˆÅ„Çb|Iýø"ÀÚµE Ñj†ÂѾ—+QUµQ" ÉT‚pCñ†bP)•022’\‡û5jí/ Áï÷“9./†P5”Èœ–ú¢¸ Á ,Yz]?oÛö=;o�O¶ ]ÿÔ¾a}qAuu53�òKÒ‘$¼pÆ‚þÙªò�?{¢ÈøaC}#ô]ê#»8·EÑÎc{7NJhêiC_€(ü1ð¿èñxÔÏÿè…òsçßw�Ž*ºßëù÷¶+W/˜JÌÊd")ŽÞIÆñ@©Åz¥¸Ä4ؼµEáõz`vvfVä©«+õx™ÅRxúŽí­nJçŽ9Ô.Râi«µTݲõ»03„›¾àñ¥DÄû÷ï z½ž±X,2«Å yk Ðwù#»5'µãõý¯ÛÓØß}ÝÂSb˱kþ¼œ!9|øÍ* è“ ËÖXÌV$ž Œ�›«—t!Z€@0ããcpklÉ+|„¡ýiggç—_›‘¥ì;9ÔŒ2|ó?Ùtg%GÔÕÕE+•ìv|±#²]кlßAr·oO»3ŽÓ"uêµ×ô-rC;™¶el�›æ­ƒ] \s‰é>!îûõ+Ïã36ùrs®Ê¦‘r ‘>//¯r>ôÀ‡PB0œ«mmmº1<|c#ÇábÂÒ¤^…+~4í/´²ý’Œ•ÿX®� EJ®�«Zš[�× CƒŸ%°ñr¥L†Çî÷+üéÝÓïúÿ'vínÿMVVö,¹L¾!OF3´¤�>ŸêêëÀãöÂ�éi°ZÌ@|"‰ÈÔäTïÓ±HrÇ™3g>OkJWºvvŸŸŸO`í!Š¿êLLLÜýâËÉ—{{ÏÇ�.DA”\Ù�攸 ©=rÖ  #’1’ºá»9õ‰Ýq§K­:¤j÷žëý;ëÞÜÜÝã«U�•O¡Õê(²ÓT*)� �{ç0þi?çöxx¼ÿósïÍ}XÎg¿µà¥lݶµ-;+gwNvöV¥JµF­Öpz,G�Ç´c|(ò-,,œñÏÿvÍ~�˜]þQ9þ6¾!ǘ{UYYY!ÊŽŠ£)1|/<‡ÎøîW¡Òý9ý�®/ìj­ß;IEND®B`‚ukui-media/data/icons/32x32/status/audio-input-microphone-high.png0000664000175000017500000000420615170052044023704 0ustar fengfeng‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe<(IDATxÚ´V{PT×ÿî½û~ðX�…( vy(X5š)ƒ¤[«b›ŽæŸÎ4S'ƒeb[Hâ8MgÚþ‘IÆ6¨™v¦™tjLTlµ.Ý]$ »( €¯À.  »Ë²»÷ÞÓï\…`pA&Ó3sîýî½çžó;ß÷;ß÷c!ð¸Vs´9)$*õÚfí…ÿc“Eû0TŽêÜ�ßzëÜͺºRž¾c&êD�gN¬—q²ß ¿’nЦƒy»²ü‡ŸGûGÚ<½Ììõõ„�²_ûKë–š�Úò¦ž£.þå{mö �ÀD€¢@x�'Þ!/9sþtàdãñwæÀ~ûe`YûÊ_q.¢6Ë’A7ÌåÂÓ§O¬–É;¾W´Z£V©Áép‚ßç½e}¦Hƒ°_¡c¢ý? 0‚ONë¨yp»µ 8®Õ÷a!ünNÖr OKK ƒËå†àä$Ü…¤„d½rbÿ8°ÝÚ‡1X?½(/×v›¢MðOXãã àt:¡¨¸Hº[­VputÀøø}HLH„ðdÐúÄh¸qéá‡[,Jà2Ï+£M01Pr, ………àp8 ??lÍ6ÈÉÉäÈd2'Uóx½¡uë–O>á¤(ˆp^.2…’MXz!7:€ ð¼€;wH;·Ù.Bvv8ð9`(‚Ò˜y0„Ñ/�x:�Ú<á\„aWIx¾ ¿eF0>,-N ˜›› »L&“ ‚Ž™?„±Âl¥æ€¾û:Þ2¨}+¾oáæ‡Ñ-`-´J°dZ ­­ "‘„B¡'sû~'²ÎLíTW Ù”�è¸Çý¼ù§›7ÒÉyž‡‚‚|‰ÔHÀÌÌLE&ñ4Ð1ÕÕÕ‹çÌ„4Û½ÞÐÎΗ:÷ØK22Ìáþþ>¡¹Ù®¦“‡Â!è°u@~Aœkj‚ŒŒ Œ>F‡ JÖV¬½S²ª0ø ª¼ºv×nfv*~$1=>ï²ÈøÊŠ*E(4 §NŸ�xœœ.°|ùr°Ûí`±XÀî°CZZx‡<à÷Iß zÓf5�õÃCÌA퇭±˜½îSûái�ò?ÖM~jœ @?òqøüAtq†††pq‡äöÖÖ¯ ==:;;,C#^$bþuü¸ôåÄc9À«Øgñü;©�0›ðXôQ{8]3 ì�“à¦Çã�Å‹—€V§ÝãóO4µ8�¡ÜÜM¦tä€ Ò–¥�Z¥‚žžžð¸ß߬Õè^NII�ÁÁA:ÇùYE&Ÿ!ÜQÉ&äÓBm(ŸÆ¢1]’у'ZZ�¿ªZ÷ðz=›nôÝ®jkÿʶliZr^^7†é—†#Lyáº,x¼ƒÃ¹Ù+~ùÔã—ÅE%Ðt®‰îâä, Ã:Þ۾ⶀež•s¬(–@ÖǶoò…øG�gp›ÛíÖ¼ð³³OžúÂuíš²áóŸ­»pñ\²)=C…ɵë=áÉФ'Ól¹�–nj][V®ììtÃððÐ0˜CSÕ•ùv™¥5OCSÌÍceuuuâ —ßgþà»(L¦ôÀþý{7†µX25åeÏÃаºº¯BwOw„ˆ@FG�3›Ír‹Ù ‹¡éüYèí½>"³áÍ]oÚ¢ØÕÐnRþÞ¶ü÷éóΆö‹Øž÷•3ɾ}oçÃæd²|s†‰g‚dc2ÄǤ¼àó�ƒÇë�¾¾^¸Þ{ É+žE×¾T[[{kZŒë<Ö±žQ1¯‹¢pÙT¿ ò›÷7>øÝ|ï(›'7;æ]üèÁ]N×Éh4•EI”Q�C“!ù؉#ÑC�Þºz±)è ú�áH¬«ÇãIVT¬TXTTˆðBÁŠàXùÙH¤[¯3<“——�@€Ä81‡’DUR²jß‚ £§×ótóº  n¼02ÖÜ÷ËÏÎË rW­Z¥šAù%åà /¼¿ŠÁP`ª¢tåS·å[�ÖÕÖC×ñ.²‹CsPí~c �¥÷ƒÁÀã>ŸO·åÑm¥‡ô iÛ¿ëøvÝÉSÇs‹ m,Ÿäå¡óƒ|"™Û' ‹zÖ6jý~LMMNÉ"µ÷Zw¥Ò1$×üÀž=»ZdJÞçpë×Þ“S!87pR²ò•+—%“ɤ²Ûíj‡Ýæ%è:ñ ŸŸ–€Úðê˯:€\»w¿Yý‰Ša*í6¯r­¹��mRt!ž…`(##Ãp~xÉ+ýýd[[Ûo›‘Š׎;h–eÖロ˜‘»Ñ-{hýR{¸pa”Ø�üø‘–©O_ye{×7tí�E:"Â#-ý[;w|ßsÚ#ܾW~ñ¥ç·àoÍ�b2‹ìÆäÓØˆLf³¹|&|Õ‰„QÂ0š®jjZs¶¿ÿìfNÀŤ&õ-– e[K#ÐϪÍc­ÚªÕjS­†klhTùü^èëý5‰ÍHÔ°j5»wFúà«}_þ›6·¼–‘‘¹[®*ÇbVÓ*ZQÈ��¨©­Ÿ×¿OL€ÃnâIFÆÇÆ£xŸˆGù û÷ï?s˦tcëÃ;ñxmojl`—-»MMa ³+I"Jn "‘?û®Õ ¬–tÈÀ¢"¢CÒ—•–Úô®{Móšü[²d«W¯^nÍÉy¾¾¾žåÑ„�ƤÓé€ã8Àã¦%Ùà<Õ� ‚« �F™G:¦Þ` JJK 9¦w®­� õzÖa͵b@P¿§Âô“Ò‚Y–Ÿ�ò@ã3H¢„¦Dø›ñÄ def©TŒš8/5ŽdZöþ>>‘âX=¦U j5H>% ä»A¯< �a4‚šQ+@(šR’aÄßgff’ØA;HûI»£££—.þ6ö\gçá8a4f‚,ÉŠë!»Ñœ¤ŒëÎ:!¢ÅbE2FSgÎ�ÿätíÆp©´K@ºvç¡Î/�X—§§/}hw8LØù´ƒ‘";M¥x䨋¸¸€%L¯Ï'âýë3þs/b;ŸZ´àÅ6­[Ûœ™‘µ9+3s-ËqKt:½€©Çv$Q±D\…vL ‡Ã³³³ûÓ¡ÏO;OŸ'žæz9^T/¸^ޱö\IIIÊ'Д¹™Fg|é¯TKóýsú‡Ù³·íIEND®B`‚ukui-media/data/icons/32x32/status/audio-input-microphone-muted.png0000664000175000017500000000372515170052044024110 0ustar fengfeng‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe<wIDATxÚÄW{lSç?÷úúqmç�qb§„6ImçE6ò^Õ E$¡I'&– ©ë�V ©j«jm›„Z…utšúǤªc-cR¥NPÚÐ@‹C^$!4v€8/il'‚ß¾¾��ïB¢ŒÄH!�öIŸïã{ýî9¿sÎÏ´$Iðÿì ¬¢Q•p¬íÛÖ팂ù£ ð?"S@ áï¾PûÓ/­!óV…6ááß|ÕÜÝÛ …C’ /ð’oÆ'}{álèLÛé÷€†5¶³g[Ÿg”ª×~Rþ¼–Õ°àès@0­Uúãr-Â~�ÌI´~Í8�ûSA^¡ž¸§¿¿***ÀétA$…»÷îAºÑœŒ†�þÏ„‚áÒu©p8P^Q._KKKÁ94~ÿ}H3¦�”&ZÏü“¢ š>ÉK’Vð3ÒNRÐô/Š;ðñê£ãápH�ãPVV}}}P\\ �]�PPPÓÞi@$Õ$ ¢éÏJª«Ÿ5åæÊ‡a%Š×í~ör{ûg Š›–ˆÏ 08ØeååÐÙÑùùyÐÕÕ†õtEDž“@\ Ì6›Ç @=Jwü:ó–-?¾`¥ Âá0ÄyN6;!`QQtvvBNNܺ}B¡�<'!$9¼ÄwJW¥Ú·Oæ…jï^:ùâEf!þ%Ù+à8}ߥe¥2l¹6´È ÄãqˆÅb�°x'Šýøc`›šhí(؃é臊ä}¢¶ó;Éæ<ÏCII±Ìb�!$`.ºT${b4�9»víÚ°¢ –>La¡¤¬¯§âçÎIÜñãËN?ú~³d±X¹ÉÉ ¡§§—%›Ç¸ uAqI ´Ûí`±Xd0IÉz$`DPSW3Uù\™LÌ6½}ˆZ†ê={@¹mok“”55”zÿþeaJ#'^¨kP½òò~Ö|à_Ò ¡··l6\¹r²²²dËüy<Íh²æ7¿ÞÏ®ìܘ=p"--bøÍ7…Hs³¨~õUš¼_Ú$j,…OŽƒ@0‚&ŽÁÌÌ Þ'›}`à2dggÃðð0.UÀÌœ‰�“§OËk'þ %GÚâßß²eÑì܉¢¿¢‚_E2O¾¸éõzaÆLÐéuGÁ°½ßáˆm’ ˜““�pBÖ3YÀj4àv»90Ø£Óêddd€Çã!{\X䀒¦¯bœç›ªªLB­�(2�[û¿k¨|>ïK7&n7 ^¹ÜýÌÓYæÍ›7+æ1ýwp„Îï¯Ï3[”¿é·Oeš¾©(¯{»�|Å™Eœ(î¾ÔÞ~’·ÛI&$‡+dÂÝò³$þÅëõ¼ìr¹´{~¹/ÿÌ×_9GGÕǾlý¢¾£«Ýœ“mÑp1NssÑXÔ›kµudeç Ôl­U»`vvfV¨�¬N=®Ì&ÒG�67J”ô©Í–«­Ýº ff}p}䌸Gâ’Ò½{wEƒÁ °Z­J›ÕÆõi`¿pÆÇÇæÐ†;¾}°{MHkiy·(ú †)¶ZlH¼0›Ì°n�áû~ðú¼011cã£H^ñ<ˆô+MMM·ÅÈZ�vøðaZ£a¶ãÀ^´Ès¨‚6þlûâ{¸qc’È� üé¤%ê“wÞ9d_¦†nÖ¨ˆH2Sc×½wäð¹þKéïÇ>’Þúý{ð‰yÕ¦ ¤r ‘Áh4Î̘õÍ•ÔÕU_º6Š–Ãj/­˜ÓŸØ�û3ž~Mɨ~¥R+Mjµ:®R«ØÚšZ…kØ ƒßŰ *�R‰a÷gžÿúù§Ÿ{~;w7þ!99å–\EzšQI+h9CŽŒŒ &(—s¾Ÿž›ÕD'‹LÝž áu:âvœ:uêê‹Ò—výü†×¡ºÚÍÆ�O))ÜA”HÑ0å†!ø°>˜M&Ш5€ 4˜Q!é òó-:=ÛSÝP�ùDš°ªªêiSzú•••E)LZ­X– GT@ë »«3¤ÒMi(·P©TòÿÿùóçÿÛwïÿ‰±+²LdøúpMUƒ”¤Ãí{~üøÁ°çÀ†ï?~2„……€äwAÕ1Á Pòê¨Uôî¨$ÆeEy†W¯ß0ˆ‰1\»y‡AQAža×ÞC ’âÈÊP-`fø?ƒ……5Z=°7 Ý@ô ¹VXH�áîý‡ r2 GŽ�bÐÓÑ`xøè1Jô¡Xp{[åk!~~_~A¾z³Äè–„†ÇÂ4q°³1<~úœA^Všáâ•ë`÷lßà #-…¬> n0hJû5r�\”r_H�±°O"–�YÔôæ) 1†[w0h¨*18|‚ÁÂÔˆáÙó0ÃA^^·@L\䪜˜L7ˆÍ'Ä¿N@€7Ùä°ˆ°ËW¯\ ¦99Ø=yÆ (/ËpþâUKsc†Ý{ö2ˆ‹‰2 «ƒ[ ®%× ¡©N<|\÷…ø‘-j@‰„¯ß¾3ÈHI0ܺs�AWG“aï�£ ÖÖÖ ?Åð6Ø‚¿˜y~ÿùý’±˜X�™ë7¾TÄÅÉÁpïÁ#°Ž?Í`njȰsçNIqQì9ùƵ;½@“ç‚Øß>|VûÎÌ| ŸŸ>'I�áºÚê ËWod°´²fxýæ-v¼{÷î9ãUp|øð9òý»�+ðYð÷ï_† —¯1¨ª(2ìÜ{˜ÁÌØ€açö­èùaÁý-•YgΤý6Kœmúþý'·ß^-Åc¾KIy 8õ02üg ð²ã£fÎÂl¬…�’� #ãzFæ„s ¾à2X˜í•7M-»±HÏʧaäRVðjß.ïÝ„«°¦íl n#¦(ªkâ\�~FBõ¬¸jg.O ÂŽ<`ÒžLVq �7Pв.]±èÿ»woþO�>é?.ý,d×ÿ ˜á1´p{ñâ%NÅLÔ†ÆÏž=3>~üÈ ©¥áŽ5ˆ‰©“�ñÀÒÒÞ˜ ( ˆ’#ÃÁ&ÃÓ—�¶nÞÆðõë70Ÿ››‹ÁÈØ0ÑÕÉs1u2(–™~þø5f 2Þ¾^(â@ çeÌž7oÞ0445~Àúš¸VÅHþ„U6¤€DÀ©0mu‡˜IEND®B`‚ukui-media/data/icons/24x24/status/audio-input-microphone-high.png0000664000175000017500000000227615170052044023713 0ustar fengfeng‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<`IDATxÚ´mL[Uô¼~HÛ×QÚ1(…E6`”˜ùá24lÌlÀ&!LÜ þÐ)dF¶� s35SpŠLt ™J�H˜€›:3ç„m´P ݨ…Ò–¶´ôzï³­¥¼™&Æ“ÜwϽ÷|Þ{>…‚ÿx�Ê]u—ÝUë:«Éš¢¨ULÏ––?ާ~y9_47xŒñäã?”ùõ¹‰ù'ô Nä°yG„ã�î¨G‘ÓéD¦3r8H=ªEd�\œ@c퇻…´ X(�M+9-e±²ÿHõaPDÉA=¦»Ý=}`³; ¨h9¿ä¡ãø>vÖ½‰¯§Šà¿}YqY$|N CêÙîõAeÜ›5@D¸ †ïh@—z¿‡(y¤?ÙJ\@ñxü’¤§O•“u˜@qœ s·l� ¼*bíZ™Fµ:ˆ����~‚´ÍÉ ›˜ô'£V(PwVÍÊ$’Ýiè[YeÍòΆ<‡˜œ§%ô~r^X¼÷9/“ 䘜š�¸õÑpã÷[Œð‹]=­ðIÇôÏø�ȉÎ?*ú±åE­L*9»6\\FöEba;-xxZ0“Ûë�B#£ã�¼!úú¯Â£™[`zFïN\nö)ˆˆ Š�ˆy‡à¡2É×aakö0–Ši V’X´cyÛù Ì,„ÀÄÓ Œ[×o Á¶­ÐÝÓ ‘ëÀŸÎ§ iSlMrJ"âP‘V*“( þiEÎ,M ×`†�`]´AŒB#š1HÝœ½}ƒ��� ºÉ©UÁ(XvqÅN—Óòwbqø8¹œ©ñ¾ÿ;yA$ÀØøãÁà•Ÿakf:¨T*ˆŠ\Ǟɷ‡5§°ä3_œ7o´q¹#Ì©Ýeq/ë™Ì&$‰ðÔ‡’à«¶vØöX6Ìþd÷Àh4ÎPCÀ¼Áü¼ùÀœÑtŽà&³%Ýfµ]dZ^^†_oÆD%¨zû!+ãPuuæÁ? ´«^¾v­Ü™UÖ”97·ð¤}ñ^+ã€Õ¶×jµ]àÙñêëG˜è¡Aáž<ŒÇCÙó%ðq#s M¬Å.¡àd�¢¾¡xÜÒ«g^±Ž#ª éñ&`º(ä ªÖ:ïNÓtU:ÿÿùóçÿÛwïÿ‰±+²LdøúpMUƒ”¤Ãí{~üøÁ°çÀ†ï?~2„……€äwAÕ1Á R�²¢<ë×oÄD„®Ý¼Ã ¨ ϰkï!I qdeÄ[€T × 2ܽÿ�AAN†áȱS z: =F‰>’| ÓÄÁÎÆðøésyYi†‹W®ƒ ß²}ƒŒ´²ú(¸ŠÞ¥ý¹ر¨éÌRb ·î>`ÐPUb8pøƒ…©óç/`†ƒ¼¼n�˜¸ÈU91™n\&‡E„€]¾zåZ0ÍÉÁÎðèÉ3EyY†ó¯2Xš3ìÞ³—A\L”YÜu-¹ M•\5 DÂ×oßd¤$nݹǠ«£É°÷ÀQkkk†‡�Ÿbè[ð÷3Ïï?¿¿\œ ÷<ûàèñÓ æ¦† ;wîd�Åž“o\»Ó ̲s‰µàÓç/à$ 2\W[�aùê� –VÖ ¯ß¼ÅîƒwïÞ=g¼ÊÐM¬ÿþe¸pùƒªŠ"Ãν‡ÌŒ vnߊžÜßR™uæLÚo"Íw))¯§F†ÿ ¡ž@¶Cb|4ÃÌYà@˜MRa‡€…Ù^PyÓÔÒ±‹ôl |F.%¦°¦íl n#2S6q.H?#¡úV\5€‚3ˆ'aG0iO&«¸†Æ(hY—®XôÿÝ»7ÿ§NŸô—~2 ÓPÌðZ¸½xñ§b& jCãgÏžƒ?~dÐÔÒpÇÄÄÔÉÀx`iioLDI‚‘áà“áéËÇ [7ocøúõ˜ÏÍÍÅ`dl˜èêä¹€˜:ËL?üš 3€ o_/q …ó‰²fÏ›7ošˆ?`}M|Q !S~:fhIEND®B`‚ukui-media/data/icons/24x24/status/audio-input-microphone-muted.png0000664000175000017500000000152315170052044024104 0ustar fengfeng‰PNG  IHDRàw=øtEXtSoftwareAdobe ImageReadyqÉe<õIDATxÚ´U_H“Qÿ}«‡Öƒšºéfs•¤¦‘S[¾D�Pj.!¥ð%챇èÁDªç"$¥’Ð2%ÂjêD𢡠! ü›ºù¯-i�é–k_÷~l±¹M?'8Ü{Ï=÷üî¹÷wÏe8ŽÃÿÑv ÃØÊ+ªN“FÄ=¯¹©¡ÏÏB3ØJƒ'Ê�ONsœõ—�s:�Üäô7ŽÚ‰æûú³ad­¿sûâ㤘œ™ƒÃá@woÖN””\¢ó�¾±ÃÀa¥ßÍÄFGÁ0>e¢�ºOˆ“J6ôZ&,ÛþÇí–4ošsµµ`¡ìää€ÊÑÕ£Çñ´dÌÍý®/$ò¯Tr¹$Z,˜³Øí»~ ‰Ún(d僿l{ MIÑ?¿âÒ‹Ò˜ƒ‘Ëí–Ñà¯T¼}j·�ˆ—ÆbbzÉI‡Ð«DNV&—–½Á);šˆJÝ�ÄWæM‹P*0òå+r³UèêÖAÃϵ¿~ÃxÚg[üLM 9–ÇK115ƒô´èzû¡V«1g\ˆÁîdç¾ã™Ùy>ƒþ�!dge@«Õ"N³3€P™P¡”ü<4‚ôcGñ±³¹§Ô0[~ØË²&ÊØÜÛ7û~™ £c$QB«Óã¤ê´:6¿ƒÐµˆð_3l2ñï `G"Ñê@~aT5a�ÍfCqQÖ×쨼zOžR—Æm.s-dRßbG©Ç³ÃåB¹Dz¶¶îAW�¥�¤ØU…UìÀ ¢÷„Üñ«!Z-¨\ûH=ÑjÏ#ÚNn’l…U®=Ä ÛÓÒú‚[]µp�ër¡Ö‹Â(¦n�Âè)nËË+!�Ù]ü†ªÅÅ%¾cµZ‘’š|.háò'&‰êîß­ˆŒˆô£`Y©†oVŒèx÷vû?‹÷!S•Q™¦ IÈŸLyÊ:¿½}…§rþB¡Ÿ�>àűX,¨©­|~ä¿~D»‘¿ žƒ7$,–HIEND®B`‚ukui-media/data/icons/16x16/0000775000175000017500000000000015170052044014341 5ustar fengfengukui-media/data/icons/16x16/Makefile.am0000664000175000017500000000006115170052044016372 0ustar fengfengSUBDIRS = status -include $(top_srcdir)/git.mk ukui-media/data/icons/16x16/status/0000775000175000017500000000000015170052044015664 5ustar fengfengukui-media/data/icons/16x16/status/Makefile.am0000664000175000017500000000057015170052044017722 0ustar fengfengNULL = themedir = $(pkgdatadir)/icons/hicolor size = 16x16 context = status iconsdir = $(themedir)/$(size)/$(context) icons_DATA = \ audio-input-microphone-high.png \ audio-input-microphone-low.png \ audio-input-microphone-medium.png \ audio-input-microphone-muted.png \ $(NULL) EXTRA_DIST = \ $(icons_DATA) \ $(NULL) -include $(top_srcdir)/git.mk ukui-media/data/icons/16x16/status/audio-input-microphone-medium.png0000664000175000017500000000125715170052044024254 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<QIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ä}:”½;<ð8àpMUƒ”¤ÞG¾ÿøÉß6€…‘™è‰Ù ¾�¸LPV”g8sþƒ¢‚<$%ÄárLw7—ÞæçåòâçŸl?U› [ õ´Ž;Å §£ÁððÑc°8È‹L Þ—¿}úñAH„o¿ p 68ØÙÎ_º Ö¼eûi)°80Y™øøx—Šów ®AÖs�ž¶Ã�Ã',L�ž=“�b’R’\¤¡©âÄËÏuGHXP¦9,"hãB›“ƒ�áÒÕ –æÆ »÷ìe…)[Àv ýÏþóÿÿì0™U+ÖÀÈ×oßt4ÕŽŸ<Ë`mmÍððñSD >»÷<îúõ{ûþ¾£óîíÇkØÂÿ §Î^`�–g8zô(ƒ¬´$€ϟ>G¾ù¾âÃG ýöÝ:,ú]JÊkT•4TÜ]ìfΚ Ÿ 6àþÖ v^.ùwo?D}zõm.šæ5À$»H»6µt0Lœ2“aË6pú™½dÁ¬4 ½ŽEÙ¯Sîïßÿ˜²îm©x‰fÀm``Ãc$Ö‘c(H]fTñì”ùýÿ¯Þƒí•Û°ùh@�Jb$á'@<hp#1¹jP�ªâv Æ*x ’¨*¡|00 õÀÝR²LIEND®B`‚ukui-media/data/icons/16x16/status/audio-input-microphone-high.png0000664000175000017500000000152515170052044023711 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<÷IDATxÚbüÿÿ?ƒ¢wGÛ–‡Û*Ê�\ Ä&¦Û©ÃHB¶‹çÏ<ÂÈÈÈÀ2@! A@Á³ýРnÇ$¤Ùñÿ›·ïþÿùóçÿÛwïÿñ�Ød“¼O‡Ã/v n>7._ƒè)îh8\SUÆ %)Á°çÀ†ï?~2„……€Äw� `adfºyö—ïŸ\�Äñððô]ƈl‚²¢<Ùó—äví=Ä )!—cº»¹ô6?/—§?ÿä¿¿ÜòØ£x•² [ õ´Ž;Å §£ÁððÑc°8È‹L Þ—¿}úñAH„o¿ p 77ç n^žd8ØÙÎ_º Ö¼eûi)°80Y™øøx—Šów ®áàå8ÊËÃe Rs�ž¶Ã�Ã',L�ž=Á•�b’R’\¤¡©âÄËÏuGHXP…‡_è/—XXDÐÆ… …œì —®Þ`°47fؽg/ƒ¸˜(Ìq ˜ÀNâ¯ÿÙþÿÿ�ýû§·€\–U+ÖÀÓÃ×oßt4ÕŽŸ<Ë`mmÍððñSD >»÷<îúõ{ûþ¾£óîíÇkÿ™å¿|þþ9 €ñÏpêìiIq†£G�2ÈJK" øüésäû—ï+>|Òoß­ûññ‡Ñç/_/ éw))¯aPUVdÐPU`pw±g˜9k.H|6Ø€û[+ Øy¹äß½ýõéÕ·¹_¿~‹ýòåë2¨æ5À$»H»6µt0Lœ2“aË6pú™½dÁ¬4 ½ŽEÙ¯Sîïßÿ˜²ÄÄÅ´€¶«²J)ì„p˜Àð˜‰5DúÆ@>�ºÌ¨âÙ)óûÿ_=f^¦£\L\§YY Ï/ÏÜ S4 H%± ’·žñ\ Á Œ Ô¤êÕÈ÷‡‘}ÐWïn©ÈfÀ€µ©J nj¬‚"ˆøÍÄ^4èÒ=.å<šA Ê€új-Õd_J£IEND®B`‚ukui-media/data/icons/16x16/status/audio-input-microphone-low.png0000664000175000017500000000104415170052044023567 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ÆIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ƒÃ5Ue R’ {aøþã'CXXH|±0(+Ê3œ9‰AQAža×ÞC ’âp9¢ Ùj¨§ÍpäØ)= †‡�ƒÅA^dRðêÕ%ƒÏv6†ó—®‚5oÙ¾‡AFZ , DV&>>Þ%‚âüØ4††ÇÁ\ §­Ápàð  S#†gÏ_À䣘¤”$ihª8¡k‹ZÀ¸Äæä`g¸tõƒ¥¹1Ãî={ÄÅDaʀÀ‹í«V¬�'�¯ß¾3èhª1?y–ÁÚÚšáá㧈@|vïyÜõë÷öá `ü3œ:{�AZRœáèÑ£ ²Ò’>úùþåû <ú]JÊkT•4TÜ]ìfΚ Ÿ v=¾¤ ‡Õ@¯„“² �»Ijö’³Ò€�¸–…@¸ 4¤hÈH¬1"ÇP>�ºÌH(3 hRÉ@ŒœVžñ\ Á ŒÄäF¨Am@ªˆÛ�«`âD€¤à†Z¢Àõb¾<˜IEND®B`‚ukui-media/data/icons/16x16/status/audio-input-microphone-muted.png0000664000175000017500000000101015170052044024075 0ustar fengfeng‰PNG  IHDRóÿatEXtSoftwareAdobe ImageReadyqÉe<ªIDATxÚbüÿÿ?!›˜n¤# Ù.ž?ó###È|8&!͈ÿß¼}÷ÿÏŸ?ÿß¾{ÿ?ˆÄ® “˜ƒÃ5Ue R’ {aøþã'CXXH|±0(+Ê3œ9‰AQAža×ÞC ’âp9d…µ´¶CÄ Yl2ËÌd0ìícXµn ƒžŽÃÃG�Ár /¢¸¤YàÚ5ûßÑ£ ç/]kÞ²}ƒŒ´Xˆ¬8½3ô´5>Á`ajÄðìù °Xhxp†´´°ò/]½Á`in̰{Ï^q1Q˜ô&B6Ãø:šj ÇOže°¶¶fxøø)\§Ð]rêìiIq†£Àð�•–Ä Àtµ ¨Ñ Ý�kB ªÊŠ …ß3°2Û3Ìœ5$<ˆSñ%å°ˆ�Õ«V¬ &e w7’Ôì% f¥q- �4thHÐ� �Xc„K5ç©ËŒ„2Ѐ • Ä2HÂO€x.ÐàFbr#Ô 6 U Äí@�Uc‡f¨„òÁ À÷µ¶r‹‰-»IEND®B`‚ukui-media/data/icons/scalable/0000775000175000017500000000000015170052044015322 5ustar fengfengukui-media/data/icons/scalable/Makefile.am0000664000175000017500000000007115170052044017354 0ustar fengfengSUBDIRS = status devices -include $(top_srcdir)/git.mk ukui-media/data/icons/scalable/devices/0000775000175000017500000000000015170052044016744 5ustar fengfengukui-media/data/icons/scalable/devices/audio-speaker-left.svg0000664000175000017500000004654415170052044023163 0ustar fengfeng image/svg+xml audio device speaker output left audio-speaker-left Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-left-testing.svg0000664000175000017500000005050215170052044024623 0ustar fengfeng image/svg+xml audio device speaker output left testing highlighted audio-speaker-left-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-left-back-testing.svg0000664000175000017500000005051215170052044025522 0ustar fengfeng image/svg+xml audio device speaker output left-back testing highlighted audio-speaker-left-b-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/Makefile.am0000664000175000017500000000150615170052044021002 0ustar fengfengNULL = themedir = $(pkgdatadir)/icons/hicolor size = 48x48 context = devices iconsdir = $(themedir)/$(size)/$(context) icons_DATA = \ audio-speaker-center.svg \ audio-speaker-center-testing.svg \ audio-speaker-left-back.svg \ audio-speaker-left-back-testing.svg \ audio-speaker-left.svg \ audio-speaker-left-side.svg \ audio-speaker-left-side-testing.svg \ audio-speaker-left-testing.svg \ audio-speaker-right-back.svg \ audio-speaker-right-back-testing.svg \ audio-speaker-right.svg \ audio-speaker-right-side.svg \ audio-speaker-right-side-testing.svg \ audio-speaker-right-testing.svg \ audio-speaker-center-back-testing.svg \ audio-speaker-center-back.svg \ audio-subwoofer.svg \ audio-subwoofer-testing.svg \ $(NULL) EXTRA_DIST = \ $(icons_DATA) \ $(NULL) -include $(top_srcdir)/git.mk ukui-media/data/icons/scalable/devices/audio-speaker-center-back-testing.svg0000664000175000017500000004706415170052044026060 0ustar fengfeng image/svg+xml audio device speaker output center testing highlighted audio-speaker-center-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right.svg0000664000175000017500000004654115170052044023343 0ustar fengfeng image/svg+xml audio device speaker output right audio-speaker-right Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-left-back.svg0000664000175000017500000004656315170052044024062 0ustar fengfeng image/svg+xml audio device speaker output left-back audio-speaker-left-back Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-subwoofer.svg0000664000175000017500000003353015170052044022603 0ustar fengfeng image/svg+xml audio device subwoofer output audio-subwoofer Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-left-side.svg0000664000175000017500000004653115170052044024101 0ustar fengfeng image/svg+xml audio device speaker output left-side audio-speaker-left-side Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-center.svg0000664000175000017500000004650715170052044023510 0ustar fengfeng image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right-side.svg0000664000175000017500000004653315170052044024266 0ustar fengfeng image/svg+xml audio device speaker output right-side audio-speaker-right-side Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right-side-testing.svg0000664000175000017500000005046515170052044025740 0ustar fengfeng image/svg+xml audio device speaker output right-side testing highlighted audio-speaker-right-side-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right-back.svg0000664000175000017500000004657315170052044024246 0ustar fengfeng image/svg+xml audio device speaker output right-back audio-speaker-right-back Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-subwoofer-testing.svg0000664000175000017500000002625315170052044024262 0ustar fengfeng image/svg+xml audio device subwoofer output testing highlighted audio-subwoofer-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-center-back.svg0000664000175000017500000004513615170052044024403 0ustar fengfeng image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right-testing.svg0000664000175000017500000007767115170052044025026 0ustar fengfeng image/svg+xml audio device speaker output right testing highlighted audio-speaker-right-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-right-back-testing.svg0000664000175000017500000005052615170052044025712 0ustar fengfeng image/svg+xml audio device speaker output right-back testing highlighted audio-speaker-right-back-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-center-testing.svg0000664000175000017500000005044515170052044025157 0ustar fengfeng image/svg+xml audio device speaker output center testing highlighted audio-speaker-center-testing Evangeline McGlynn ukui-media/data/icons/scalable/devices/audio-speaker-left-side-testing.svg0000664000175000017500000005046415170052044025554 0ustar fengfeng image/svg+xml audio device speaker output left-side testing highlighted audio-speaker-left-side-testing Evangeline McGlynn ukui-media/data/icons/scalable/status/0000775000175000017500000000000015170052044016645 5ustar fengfengukui-media/data/icons/scalable/status/Makefile.am0000664000175000017500000000057315170052044020706 0ustar fengfengNULL = themedir = $(pkgdatadir)/icons/hicolor size = scalable context = status iconsdir = $(themedir)/$(size)/$(context) icons_DATA = \ audio-input-microphone-high.svg \ audio-input-microphone-low.svg \ audio-input-microphone-medium.svg \ audio-input-microphone-muted.svg \ $(NULL) EXTRA_DIST = \ $(icons_DATA) \ $(NULL) -include $(top_srcdir)/git.mk ukui-media/data/icons/scalable/status/audio-input-microphone-muted.svg0000664000175000017500000015623115170052044025111 0ustar fengfeng image/svg+xml ukui-media/data/icons/scalable/status/audio-input-microphone-low.svg0000664000175000017500000015615715170052044024603 0ustar fengfeng image/svg+xml ukui-media/data/icons/scalable/status/audio-input-microphone-high.svg0000664000175000017500000016126115170052044024711 0ustar fengfeng image/svg+xml ukui-media/data/icons/scalable/status/audio-input-microphone-medium.svg0000664000175000017500000016007415170052044025253 0ustar fengfeng image/svg+xml ukui-media/data/icons/22x22/0000775000175000017500000000000015170052044014333 5ustar fengfengukui-media/data/icons/22x22/Makefile.am0000664000175000017500000000006115170052044016364 0ustar fengfengSUBDIRS = status -include $(top_srcdir)/git.mk ukui-media/data/icons/22x22/status/0000775000175000017500000000000015170052044015656 5ustar fengfengukui-media/data/icons/22x22/status/Makefile.am0000664000175000017500000000057015170052044017714 0ustar fengfengNULL = themedir = $(pkgdatadir)/icons/hicolor size = 22x22 context = status iconsdir = $(themedir)/$(size)/$(context) icons_DATA = \ audio-input-microphone-high.png \ audio-input-microphone-low.png \ audio-input-microphone-medium.png \ audio-input-microphone-muted.png \ $(NULL) EXTRA_DIST = \ $(icons_DATA) \ $(NULL) -include $(top_srcdir)/git.mk ukui-media/data/icons/22x22/status/audio-input-microphone-medium.png0000664000175000017500000000171015170052044024240 0ustar fengfeng‰PNG  IHDRÄ´l;tEXtSoftwareAdobe ImageReadyqÉe<jIDATxÚœ•kH“QÇÿï6ÓÌœ[6ç¼Î.jYT¢fÖ·.dt£´‹EÂEч(#!¡„(¢ËˆÄ’ŠÈˆ,™:°ÔîPQZ^§.§æšÎëÖ²·s^�l:çìÀáÜžýöœÿyžçeX–ÅT�a˜I{RÓÖ’¡Ò�ùº»ù7«ÆW鬶<̬Uffœ‚Ì_ІæV˜L&”WTaØdFrònz^jårà°ÄÜ3ò-¹é®�ÈCð³[‰¯µu��‡† TýþR?[³Q0ìu�À-%|g^ÚDÐDI¨wóÄ"4iZˆªWï°<*­mZ»çáÀ ÏÓ»ÅBáV¡Èûl¬"_:ž´g×AjLçî³ mï@HP>ýÆA‹KÊ ³µßÏ#¼ØvÎómÁa�X$¼3Ï×Ká@�bü×ê±L*A}S "…¡¢ò VǬ‚®£Ó ¥WÌçIü|k‚%�覷XXäã3w‡-1yïnÎÓ‡qãlw´ýÐA„�Ÿk�²r5ü$óakÇ _œ¹�{R/oO�H,”Û‚‰¡�ȃCÔIQߨŒeQ‘PWT#!!­Úv»+òFþð½,,£ Ás#Iaqž³=ÐÜÒÆy\ýú=âbVB¥RÁßo¾��à{mc!Þ¢‹¡ÞþÅÃ|~½3p_ÿZºli8î=|‚ø5 èÖÿ²÷Ø`0t05à4îííß×c0ÞwÁ§/µX´P•º±Ñ+ *y61ŽÁÓ§ùð!Í«PÆôôôm4 ý,tÂ]òt& X$íØLæ¡PJÁ�›Ü¥•ãRp™·ýârä¼Ü§Ëê¤Á)!Ñ-‹`@? I‰ ÐùËo X+‡á‘QÅëš+&ÅBásBQÄ¡¬’IóÉ-Í=O é�ÄŸ_¸ýE&67| ŒŽM€tE<ÜøûCÚØÒ ñq ¬¿›E*!>ïÿ×ÚWôb‘ðì²(A qò¼šÇUz±µìñE'‰†¾�!�¯Z íWá‰Ìu0>að‘’+Ö°¢c¢º£>&‡báÅÈÈ¥Û˜Èt?&O.عƒ‰´þüfåqÃaäŸq�IWÀõݰa}´¶i!&z9øãX)kËS“™O*ˆàëEb¡ŒØ_—çLÒ4o)$Ù:gƒ„8 ôõBÚÚTжwAvv6 �Ž| –Û&pºœ–ù†`qpS8‰½§úNp92)âqaph„‰¸ëÊï°>34 ÄÆ,À±{{úO`Æ3d37c^m ëc[U-ˆBê¡ÆŠ‹äpã«ßÔàñÔ{å«—UÞÚ,ÃK<®�Jxˆ`ìa¼Ü£‚[VQôy> QUÖ�¢¿e¯Ã &ÕQŽõSx¸ìÅ|rlÊ•Ÿ¤…›Þò#éãÔ�«EFãúâÔIäÏáS¶ÿSÈå9î¤Ô5½sóÑx¼ £Þ¡c0Ü Ö7½÷,N2ÆÇ'Ãd2Aêùæ[=½š€ñö€+ÿ (vÕGGŠE‘"µÿù®ÂÝÌ:vgš~j«uŽÙÓ4Öe¤—ü/15ÿÓã<ô¾cß›ûîóÒPB^´â%¯•í±s8X¬àÿ!ü+ÀŒÇÎnµFôIEND®B`‚ukui-media/data/icons/22x22/status/audio-input-microphone-low.png0000664000175000017500000000147315170052044023567 0ustar fengfeng‰PNG  IHDRÄ´l;tEXtSoftwareAdobe ImageReadyqÉe<ÝIDATxÚœ•mHSaÇÿ[›¯}HÓmnÓ¹Rœ¦‘3[}+¢$ ò¥¬H¿%õ)ŠÄB‚QDäˆDŠ éC¤ÉÔ�5­(¡¤´|™:—›¦æëÖœ·ç^6Ùtkw8œç>Ϲ¿�çÜsÎ8EÁŸp8œM{gKË£óá~ðIcC÷ú ö§¾ D©Áa=åp8(ëüe·Û©aýEï=ìöå"8ÑUU^ƒ8N„áQl6:»º±b³£¨¨€>owsƒc§\†ß3³ÄDc`pòDÚµï'zºoL Ýöè(èÇ HL�¢ûý'ìNWÀ0aôú<¬".,>yŽv¦×a¡!0Nš!‹— ïûÚÒÖ ©Dìé_•çÕ½•ä×D`7ç5wÄb‘Cúq(’w K÷û²³`2O¹¡ô¹aL‚@Zï�Xtª€‰´ùÅKƆ‡…bâ— rY<¾ôõ#7G‰ŽN-„‚XxúqSÒª©IþÀÄÑ+ÉKË+�ŠEEFz*´]=P©T0'½Þã:W·lu¬:ÙVEDxFÇ'˜ˆ{>|FNv&4 ℱ^~¼Ÿ#·I‹=b ž_XdJ‹†fìJÁ³æWÈݯÂÌìœwÄ‹ÅÌéG=[°ÓéÄ×oHN’C£Õa¯r4m­ëܱ–—z{Ë,¹‡®^¯bª� …'Ž’u"ÊΟÁÃæÒêõTÓudÈhéyp³¶®ÃÇ±šœ—¯w›éFj³‚ ©�JÍTMÌ[0Ý¡—‰Þaq±+$€{A�M×4¤ÓÇú¼‰²Xf©ûîR¾Þå9ÜÖ\ £kèLMMÃ_ÿ#J“ÉÌ,¬V+RÓG6¥ñ_9vå™W{«¦4j[”Úsÿtq c'§�h}ýKKËÌsdd²”™e¼Púëqí¶?j7ÈSh(-yÇ�yí“z¨*hpÈÅŠ 6>ŸÏ:OäÿÑPìí�pIEND®B`‚ukui-media/data/icons/22x22/status/audio-input-microphone-muted.png0000664000175000017500000000146115170052044024101 0ustar fengfeng‰PNG  IHDRÄ´l;tEXtSoftwareAdobe ImageReadyqÉe<ÓIDATxÚœ•_HSqÇ¿÷rë¡õ ¦nºÙ\%þI#¦¶|K"#ò® ¥ð%ì±éÁ"è½ÉEh™eµéDšb¡ !ÎljéæÔœÒÓ-m·ß½ì޹?z×�ÃïwÎïü>÷ð;‡s–eM(Š ó]©k8CS„ðÒ¶g­ƒ‹GÓHP¢ì´e–ÝÚÚb�¿]¬×ëe-³ßYÎO´Lˆ¥›˜n7ÝBjŠ –¹yx<ô bÓãEuu%wn¸±‚qT¥ÄÏU’`žž�*] ƒñ#RdÒà0𠽨AQ¥ä{]}>i[ÈÙvg;k+q¨¸ä9�~X�Þ~Näfa~Áº£ 'vertical' ukui-volume-control-applet orientation Used to set the orientation of ukui-volume-control-applet ukui-media/data/ukui-volume-control-applet.desktop0000664000175000017500000000164615170054730021272 0ustar fengfeng[Desktop Entry] _Name=Volume Control _Comment=Show desktop volume control Name[mn]=ᠳᠠᠭᠤᠨ á ¤ ᠬᠡᠮᠵᠢᠶ᠎ᠡ á ¶á ¢ ᠡᠵᠡᠮᠳᠡᠬᠦ Name[zh_CN]=音é‡�控制 Name[zh_HK]=音é‡�控制 Comment[mn]=ᠰᠢᠷᠡᠭᠡᠨ ᠭᠠᠳᠠᠷᠭᠤ ᠶᠢᠨ ᠳᠠᠭᠤᠨ á ¤ ᠬᠡᠮᠵᠢᠶ᠎ᠡ á ¶á ¢ ᠡᠵᠡᠮᠳᠡᠬᠦ á ¶á ¢ ᠢᠯᠡᠷᠡᠭᠦᠯᠵᠡᠢ Comment[zh_CN]=显示桌é�¢éŸ³é‡�控制 Comment[zh_HK]=顯示桌é�¢éŸ³é‡�控制 Icon=multimedia-volume-control Exec=ukui-volume-control-applet-qt Terminal=false Type=Application Categories=AudioVideo;Mixer;Settings;HardwareSettings; Keywords=UKUI;volume;control;mixer;settings;sound; NoDisplay=true OnlyShowIn=UKUI; X-UKUI-Bugzilla-Bugzilla=UKUI X-UKUI-Bugzilla-Product=ukui-media X-UKUI-Bugzilla-Component=ukui-volume-control # See http://bugzilla.ukui.org/show_bug.cgi?id=568320 X-UKUI-AutoRestart=true X-UKUI-Autostart-Phase=Application