EQ10Q/0000755000175000017500000000000011514373717011550 5ustar sapistasapistaEQ10Q/pixmapcombo.cpp0000644000175000017500000001073011322416300014552 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "pixmapcombo.h" PixMapCombo::PixMapCombo(){ //Create the tree model m_refTreeModel = Gtk::ListStore::create(m_Columns); set_model(m_refTreeModel); //Enganxar una imatge al pixbuf Glib::RefPtr m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_OFF); //Fill the ComboBox Tree Model Gtk::TreeModel::Row row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_LPF1); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_LPF2); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_LPF3); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_LPF4); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_HPF1); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_HPF2); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_HPF3); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_HPF4); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_LOSHELF); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_HISHELF); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_PEAK); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //Enganxar una imatge al pixbuf m_refTopixbuf= Gdk::Pixbuf::create_from_file(RUTA_NOTCH); //Fill the ComboBox Tree Model row = *(m_refTreeModel->append()); row[m_Columns.m_col_pix] = m_refTopixbuf; //add to combo pack_start(m_Columns.m_col_pix); show_all_children(); } PixMapCombo::~PixMapCombo(){ }EQ10Q/vuwidget.hpp0000644000175000017500000000343711014671623014116 0ustar sapistasapista/**************************************************************************** vuwidget.hpp - simple VU meter Copyright (C) 2006-2007 Lars Luthman This program is free software; you can redistribute it and/or modify it under the terms of the 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ****************************************************************************/ #ifndef VUWIDGET_HPP #define VUWIDGET_HPP #include #include #include #include class VUWidget : public Gtk::DrawingArea { public: VUWidget(unsigned channels, float min = 1.0 / 256); ~VUWidget(); void set_value(unsigned channel, float value); protected: bool on_expose_event(GdkEventExpose* event); void clear_peak(unsigned channel); float map_to_log(float input) { float result = 0; if (input > m_min) { float lmin = -std::log(m_min); result = std::log(input) / lmin + 1; } return result; } unsigned m_channels; float m_min; float* m_values; float* m_peaks; sigc::connection* m_peak_connections; Gdk::Color m_bg, m_fg1, m_fg2, m_fg3, m_fg1b, m_fg2b, m_fg3b, m_shadow, m_light; }; #endif EQ10Q/plugin.cpp0000644000175000017500000003110611322416301013533 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include "constants.h" typedef struct _Filter{ float b0, b1, b2, a1, a2; //coefs de segon ordre float b1_0, b1_1, a1_1; //coefs de primer ordre float buffer[3]; //buffer de segon ordre float buffer1[2]; //buffer de primer ordre float buffer_extra[3]; //buffer extra per fer filtres de 4t ordre int filter_type; //ID del tipus de filtre defint a constants.h int filter_order; //defineix l'ordre del filtre float gain, freq, Q; //parametres del filtre }Filter; using namespace LV2; class ParamEQ : public Plugin { public: ParamEQ(double rate) : Plugin( NUM_OF_LV2_PORTS), m_min(1.0 / 256), m_decay(exp(log(m_min) / (1 * rate))){ in_values=0.0; out_values=0.0; fs=float(rate); iport=FIRST_FILTER_PORT_INDEX; //contra el primer ctl_port del filtre a llegir in_gain=1; out_gain=1; bypass=false; //dades de inicccccccccZccccccccccialitzacio float d1=log10(FREQ_MIN); float d2=log10(FREQ_MAX); for(int i=0;i 0 ? true : false; iport = FIRST_FILTER_PORT_INDEX; } //Fi de la lectura de ports //Bucle de processat de senyal for (uint32_t i = 0; i < nframes; ++i){ w = p(1)[i]; //pilla la mostra del audio port if(!bypass){ w=w*in_gain; //Actualitzar el Vu meter vu_value = std::abs(w); in_values = vu_value > in_values ? vu_value : in_values; for (int j=0; j < NUM_OF_FILTERS; j++){ //Compute filter if(filters[j].filter_type != FILTER_OFF){ //si el filtre esta enabled switch(filters[j].filter_order){ //Processat 1r ordre case 1: //w(n)=x(n)-a1*w(n-1) filters[j].buffer1[0] = w-filters[j].a1_1*filters[j].buffer1[1]; //y(n)=bo*w(n)+b1*w(n-1) w = filters[j].b1_0*filters[j].buffer1[0] + filters[j].b1_1*filters[j].buffer1[1]; filters[j].buffer1[1] = filters[j].buffer1[0]; break; //Processat 2n ordre case 2: //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) filters[j].buffer[0] = w-filters[j].a1*filters[j].buffer[1]-filters[j].a2*filters[j].buffer[2]; //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) w = filters[j].b0*filters[j].buffer[0] + filters[j].b1*filters[j].buffer[1]+ filters[j].b2*filters[j].buffer[2]; filters[j].buffer[2] = filters[j].buffer[1]; filters[j].buffer[1] = filters[j].buffer[0]; break; //Processat 3r ordre case 3: //w(n)=x(n)-a1*w(n-1) filters[j].buffer1[0] = w-filters[j].a1_1*filters[j].buffer1[1]; //y(n)=bo*w(n)+b1*w(n-1) w = filters[j].b1_0*filters[j].buffer1[0] + filters[j].b1_1*filters[j].buffer1[1]; filters[j].buffer1[1] = filters[j].buffer1[0]; //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) filters[j].buffer[0] = w-filters[j].a1*filters[j].buffer[1]-filters[j].a2*filters[j].buffer[2]; //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) w = filters[j].b0*filters[j].buffer[0] + filters[j].b1*filters[j].buffer[1]+ filters[j].b2*filters[j].buffer[2]; filters[j].buffer[2] = filters[j].buffer[1]; filters[j].buffer[1] = filters[j].buffer[0]; break; //Processat 4t ordre case 4: //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) filters[j].buffer[0] = w-filters[j].a1*filters[j].buffer[1]-filters[j].a2*filters[j].buffer[2]; //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) w = filters[j].b0*filters[j].buffer[0] + filters[j].b1*filters[j].buffer[1]+ filters[j].b2*filters[j].buffer[2]; filters[j].buffer[2] = filters[j].buffer[1]; filters[j].buffer[1] = filters[j].buffer[0]; //w(n)=x(n)-a1*w(n-1)-a2*w(n-2) filters[j].buffer_extra[0] = w-filters[j].a1*filters[j].buffer_extra[1]-filters[j].a2*filters[j].buffer_extra[2]; //y(n)=bo*w(n)+b1*w(n-1)+b2*w(n-2) w = filters[j].b0*filters[j].buffer_extra[0] + filters[j].b1*filters[j].buffer_extra[1]+ filters[j].b2*filters[j].buffer_extra[2]; filters[j].buffer_extra[2] = filters[j].buffer_extra[1]; filters[j].buffer_extra[1] = filters[j].buffer_extra[0]; break; }//END SWITCH ORDER }//END of if filter acived } w=w*out_gain; //fi de processat per una mostra enviem a la sortida p(0)[i]=w; } //Fi del NO-BYPASS else p(0)[i]=w; //BYPASS //Actualitzar el Vu meter vu_value = std::abs(w); out_values = vu_value > out_values ? vu_value : out_values; }// Fi de bulce mostres //Actualitzo port dels meters //IN meter *p(45) = in_values > m_min ? in_values : 0; if (in_values > m_min) in_values *= pow(m_decay, nframes); else in_values = 0.0; //OUT meter *p(46) = out_values > m_min ? out_values : 0; if (out_values > m_min) out_values *= pow(m_decay, nframes); else out_values = 0.0; }//Fincal del RUN() private: int iport; float fs, f[NUM_POINTS], in_gain, out_gain; bool bypass; Filter filters[NUM_OF_FILTERS]; //PEl Vumeter float vu_value, in_values, out_values, m_min, m_decay; }; void ParamEQ::calc_coefs(int filter_ID, int filter_type, int freq_ptr, float p2, float p3){ //p2 = GAIN p3 = Q //Compute filter coeficients float w0=2*PI*(f[freq_ptr]/fs); float alpha, A, b0, b1, b2, a0, a1, a2, b1_0, b1_1, a1_0, a1_1; switch(filter_type){ case HPF_ORDER_1: b1_0 = 2; //b0 b1_1 = -2; //b1 a1_0 = w0+2; //a0 a1_1 = w0-2; //a1 break; case HPF_ORDER_2: case HPF_ORDER_4: alpha = sin(w0)/(2*p3); //p3 = Q b0 = (1 + cos(w0))/2; //b0 b1 = -(1 + cos(w0)); //b1 b2 = (1 + cos(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha; //a2 break; case HPF_ORDER_3: alpha = sin(w0)/(2*p3); //p3 = Q b1_0 = 2; //b0 b1_1 = -2; //b1 a1_0 = w0+2; //a0 a1_1 = w0-2; //a1 b0 = (1 + cos(w0))/2; //b0 b1 = -(1 + cos(w0)); //b1 b2 = (1 + cos(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha; //a2 break; case LPF_ORDER_1: b1_0 = w0; //b0 b1_1 = w0; //b1 a1_0 = w0+2; //a0 a1_1 = w0-2; //a1 break; case LPF_ORDER_2: case LPF_ORDER_4: alpha = sin(w0)/(2*p3); //p3 = Q b0 = (1 - cos(w0))/2; //b0 b1 = 1 - cos(w0); //b1 b2 = (1 - cos(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha; //a2 break; case LPF_ORDER_3: alpha = sin(w0)/(2*p3); //p3 = Q b1_0 = w0; //b0 b1_1 = w0; //b1 a1_0 = w0+2; //a0 a1_1 = w0-2; //a1 b0 = (1 - cos(w0))/2; //b0 b1 = 1 - cos(w0); //b1 b2 = (1 - cos(w0))/2; //b2 a0 = 1 + alpha; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha; //a2 break; case LOW_SHELF: A=pow(10,(p2/40)); //p2 = Gain alpha =sin(w0)/2 * (1/p3); //p3 = Q b0 = A*((A+1)-(A-1)*cos(w0)+2*sqrt(A)*alpha); //b0 b1 = 2*A*((A-1)-(A+1)*cos(w0)); //b1 b2 = A*((A+1)-(A-1)*cos(w0)-2*sqrt(A)*alpha); //b2 a0 = (A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha; //a0 a1 = -2*((A-1) + (A+1)*cos(w0)); //a1 a2 = (A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha; //a2 break; case HIGH_SHELF: A=pow(10,(p2/40)); // p2 = Gain alpha =sin(w0)/2 * (1/p3); //p3 = Q b0 = A*( (A+1) + (A-1)*cos(w0) + 2*sqrt(A)*alpha ); //b0 b1 = -2*A*( (A-1) + (A+1)*cos(w0)); //b1 b2 = A*( (A+1) + (A-1)*cos(w0) - 2*sqrt(A)*alpha ); //b2 a0 = (A+1) - (A-1)*cos(w0) + 2*sqrt(A)*alpha; //a0 a1 = 2*( (A-1) - (A+1)*cos(w0)); //a1 a2 = (A+1) - (A-1)*cos(w0) - 2*sqrt(A)*alpha; //a2 break; case PEAK: A=pow(10,(p2/40)); //p2 = Gain alpha = sin(w0)/(2*p3) ; //p3 = Q b0 = 1 + alpha*A; //b0 b1 = -2*cos(w0); //b1 b2 = 1 - alpha*A; //b2 a0 = 1 + alpha/A; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha/A; //a2 break; case NOTCH: alpha = sin(w0)/(2*p3) ; //p3 = Q b0 = 1; //b0 b1 = -2*cos(w0); //b1 b2 = 1; //b2 a0 = 1 + alpha; //a0 a1 = -2*cos(w0); //a1 a2 = 1 - alpha; //a2 break; } //End of switch //Normalice coeficients to a0=1 b0 = b0/a0; //b0 b1 =b1/a0; //b1 b2 =b2/a0; //b2 a1 =a1/a0; //a1 a2 =a2/a0; //a2 b1_0 = b1_0/a1_0; b1_1 = b1_1/a1_0; a1_1 = a1_1/a1_0; filters[filter_ID].b0 = b0; filters[filter_ID].b1 =b1; filters[filter_ID].b2 =b2; filters[filter_ID].a1 =a1; filters[filter_ID].a2 =a2; filters[filter_ID].b1_0 =b1_0; filters[filter_ID].b1_1 =b1_1; filters[filter_ID].a1_1 =a1_1; } void ParamEQ::flush_buffers(int filter_id){ for(int j=0; j<3; j++){ //neteja els buffers filters[filter_id].buffer_extra[j]=0; filters[filter_id].buffer[j]=0; if(j<2)filters[filter_id].buffer1[j]=0; } } static int _ = ParamEQ::register_class("http://sapistaplugin.com/eq/param/peaking"); EQ10Q/templatewidget.cpp0000755000175000017500000002264011322416301015262 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "templatewidget.h" TemplateWidget::TemplateWidget(main_window *m_ptr, void (*f_set_ptr) (main_window *myptr, int b_ix, int type, float g, float f, float Q), void (*f_get_ptr) (main_window *myptr, int band_id, BandParams &m_params)) :b_load("Load Preset"), b_save("Save Preset"), b_remove("Delete Preset"), l_presets("Presets"){ //External functions external_get_ptr = f_get_ptr; external_set_ptr = f_set_ptr; //Inicialment el botto load no fa res current_preset=-1; //Inicialitza punter a objecte principal main_win_ptr = m_ptr; //Dibuix de la GUI set(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, 0.0, 0.0); m_box.pack_start(l_presets); m_box.pack_start(preset_combo); m_box.pack_start(b_load); m_box.pack_start(b_save); m_box.pack_start(b_remove); m_box.set_homogeneous(false); m_box.set_size_request(560,-1); m_box.set_spacing(2); add(m_box); set_padding(2, 2, 2, 2); show_all_children(); //Aseguremnos de k el directori arrel per desar presets exiseix redi::ipstream in("echo $HOME"); std::string cmd; in >> strhomedir; //std::cout << strhomedir << std::endl; in.close(); cmd = "mkdir " + strhomedir + "/.RafolsEQ"; system(cmd.c_str()); //load_combo_list() //<--Ho farem en el on_expose de la finestra principal //Signals b_load.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_load_clicked)); b_save.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_save_clicked)); b_remove.signal_clicked().connect(sigc::mem_fun(*this, &TemplateWidget::on_delete_clicked)); preset_combo.signal_changed().connect(sigc::mem_fun(*this, &TemplateWidget::on_combo_move)); } /*Si el load clika, comprobar k no es pq s'esta introduint text i k realment volem canviar de preset en cas afirmatiu carregar el nou preset */ void TemplateWidget::on_load_clicked(){ //std::cout<<"Button load cicked"<(&f_filter),sizeof(f_filter)); //cout<<"Row name readed = "<get_text(); Glib::ustring presetname = entry->get_text(); std::string cmd = strhomedir + FILE_NAME; if(!presetname.empty()){ std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::app | std::ios::binary); if(!ofs) std::cerr<<"Error: file can't be open"; else{ ofs.clear(); //gestio del nom del preset preset_combo.append_text(presetname); f_filter.name_length = (NAME_LONG-1 > presetname.length()? presetname.length(): NAME_LONG-1); presetname.copy(f_filter.name,f_filter.name_length,0); f_filter.name[f_filter.name_length]='\0'; //ultim caracter //Escriure tots els parametres del filtre for(int i=0; i<10; i++){ //10 es el nombre de bandes external_get_ptr(main_win_ptr, i, band_param); f_filter.fparams[i].type = band_param.type; f_filter.fparams[i].gain = band_param.gain; f_filter.fparams[i].freq = band_param.freq; f_filter.fparams[i].Q = band_param.Q; } //Ho escribim al fitxer ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); }//fi else ofs.close(); } } } /*Si clickem el butto de delete: - mostrem un misatge de text de si estem segurs de voler vorrar el preset - Eliminem l'entrada del combo - Eliminem la linea del fitxer de text eq_presets.prs */ void TemplateWidget::on_delete_clicked(){ //std::cout<<"DELETE clicked!"<get_toplevel()),"This will delete the selected preset, are you sure?", false /* use_markup */, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); int result = dialog.run(); if(row != -1 && result == Gtk::RESPONSE_OK){ cmd = strhomedir + FILE_NAME_AUX; std::fstream ofs(cmd.c_str(), std::ios::out | std::ios::binary); cmd = strhomedir + FILE_NAME; std::fstream ifs(cmd.c_str(), std::ios::in | std::ios::binary); if(!ifs) std::cerr<<"Error: file can't be open"; else{ ifs.clear(); ofs.clear(); desp = (row)*(int)sizeof(f_filter); ifs.seekg(desp, std::ios::beg); ifs.read(reinterpret_cast(&f_filter),sizeof(f_filter)); //pasem-ho a una cadena /*for(int i=0; i(&f_filter),sizeof(f_filter)); ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); ix++; } ix = 0; do{ desp = (row+1+ix)*(int)sizeof(f_filter); ifs.seekg(desp, std::ios::beg); ifs.read(reinterpret_cast(&f_filter),sizeof(f_filter)); if(ifs.eof()) break; ofs.write(reinterpret_cast(&f_filter),sizeof(f_filter)); ix++; } while(true); std::string cmd = "mv "; cmd = cmd + strhomedir + FILE_NAME_AUX + " " + strhomedir + FILE_NAME; system(cmd.c_str()); Gtk::Entry* entry = preset_combo.get_entry(); entry->set_text(""); }//else ifs.close(); ofs.close(); } } /*Si el combo es mou, carrega el current_preset la fila k correspon del combo */ void TemplateWidget::on_combo_move(){ current_preset = preset_combo.get_active_row_number(); } void TemplateWidget::load_combo_list(){ //std::cout<<"Omplint el combo ..."<(&f_filter),sizeof(f_filter)); if(ofs.eof()) break; /* //pasem-ho a una cadena for(int i=0; i. @prefix rdfs: . a lv2:Plugin; rdfs:seeAlso . EQ10Q/band_ctl.h0000644000175000017500000000570311322416277013470 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "ctlbutton.h" #include "pixmapcombo.h" #include #include #include //#include #include #include class BandCtl : public Gtk::VBox{ public: BandCtl(); //constructor cutre BandCtl( float *freq, const int band_num, sigc::slot gain_slot, sigc::slot freq_slot, sigc::slot Q_slot, sigc::slot type_slot, int *semafor ); virtual ~BandCtl(); float get_gain(); float get_freq(); float get_Q(); float get_filter_type(); void set_gain(float g); void set_freq(float f); void set_freq_direct(float f); void set_Q(float q); void set_filter_type(float t); void hide_spins(); protected: Gtk::Label band_label; Gtk::ToggleButton m_on_button; //Gtk::ComboBoxText m_filter_sel; PixMapCombo m_filter_sel; Gtk::Alignment button_align, combo_align; EQButton *m_gain, *m_freq, *m_Q; void on_button_clicked(); void on_combo_changed(); void config_type(); void config_sensitive(); void reset_Q(float q); private: int filter_type, ant_filter; float *f; bool vic_de_set; }; class GainCtl : public Gtk::VBox{ public: GainCtl(const Glib::ustring title, sigc::slot m_slot); virtual ~GainCtl(); void set_gain(float g); float get_gain(); protected: Gtk::VScale gain_scale; Gtk::Label gain_label; };EQ10Q/constants.h0000644000175000017500000000513611513575776013752 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //Constants definitions #define HPF_LPF_ORDER_MIN 1 #define HPF_LPF_ORDER_MAX 4 #define HPF_LPF_ORDER_DEFAULT 2 #define FREQ_MIN 20 #define FREQ_MAX 20000 #define HPF_FREQ_PTR_DEFAULT 30 #define LPF_FREQ_PTR_DEFAULT 180 #define LOW_SHELF_FREQ_PTR_DEFAULT 50 #define HIGH_SHELF_FREQ_PTR_DEFAULT 170 #define PEAK_FREQ_PTR_DEFAULT 100 #define NOTCH_FREQ_PTR_DEFAULT 110 #define GAIN_MAX 20 #define GAIN_MIN -20 #define GAIN_DEFAULT 0 #define HPF_LPF_Q_MAX 2 #define HPF_LPF_Q_MIN 0.3 #define HPF_LPF_Q_DEFAULT 0.75 #define HIGH_LOW_SHELF_Q_MIN 0.2 #define HIGH_LOW_SHELF_Q_MAX 10 #define HIGH_LOW_SHELF_Q_DEFAULT 0.77 #define PEAK_Q_MAX 16 #define PEAK_Q_MIN 0.1 #define PEAK_Q_DEFAULT 2 #define NOTCH_Q_MAX 16 #define NOTCH_Q_MIN 0.1 #define NOTCH_Q_DEFAULT 5 #define NUM_POINTS 300 #define PI 3.1416 #define NUM_OF_FILTERS 10 #define NUM_OF_LV2_PORTS 47 #define FIRST_FILTER_PORT_INDEX 5 #define FILTER_OFF 0 #define LPF_ORDER_1 1 #define LPF_ORDER_2 2 #define LPF_ORDER_3 3 #define LPF_ORDER_4 4 #define HPF_ORDER_1 5 #define HPF_ORDER_2 6 #define HPF_ORDER_3 7 #define HPF_ORDER_4 8 #define LOW_SHELF 9 #define HIGH_SHELF 10 #define PEAK 11 #define NOTCH 12 EQ10Q/combopix/0000755000175000017500000000000011312153202013345 5ustar sapistasapistaEQ10Q/combopix/loshelf.png0000644000175000017500000000126511312151630015516 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  !tEXtCommentCreated with GIMPWIDATH햿nPƿ{}؉IPy XX7tA RԭOѱLU&DթO21SHJ6{Xeرө=xPXec󃃣4sggw`WE8 ssD`g#n0i:=ww?YthyZ H]""uxxd~ڈ9-""ˋ+''*p^D˫τt %`Tru"2^&D]⺽@EEF2qTӄԌ(3֗qnHfBxDnjd0x]?MJ)ur_g"٢Da,,횳"eٶdEFh4^VN_v&l[A )%t] *2P4a4m[[u*J)Eg-=D)%onߖe>|2?hkiIENDB`EQ10Q/combopix/hpf4.png0000644000175000017500000000136711312151443014730 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  %DtEXtCommentCreated with GIMPWRIDATH햿Oaǿ{6TVv11qm0qlea0》V7ƁM@,&)zwukrohgy>>MxL{=ȂsFP(>c =[ֵȂ3^ ̿ `dj2.}` ZQlo}@*PܑYU19OQAX^~w3iau-VVޣhRUv$+M?Q. ~ȷ#/QqҝHbo˹jŷ` #5:,XVFqE bJ"5Z}0[bN$JJeFJ4Ak6[Ƨe4Mc ˲ ۶C#1077k'žNO9a(ԷJzv 眝uݙ{=M/W8{lIENDB`EQ10Q/combopix/lpf4.png0000644000175000017500000000140511312151610014721 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  ! ?utEXtCommentCreated with GIMPW`IDATH1O@>;IC*+dhJ: H԰  CTU*PTEL0v,R PC4 b:TbC&www5_R77\C9#Pej?/ ggmV*}|BUU: !ǰ:0E0>qe],.dz |kk[7 kq "Bݹ<>>U(+C;B@S[Ȣ+\.7U yIC<`<09#KS 2SEjj2Ry`9cs(ɤ13++oG2ϱgAh4C2(YZz_( PԹ |b P9gs)4^VNg?Z0Ed0~`.:tuo&;HH$,m<0;BJ&Z8J,Em;NlY"iP1("Lp:Y%˲ܠj3ǓosΙm3C$6g 眝u]?;Qw|kApaIENDB`EQ10Q/combopix/lpf1.png0000644000175000017500000000126211312151543014724 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  #RmtEXtCommentCreated with GIMPW IDATH햿NP?{؉U2K. ԰ b)Xex?SvB$ b_ӡrj6$v#ږ|sl7kkXCd h6^_~ߏeUz~11>`¿@݃x.4sj/㯬T{&!:99\[GGs͝AD8?,p}{"]Ť3Ǚ[yil6zJۢiT` YJH-MyXWWU(# ^o^oVHR\w4e}Q@Bp*BK(YRR)%'ee+YedFf;ժ99 LmۈE;`8ukJG9F|)y:u<ϛeDsrZR'X)%@>ZW[[gg˲N3XIENDB`EQ10Q/combopix/hpf3.png0000644000175000017500000000153511312151425014724 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  tEXtCommentCreated with GIMPWIDATHKQƿ+bC,*b]F J R$4( H7AR ` 1dۍΐW s~ܘq/d@J)y^ޮs0yT*MBB$syy$ccl ¬`X<31њNg*Złyݺ;:Z$8c.,,[3⽑ dX._(+l}{@>GE |Ad2y- F&iD=)r1JMYϣ\+J!9S R4MMP{{qlll!httF.Ëhk{XYgߛNH䲺0)[lnjH& }>OE{D%tVW͏ X ѰgA%no?@j2S!Jo:BwPJ >4̴T*pxP_j`E6M05nw#dYn@`k$T$ιSzN*syvf(s찷qu9 X!EL@Z!02ero*QCscijHlY4|wd2_iIi  !gdr{xX 12ӓNeeFG!90R?tD/ǺDz5DB$ee*!fg:EP0h++)!|]PC1Fc8ff4mUyW`~ddx94- (`|| Al`0upίhr #ZOP\0Db^XX򝜜^W KZsu{iϲl,R YeY R$Im45Zuҫ53hHMAH*T%1zyY9v!ϐ,$<L)H OD(SU#:ugHI 6>߱ԑ b,} |XiӋY^( uL0Oߤ9J'mW ρ0gg`0r[;p躎Zm{{;\~5`$)899\כyna`^IJFid_H:ݮ<[<cp07P>f\o bfeQ<[bѭRl-RWji`5Ŭ1BFG>3b Ѕ JP>!Lgy{==OUK:-=loRHd7G,"TMU2i!#}d20LAQ^4D& bhhH|H|730 ,4j5eFިŮn%fɰ%cAU5tvv@ڡZ$r9ƞgӴR亵,D!GPfg{Q$E$2#++ P bȲU. ?KRjRJI%Wm/b69-y.p8x<qM#va*2PhM!֊Pn;kko[ "Qa&DQdBd\3bZ+֦D8~6R0L8rDwqa\ήg 1!UIENDB`EQ10Q/combopix/notch.png0000644000175000017500000000123511312151713015174 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  "FCtEXtCommentCreated with GIMPWIDATHVN@Nh/=qA7hO Jq)8 q@8ӧRbw8LF˅"ˑwoƲ/K Vs O3` ͑5R,ٮ A>Etbn,\ C-O1OELy:7OpI?!@98uwwߑhj#bm˃_񹿻ՙ0 pݧ9\Yi^`Hs1ILŕڠ''?!-.B(8|sky~" Q,,9IENDB`EQ10Q/combopix/hishelf.png0000644000175000017500000000125611312151655015513 0ustar sapistasapistaPNG  IHDR#8sRGBbKGD~O pHYs  tIME  !1WdtEXtCommentCreated with GIMPW IDATH햿nPƿ{}IHU0&<H u@TeBT:1SHJ6{Mb1,=[s>{x;;y))5AYi4 U z4#X ?q#D!+H•瘟,-e&3 x+J kkD.!;41(c43 }3ڿfQ+jj A:=U`bbGG YL5 J2\SS`o]]PZBH04WiCGn:Y{{Rw+w8$I$q] 'w`Y(dQJa16 e`66p(19'ʚPYy##/ +,@%JbL$F*B8|+QJSu>;ǧ"Vζ SJqrrfNFW}1Zp8J౹-T(B9N de"CHT [&ξG0;;X_c|5n n>2Z[VW #include #include #include #include #include #include #include #include #include #include #include #include "types.h" #define FILE_NAME "/.RafolsEQ/eq_presets.prs" #define FILE_NAME_AUX "/.RafolsEQ/eq_presets.aux" #define NAME_LONG 100 #ifndef MAIN_WINDOW_WIDGET #define MAIN_WINDOW_WIDGET class main_window; #endif //using namespace std; class TemplateWidget : public Gtk::Alignment{ public: TemplateWidget(main_window *m_ptr, void (*f_set_ptr) (main_window *myptr, int b_ix, int type, float g, float f, float Q), void (*f_get_ptr) (main_window *myptr,int band_id, BandParams &m_params)); virtual ~TemplateWidget(); virtual void load_combo_list(); protected: Gtk::HBox m_box; Gtk::Button b_load, b_save, b_remove; Gtk::ComboBoxEntryText preset_combo; Gtk::Label l_presets; virtual void on_load_clicked(); virtual void on_save_clicked(); virtual void on_delete_clicked(); virtual void on_combo_move(); int current_preset; struct filter_params{ int type; float gain, freq, Q; }; struct f_register{ char name[NAME_LONG]; int name_length; filter_params fparams[10]; }; f_register f_filter; //Function ptr to main void (*external_set_ptr) (main_window *ptr, int b_ix, int type, float g, float f, float Q); void (*external_get_ptr) (main_window *ptr, int band_id, BandParams &m_param); //Structura tipus de filtre BandParams band_param; //Directori del home std::string strhomedir; //punter a main_window main_window *main_win_ptr; };EQ10Q/ctlbutton.cpp0000644000175000017500000002201611322416300014252 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "ctlbutton.h" CtlButton::CtlButton(int type, float *value, float *f, EQButton *m_eqbutton): act_val(0), ant_val(0), ptr(0), acumula(0), eqbutton_ref_ptr(m_eqbutton) { filter_type=type; if(filter_type == GAIN_TYPE) x_direction=false; else x_direction=true; f_ptr=f; press=false; mouse_value=value; //un lloc on deixar el k es captura del mouse /*//Posem alguns valors per defecte switch(filter_type){ case GAIN_TYPE: *mouse_value=GAIN_DEFAULT; break; case FREQ_TYPE: *mouse_value=f_ptr[PEAK_FREQ_PTR_DEFAULT]; ptr= PEAK_FREQ_PTR_DEFAULT; break; case Q_TYPE: *mouse_value=PEAK_Q_DEFAULT; break; } */ set_button_number(*mouse_value); signal_released().connect( sigc::mem_fun(*this,&CtlButton::on_button_depressed)); signal_motion_notify_event().connect( sigc::mem_fun(*this, &CtlButton::on_mouse_move),false); add_events(Gdk::POINTER_MOTION_MASK); } CtlButton::~CtlButton(){ } void CtlButton::set_press(){ press=true; first_time=true; } void CtlButton::on_button_depressed(){ press=false; ant_val=0; act_val=0; } void CtlButton::set_depress(){ press=false; } bool CtlButton::on_mouse_move(GdkEventMotion* event){ if(press){ int x,y; get_pointer(x, y); set_value(x,y); } return true; } void CtlButton::set_value(int x, int y){ ant_val=act_val; if(x_direction) act_val=x; else act_val=(-1)*y; if (first_time){ if(act_val>0) ant_val=act_val-1; else if(act_val<0) ant_val=act_val+1; first_time=false; } switch(filter_type){ case GAIN_TYPE: *mouse_value = *mouse_value + (float)(act_val-ant_val)/ACCELERATION; if (*mouse_value > GAIN_MAX) *mouse_value = GAIN_MAX; else if (*mouse_value < GAIN_MIN) *mouse_value = GAIN_MIN; break; case FREQ_TYPE: acumula=acumula+ (act_val-ant_val); if (acumula >= 6) ptr++; else if (acumula <= -6) ptr--; acumula = acumula %6; if (ptr >= NUM_POINTS) ptr = NUM_POINTS -1; else if (ptr < 0) ptr = 0; *mouse_value = f_ptr[ptr]; break; case Q_TYPE: *mouse_value = *mouse_value + (float)(act_val-ant_val)/ACCELERATION; if (*mouse_value > PEAK_Q_MAX) *mouse_value = PEAK_Q_MAX; else if (*mouse_value < PEAK_Q_MIN) *mouse_value = PEAK_Q_MIN; break; } //set_button_number(*mouse_value); eqbutton_ref_ptr->set_value(*mouse_value); eqbutton_ref_ptr->set_spin_number(); //std::cout<<"val: "<<*mouse_value< m_slot, int *semafor): button_align(Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 0.0, 0.0){ value=0; f_ptr=f; stop=semafor; ctlbutton=Gtk::manage(new CtlButton(type, &value, f_ptr, this)); //Aki el isX indica si llegirem valors de X text_entry.set_numeric(true); //nomes permet numeros filter_type = type; switch (filter_type){ case GAIN_TYPE: text_entry.set_range(GAIN_MIN, GAIN_MAX); text_entry.set_digits(1); break; case FREQ_TYPE: text_entry.set_range(FREQ_MIN, FREQ_MAX); text_entry.set_digits(1); break; case Q_TYPE: text_entry.set_range(PEAK_Q_MIN, PEAK_Q_MAX); text_entry.set_digits(2); break; } text_entry.set_increments(0.1, 1.0); if(filter_type == FREQ_TYPE){ set_size_request(70,25); ctlbutton->set_size_request(70,25); text_entry.set_size_request(70,25); } else { set_size_request(45,25); ctlbutton->set_size_request(50,25); text_entry.set_size_request(50,25); } button_align.add(*ctlbutton); pack_start(text_entry,Gtk::PACK_EXPAND_PADDING); pack_start(button_align,Gtk::PACK_EXPAND_PADDING); text_entry.hide(); ctlbutton->show(); button_align.show(); ctlbutton->signal_button_press_event().connect(sigc::mem_fun(*this, &EQButton::on_button_double_clicked),false); text_entry.signal_activate().connect(sigc::mem_fun(*this, &EQButton::on_enter_pressed)); text_entry.signal_value_changed().connect(m_slot); text_entry.signal_value_changed().connect(sigc::mem_fun(*this, &EQButton::on_spin_change)); } EQButton::~EQButton(){ } void EQButton::set_value(float val){ int isota = 0, isobre = NUM_POINTS-1; bool OUT = false; value = val; //Limitem el valor dins del rang segons el tipus de filtre switch(filter_type){ case GAIN_TYPE: if (value > GAIN_MAX) value = GAIN_MAX; else if (value < GAIN_MIN) value = GAIN_MIN; break; case FREQ_TYPE: for(int i = 0; i< NUM_POINTS && !OUT; i++){ if(f_ptr[i] <= value ){ isota = i; } else OUT = true; } OUT = false; for(int i = NUM_POINTS-1; i>=0 && !OUT; i--){ if(f_ptr[i] >= value ){ isobre = i; } else OUT = true; } if((value - f_ptr[isota]) > (f_ptr[isobre] - value)){ value = f_ptr[isobre]; ctlbutton->set_freq_index(isobre); } else { value = f_ptr[isota]; ctlbutton->set_freq_index(isota); } break; case Q_TYPE: if (value > PEAK_Q_MAX) value = PEAK_Q_MAX; else if (value < PEAK_Q_MIN) value = PEAK_Q_MIN; break; } ctlbutton->set_button_number(value); //text_entry.set_value(value); set_spin_number(); //std::cout<<"EQButton::set_value(float val)"<<" Type: "<get_freq_ptr(); } void EQButton::set_freq_ptr(float index){ //ctlbutton->set_freq_index((int) index); set_value(f_ptr[(int) index]); } bool EQButton::on_button_double_clicked(GdkEventButton* event){ if(*stop == 0){ if((event->type == GDK_2BUTTON_PRESS) && (event->button == 1)){ *stop = 1; ctlbutton->hide(); ctlbutton->set_depress(); text_entry.set_value((double)value); text_entry.show(); text_entry.grab_focus(); } else if(event->button == 1){ ctlbutton->set_press(); } } return true; } void EQButton::on_enter_pressed(){ float aux=value; //float val = (float)text_entry.get_value(); //set_value(val); ctlbutton->show(); text_entry.hide(); *stop = 0; /*El SLOT te un problema amb la tecla enter, el cas es ke En premer enter no senvia al valor actual capturat per value sino el valor anterior k ha pillat el spinbutton. Amb la seguent instruccio forzem el spin a moures a un valor k segur k es diferent k el seu valor actual, aixi la connexio capura el valor anterio (k es el k ens interesa) osigui "value" al final fem un set_value per restaurar la resta de witgets i variables amb el valor correcte de value */ text_entry.set_value((double)(value*1.1+0.1)); set_value(aux); } void EQButton::hide_spin(){ //Amaga els SPIN Buttons text_entry.hide(); ctlbutton->show(); } void EQButton::on_spin_change(){ float val = (float)text_entry.get_value(); set_value(val); } void EQButton::set_spin_number(){ text_entry.set_value((double)value); }EQ10Q/EQ-10Q_bakc.png0000644000175000017500000054526511313214464014111 0ustar sapistasapistaPNG  IHDRUcisRGBbKGD pHYs  tIME cb IDATxyeY~ܥVWUWjՒ˲d%[;x1;6 KLX f 666 c,ɒek굺kogs $wε?d=le9Pka~ HFE52(=vq)_*vFvE{RFr4e^9xG7V67mnp#Nz?r< ^;ٟK6)ҡ\#V6/W>4夝?}]-^oȋ8/, ζY͙3)ڮt {y {dV7Cܳ'Jvr VHY~;kgd]o1;ж_|;Aւ7CϓOz0"a"'$>;\?xf* CFWi&Ņ,dyHP1O՟R}ܩϩS<쯅1`W\w"4a0'~M 䴻&hToR/Mr^u .E 9@qF z@kػkT,{ T5t7R27KSIˮhz#ossԸҕgJ +55O}\yj!fφ_"-jdn1, V2~wQsb}۝þxȭgO>lm^kǗ7VCKq1 ;Tְn0HϝջTθxMraV潚+rV[dCxR8p-c?%e<F9왜d ']'Nj,LP+$ЅeBO!8dbHyƖssөKņ, oyЩRA%*-R_\AdJ!:DdI딏Wo,=3wgwBBi:, u.Ask\?SH[-8jO.߷̑廏V.UKS^X]LU͟)Y&LXmԲGb 9 :Hb&Xj!w izr>#˝dFVr S=0fHYE$FJpwizfZcHfb39vmQ`ɵ"!5] M- -[2~deulY9t\HPA$n%k^w|">^W{?G>F0EWO0NAq1U頱RO%߄L quoeS CFʡB?PI9ja Xy*pa$|j ɤK*XَHj#wˤ( [ج~5"g_g:_}/(/5o>\eRɠ+H02b|-u6MÍ v9-rKA>h(+b)Í=@6\=(}As@D٤78zaCUgO1DuTkTrQΑұcI&b-k,pzLL*H.!vgSjJ(1DA).MICfL$Qêh܃yb 9ZG-IeއL!5sMz8f6 VmGߗ.(`5p0=M8kۭGәr'|a+/G7ة ھLim vP2m*gvœ9<9ePdg`ysFd꼸3=V7zJv0d68&9 i^9".d%=U$Ĺl;M&XgנkɁ2{8'dt~!ĸ!^MipvK;~; Ӕ}FC`S`۽; ;ϘR=nn418:m^czf;Cpy͸F7Gu?Y#:Qr *;)L?XU 銰!n!sWOBCڮ)~^9{L@5旖24[qF2<ؙ: U% %fOsy/$M/cB&oQƄˌhIϢ* |NZAWs-vDZaN* 5d|5,y Xo?kW []"uQQQnNnc_LҼ!ǁsMR!OӢ\1(H) s O_%L` >d7Ȓz It^3V'vVn`̴YԚ ,3Q=L(g,wl!`xR2o [[WiBX]bihfͨA&9q*eimcҴB7,oL^ك,Kell# t7+?AىmT, atvch7PV6Is[\4F8y 6pt}t;=,/U/ſxk̅g'џQgTͅ*7gP KjMKL,ېhd^N$Z(en(9pQekYtҶtX{@#Eru`-,.'־DTPw2vTT9b[j$("I`QM4'6ˎ HWv[j28aلkzէ8}Aֽj I8u&Fۧy GVg*x}U8t e" P3S};MXd}:cND{IaWY<2xll'{oXoKPUlzdD쏑ɚO! E՗_;i\f1VDz`˝BP)Ev5Q`i D@9;f?O ov?5"+m5Xe#ݗ $(s=XUU\X \-#ɱH9ٻ]S uL ϪUFcSs¾Wnf/$4JS!Z8.ײ ~IZ rOHL47p,GXfxb|kV1}^lt xBFi4nmbkA###Sxh]߳D;d!MJ/0p^ H:׷x3bzؙJq7}6e}^uV} GO\+rXjs9#-by FdO)q5~sXY>Q43IӃ9DzIbIUGrh=Q6G!ֺw^U26nG"[K7K(7`NJ̮ AՓZL!fiOޘ--)MDTT|&r"7YEg`J$xkz6<̞n'g,;F|Y.qT;+xh[ZGdSE!US*hLҘD%,]7sDTʄeQtYfr[&ԐrYb9$ʜs4և4pb?kQ͜ 9P[}9>{(TS7 h-R2#y){s[6&Kq"ڒryBz)eW.͹n9a;Bz9%IRGqCd8?i&s@Wz\:6՟4JFBMJ ELZ^s2s\LDcS>I}15Z}t]bJY7i%9{&KCk Zdf ϥ<0eRx h]BK&VW/`mr4lnc0=\͍Ulm㯏?,e W7܊W_tk}L%֔9:TPH1 45S2VVm!\p PM@H`J$#JƁ<9<{!S=7YJQ!`7ֵh"lev$TyMD麨P3بXITPA:S!sJdMCU"_)^o2Wj,b﶐7_~&xa`E[FD4,~ޯHA 6M23Fʥrsֳ0ZB (Դk ATV9WPϿTg`%HUԑtӕ%ojHrmjO(lR±F"M ޗjzِoQrYrNhyb&R8+,o8N_ރ,qPٱFmk/; M$* LЩTP9a85"bP2 *B 99WkA)K%|vLwTHdX]'C#Dud#e55K yYd6@f'/UhF=X]qҟW5R/c}n/v9ӧEB Nx g͸zNM/1pQP5WgVԢ$T6xOutͰxRo=!.)8^JVЍ9rF8ut\'%.->Y!s$I3$I߀?#7݂?}/G?Y7 p 'O>~‘fMx'$ :i$I5"MSyl8Dj _q5ֆ#t8y#t[Wvl_8͌GXpSVBBvҾ˼N-|џC$+IYޯKs\I FEشr#{@1mfvڕjKU5;myf/6s!*iD ExFF[S_&Yt8>qoԙ%U[Nq4шL@Z;IvD8D6b0@xA0OT|_2ȪH Ck!& l"x/OTO ZajS*3FP u\2ұj}mX5MKAvdVň2T$8`E\C *M'-BQn)罢rkhjkq4f (l"Z/3K4d۵cR2( ,rT Yy@ڪTmN1súR: ۴4Uzv@V? i 3,Il qm㬈8~ysrbI(٩*SM|,(j:>[wm@aR5'7O$)HY͂r~a~EhbmH#Gk DDk)$+ 3AYaY(V{y1ހd} =}<˸כxѻ/?pXqrf?Ҵ#Z7y6Q>'Ip2@]69NL(%I3x~8fqGǢ܍hD<ːv:H;)X9󳇐$i *+>DžؽgOp('iZ9)MT{yln04Q;!Bv1mbnO%$ !8M~b.QиNݺPVg$#u*"w +}%7jR uiF՘lx;=꼐BZ$[s`l+lȆ$+L1]sy& E VZA ܳQۍ@9ı 7Q2^ A:2"$+jAnC8 |d Cw׮{X:fHTán+B[LQU 5JZ8%lsu!=j? yܓfQ5ϳ$SMSylg @*s72 &gۊO&K:MPH8i:hTV)hSV(n9_qi}@oUf p@OMQ%Px BJ:>E~=5;x6`f~.g z}]| 2 Bl5!lNz&S'"gIDLFޥ3}ȥx~?Z},/чDi|nމsj՜,6^Dvsq}Y3Y:P1l4&~*&i*%Xuu%b*GZ ՙ0€+MFqx950(Ќњ m-pvMcÄ?]'@ K723]kBy=Ll b9%&ߏ^Ӿ懢D\1v2 eza!38=`_/,M mJ4S4[iQ%+.h(N3a.w"׹A߱y߱0rx9i8L':@Et^US8p=\u5.<ASy;>{NO2|-x+s9 Es Io@"LMRXWoma$;hvh3u$I]pbe5b?98w4*'4|݊JtKwߍP^^ b0X((5ְFÍ|rnR?ַ`4"i=0 W]{tU:F*.ߎsK>ii_J?F JpuE{@{8޽~zpma:{ş7O~lzBb3lwᅮ9ĽiM9d'L=|'G: ߱~@#:6\J,llb7*-Q=t1w"Wz!," #j%MDSn(,oP)oQ]I~);BkFc͡nH9?[SM?a-&rH T( 7@pBʼn!Gુkũm=\v]<16V`-Xbq[R 2%:B jH#]@5A L$jfX!+ 38&z4]?4bHKG{72U(q6 hTZg^~R&@k2-yR)22Y[Nt~g=n^Q`ziVԑܶITO+j:: т BZT NgzGawʳ(p,;`!.dlЖ93z'Ft*Ur`{c]!qR UlCŒK n ۢ! \G6azz<]y]{Kw|_U/A_՝[n9|%q?[ܗ,{ }$ȧ0==剰|pk5cksms΍3zq4;p$3 `N\BDp[]ohg>ϞAV837PtR Gcɏ}Σ#txGU'~ ? $yҚq&ԉ{omm[ڗ}6F8>b}cvpMxgNK|9;M ~/o~3>pǠ|YU#"}s۱1Dpk'HlW8IBx15/IfY{q˾~-O}K׾o/ +OLxU1W|e?s7# AGm|'K,~~vA"̕- zHSP {1[ $lៀ8JnkGTIsgQ66I8tNO T U^9~Qg6Q`B=_;;`,e(Ϝ78 TF죵-Yv[hAGd_ea̤j݃I>GKڱ0v&4¨`@$qL`xsyTuV>MI->ŚL$5vjtC,3qresZT'4I'AVKY `O԰؊m;t$·ެdTa ʹ*>C5k-VBhX:Fxg2pZґ"KL=r.E!{,á N2̝ Z# 0# "٤G`ηjvHMDAptm\ -5lYeTڀI4KW "J>—X(yE:|l`k#k`4&( yJ "5L3gQ ͡eIȵ+407kXY9W9\s7? _8tۇ./|^niFa1D) ʫ SlSʐ2,/.(r$I " M,|Uhٽ MM_ Ѝ%O;`fi Ӣa㖰;W9#@PAe8rxG0]Oz$t:L#M}oFUflnn &"t:C=} yazA%Gs" _|+rxP[ӟ8o{=~-oOV_ e@n*7eSV%#@.bS^N7.xTJ2 8l5;wb&"-mF64[PūIA,3,!?bY3}η@adL F!`ɵCW+Vݗ כ05A"fZk2rnm $Lz;dJ1DFvfA-(<.#!79԰=Lr*$ Db~sH bv5eS"H |&EIb `T%7} 43R.DN *XF僦!%Ki졨][˹To¡f5Y˕,41aNL%3uOgΦ$t2Qje~ $%'5E+"Vı`A(z;ciIe%=q$8; z[""YV[i =cd"G 2H:];eaΚFfYEVҁmTӬVYjy.8Efs04T2;nM5.OsV) 9RV>0G@c-r֋yr=7ԢRJR}a,8K@e`$iwL ,Uv 1HJ&֣_z.x2M6_= V^D>:23Sz*>_/]~) ߈_2B g>Ylll I3OsoA_s_s9A8?fލl4R te~zpŗS| 3 B`)t:8}%xw罢X > Vj~la~8W:S_*u߄{7yY;sv7\$k{ #7}h.WT#Kʏ%C#(t@Qk6R^?OYl=[2ҼNult=+NC `Yvii(h5(+t}9ka "0Qё8&#yp:+t ^IU頔0B$f[s8, %}}im$(lzj a[-t+N]Ӧgmax`!VϦt&mmݐ3(KCI 䪳:dοOdBQM$YNeIfYE6\,(j,gQ0cT9 pZq5-<{tvJ,0|6iӦ{ZY@^V=ASYf0~; R~{vm>,* dn&-f+BXI16c"h9eyzY Ku  <4FQD9b*PB2}O.E.ôlhplu0Kj)Q%u` ejŠkhB6-Dd!>[L:d,خz=삡α*6"~Q,YDI>-WYRjQbgimHX<r9x/@x^}#Ss=X7p1,<@/nra,,F.+ѹ~߄ſ<殽^8|1?=p,|q3 ύ4@=xd!d,19ޞDF*~|((y#^?H:*\:gDFr,73#I;'>9Z.#ev.5 GbQ.%\f+.EYVv3JUt%+kPN-#5x )Wk[Fl6$Ne]/fQ$zj*eϾY Vt8~պJ{RL<,]XNr-X}X66qBuX<g=b)UU7 YbV1@E^+d!KxJoa?`"XL$G/eJn*g; SeP'WϛWF*ٯKXL5 ,.6#`\W]B]#p[%N.@՛Z9a]vOzcz1Ϲ,wS:K'ee=r{oEKf=rf_ RdpWJ ۊfW2p}א"0\ i]Xo){YN&!=OT(m=SYaexʓFa*I&~lrd+r ۫3ɳ7_yίKsJ-<fY?[ʵ)m!fU_=id/W;?~<|Y<0.*e8t嵸|"\wr`\g?FpCqGݎ=tNכF;@7{Ϟ0Muoɏs 6.`u4|( ]Nn:=G¹ \DvFڔY$>ӏ t}u7^IQ0'Nxvt'OއcOރox3}Y.eY>$I@I3iyN~r_:DG/ {\F{|,ˑs.pex9_9 XY>>k紨+FD%lT"#ioV ͠esv{\C,*+?az$EBP[wKRyLMO3L ZXbI&N6=íT[-#bH%N*#m8\_-Hcm}U XP=ߤ т[~J2XN"HUNRv2a)@6^ڏpq-= mAvMV y(*ɾ':Ft}Pbnwj7[,@'~]l;fLMY#ϻP X x7\:VgҎd"zYA8 ٟIl*(&~T2H4Hdl6 Eoa#G=m=*5 &pa Fm_b8N6nUِb 20vRS "ng}M6Bw2P>{I]ss<Ö IDATSaN6FCcTHF# qvu ?5/}݇{eKOs~oN _\-?;3*YH;@C?ny">{quH.,E{q5$9$ {a~3$څ#]pT9z[[XpabK

ATve&lQȲr,gs)/ˊ2_V?l%pG?Jl/o?IN:Y+)G*LF{G`6|8\5~X7dBJ/t2U:50kٷ<:EͶf>*2mXd mh*2>8FlN4SZY+=ѳ{tcE"~ U W$JLN)T 6il=uԵGeFg糊ZTf,tOܒDˆ+hՖ7u }vedO Aa%Y3ؠ4an8(vu.)4l2dX"V"llU2Pk!z9G]oJ<"02RJJpSkfZ$ޣD W@ȦP˅ꌘI]sĪ!)̔qvs woUCzbA0iB2)XglubQr2:ڟyurLXa@Fj:S\gw3gAg0w.HHU$A4R?G4W&1r+k&Fk]~FNYi-ܙ_U#,'tO=qcׁ+q-S/||Q._ʼ:خc^d1  xNzvʕ#AœK![9:g16&q6ɀ`꧵21lEln@u[̸~E  ٧(#FC9$<J#?x9>,_oV _>ᦩ)|汻p97-(+8FxSX]!gpu5DXK_UxTѾyh +iᨖ^_:)yկ|޻|ǧO~\e#MI Ovp xst966֫q RRuKٌ{t2g?s2LF9$~ȳ`gTeOXY`dpGs&ϚPA+xU@(r 5-}CeȰEI i9VԿXe$:Fގ? 5*ҷ #2ERyN?軃F#Y$}xAfUhp ZgRUivS]l s84> :ii'E#>P}G_0{WV*1ފZ|^$;Y6ݽYcߓs;£IҤENb8X\ZFA-Nt J'FE?`n 4IՌ=Yb- 2]J-xT!ėHª Yᓩ\ZQ~(&)V@<6͆gdv0Ũ,strO.F)jn32e/C4{_0'@e>i~&qe?^*e 9@8#KQ[r'hgcW[8A=5MZE%ɆLI@饌^76?~exm2Y_gk0FQjOcfbic%N'e+ Q2= EAZll#!~GbݙD:M[9ie \S͚]Cj5` 7Jc)4Vڊ"yʩ;W&Ե3Jɋz'ol7( <[v *ڏ$)g:9\i,$WPXkpI,+ KLAto#cRS]]Q&Ğ#aPPp- W;FmzMGFCG@O^Vvc[-i%^V0fYs$T*&vrNX#/8BAPݩ=d-M[3:RVYZS`hYb$' )&+ ȘB1Zξ;ʭq_t8a| ]Gxc%ּi,/Vϡ x~ 3:-o 9br0M<~ ,VneekKc@VVcek*i3ПEe3!In!I:)U`U4/{A+T(^V4 뮂H#WG1tQJdOH:e|b`WpꩻI `ti |s{c'?sG1RE7?sJ9\e8|WGߥ`7Vq#_W-1;] wןAv15=noiNo 15`no4:>NgL%e.AFR8?*Z9`t0^SW-é*gO:lnOg f&;MR,=WP8pP?v4-˖dgN㖟E/} WNG h4RsQ,,??`ػ(v 0=U=[y~4M0$;]c9hIǵh$kYǶM$qs6s݂B$YRP ˮ:V*TfJZ7d@AM(eIC7u2Ǝ(Lhs;qQY@0r8eR_;Zfm4U#Q+gY*J\c: WϦtO:&{0JIrLEAṔHh?6C6v5`K' z7].Au{v3JŮYT0 G5CV׶r5?ѓβZ##ysF.)m'e@^!}q:Ⱥ!d$Ow 13 ִg=WUNԿu;Z D>x;P+Il z-3P'jL5oƘeWme 0[o-<6VFl {-GoQ7!9067Wh4^r61:p8fz9*$䉇qC8#X]>l4D7=i\;~/}FY#ϹYęJcKۉ4z# 0 Ub L,}0*4=2t{}deF2Npr'ڻ)\vÍ;Q6Dk⽉O?$rfiW_w=YdyvplԉGOOa-?/Ke=ceCrЗK\v`z M03w9sx`Z/2LO3c5fv>$`lt)ZAt6>36سI<.t0~l*mKlŕY:`#l9zl6}eUהKl6̨KAͺo5̠ COAĶ4vdzMSx"s'XG>ts4Y64ʻ,(rj=qgQ,44'|8[Έ$+31Y?Ǥ C\&+r9vl}Վfs19lzSՎ SO>:(:gđFy#O)#XY%+:Zfl.BYǕj$#'י=&|r̞O_ۣ9`falkWF3HpP?a::TE.C "8ϦϏ+a/b>ʾJ_Mr(aVl+ yT!F!н,tXq9|N>pJG P߃Dq =qQL氪.( B?\ .-9[}N={~i\s7_&]:pZu }'Nyh]sp58p*jzW_ׯ^\?g?'^gN>]-m<$r҇KȪ$lK$$`aaҊNMf75@b0S;%K. ̸kȝ''?`0x$MЗ4 W:~ደk0b`vn^ʋŘ} bz0Fv]UH~iƎ߄S?9;`:y×ŗ\R 4={I;`Ϋo'"Se{]|.9|ؔ;ɠ\43\,_<ضLw֕fKBFF`1< hBA7]i;Nw8 "EI:]4Ʊq0#dɺgg{}gs NT%{^{w<%7 =BVu g䧖}/P6*!#Ғ@.MSINy?gN]d&CN20z]`l3*v-Oo]o}217"w E^ ,?o>J*X}FوdM)cf_Y*5IJZXkѵusR I691WycիǶOI{u`/q(x]m5e0H{5uڦIom{sU9+oPGIN>mDl?JR_ 1̆Dmߕyu/|ŗXtI^HcyUo>~uODMݷyYG_KNy]YKʝ/x +ӯOG?o۟Bfן^vkoZ'SZ5?Oʯkik_՛&W^okz=Ցk:Y\xDOwieH%#*Kx1QJmn=1M&M^vn;Ξի#?yldRjc?CG|.O:+Z^^x<:u괞rtIkkkݟ' [L:}z|4?n1-Sm%ѣz=5կ/_~~Y_G?A}WX=___ұ7kd=_g#fiTBj4oY32=ӽ!bf2VA;bgq;Jy[Uub꼷Bn̪tk}*u79]4ȕ]a!;l%ժ cnUxUγ;)f>%_IzcCR*xۢ&:>ߕn>||i$YxiM](?֞mqyfJP`!|g.7i1;}PweM=+iV^]j=m >ߩy@6A1Nd T?w,Wz-6Sz߻omq b\8M67]^JOSp-fHGiXiG}; v.&mDJ[ϕG逼M O?]K>~E &h.f>&676J[?3k˄yՁ5[}r_ŵL&En[`1v;OIQ7$Q%}H~Y-YDȑ˗u߭_?5/I&]z>}Su_gnS*#,D U7{ө֟n-zSnF[*ztcS[g?W?-?_O/}/tƧx?7ٝ[_w?ҌYZLYW!ɼҫӧ-:pG&{[4j͍nzz]z{ޣ{ZZ~&g_gOh4wg%_Ow94--tpZ&z˴~|O_W~3Yn7ĬX^1]o#xϾiZZ^꫇{{/?Ru&>{?=;*@z㱞o6q׋]C}R^/ҿmw|=#tzGoOV}{[RFSi"ٔg-LBWW}JW6خ%,:7?F:(>dfR7n34CcNoW[K8οlwSUt@1Vmnkv11YPs+O2w$] ɡ#ij#gt/*Tv~5»qwc5sZ$2ULp`ZEV*!W]*_2Z-F;OܪrZH_VS)>_:x1%Ó~"Y%,:˵WPVfhVBiaGU_{  nӀBl/?16CmS?7j_6*pc_wVߵaqU߿*lUvC S=@uU%jTNV MbٴvמUKXߕ$6~΢ir˯)͚yG-Õ+oM0:1HRhlⶅm?UA_ہ|)qMor[_ӲOSMZU74sj~omAoX|F_;Ů,s)T3OZ]6h}n뮾9m~fOۛWMO?_}Ǜu⮳:3mwܥWt+}=oթ#BO i)ݿc'O2^]e]2*;aud[{{nkk7h{k]W/ʥhs֯^Еˏho^'=W]h}7ikk[.^O^҅'¥+:骮nlO>\91;'>VnڱS2$i ;O7='xB8'=GyL/}.=&7j5}3kNIlݝ&7|b*E].w:Ǻ/&v-I.H+I^StLHiKvdmddقV J7v;)C޶ cT=xi?ϗWV7._:s~ݑ~}o_xHmxv~6n2iooe?nDK|O:qU^i絷S|rZIW?W5^uVy?\?m-ߪmjd1pgq-~W5/.]xXkeeY?&I?]n!t*'O&۵~y3i~Cx#$VWVukyeUkZ][xw=YuitS w)EF:3kksS}죺x֪W/OvF6{U]0.]}ϯy__U} X^\PcǡCC|m,Vm>MS;/jv${΋^Q5q7^ $Yiw6Nմ)j5-Oo lV tc.bO-ht} |c'?w}f+ٜG4MVr?shto4ϹdY7Uqcl})]5'@&Oz4L ,=d9,\uҢRkI>s`nvdJ+hA Жc0(n{Lp疲Xne߆-mSYIׅ`=,{m,u&;wTg_C},R/Ix-X '9<2p>/0Tۛ(,# -\]8b}LKDCRbx.<3{ˁm;f{yт-j#Er3]7SMSmo]dk][56릓>x]{ ET6 FK޼#9<0dr`d7[ktϻ?ߒhdɎK^knѩ''ЛO:YLt;O=hoKQȴ6ȴ啣}Ѹ0:,L{:q´~.]n¿mw_||𻲺ڭyw,hok4TϞ@`>Dӽ.=J7_{2FFd-pVqlۗvb Z&Wl9O?ؾ?5Iv[ _N{'UPlϓ,&Gֶmj Tp.==~g .([Wm'R)=ExrgqJ̳{.{ W"u\dm;lUܵ:.Us̎d7$d:fYM%}z"(J9zmkv@z#[ꞛh7e70|pb LNKcH5n_%dpԍB4Ǹ;}UXrgK\iۉ>ƺGamJ=0"BĶ-\W<$}+*b&5h_VL7q28L ϼ/(=%Xcx'B(BI1e;+1# I 3ӷTNvFX;[Wt\?Q^;?^zz֞lTwLh<^ʑ٪[x]xN}_./~EZk^;/wnHD?—魏=_z^zWkWpVWuC?%8mMgUܻ5)gl\չ?ɮWV_>'/ }=c7ȱg0!CX圖=ld97jčZ4F`k._nz}+W3?73ln>_ɞ676|9L,j֥`M?=Akor7˴}Ο2nqd)Xs⟏bTTXUSNU]-pXIYΚ7zf?o{KN?[͹XXQ;nL0!ڷynWKTg]1@BduXܶ:->=IΣt#haԝe4er~Ī`Q* I7ҴjNN/d::D`eZ1w{6㮧dza}myh~0M D$۞nGժ)Qak.e@_ugohRZ2o&mI!|t%HK0xD]0'bOsQ͸ZE%7`9 vɞ=w͘Y5esL$fmT*~jBj%o~N|oA7ئi`g#I뢾ăg[v}7em qmмmu#^s[`Sn"X\3{/ugݤZqeZ'?})E vqW+kVO>UaUvIsF&v_]qf~vɊqINwk{_MR=+_׷Oݯ{D~77.]ֱii>tZ[U}*jwvoo>x w&:-лm\ԝǎғkgo[#zޯjdVִgr6nʖTʞ&ڛN7n/CUi೯7i4^u򚎞Y|z+X{tíiMmooO&ZYYd{[+ǎFcXigwujk֯E_yBcZ|NWkcvwuy=t--ٞ,+0g7Gb8Z|wlPV0bQNFU2uzgm׎_Rf]Xq/aliφ[%-%9.-HU&KϋfchI]'{y\Ykg),ɐɗxw:TeI,+ʊg,- ьX>nV}Z@a=NepEۖ.PǠ$q)Ԕ`[0FCuwB u=(4KI!\j[@lTq7Bh*rW6jJeU T/C;w|U7L ࣄ4aRXwjΆouRw5ڢ( )y@۞j&m(fYX G`b6h;]To>l'ovw>G6utٳlSQEbKKN֑b,njc^B?XJjJh69ljVSj/ }㳞O?ڊprYM眹Y??[-?*VzfѴEL&:u&=zo IJS>)7RT4)/}m|m<%??g?c,῕h{[ڛjٻ]4ݛ̲͞~hiu~IZY6m_3gtSZ]^ҵ'~:DWkOCkwwt{SZ"V{i:h:2;Q]ɎNtˡ>ҧ5:rV4/4Fvkv5/YNz%Dnmo\O_+7N_c?wh M~IGN,)EGNhE=ޏW8F*2fGO&^ܧ#{_yQQǎ0{nI{{^[WIgV"+m4xJǽu=*'w],YgcT{{${{e}I9YzUٍd9[6ijAjzszഞf g|_RYo)9hŭwBuŒ06pG.r '+%|:B\rOc-5^#D^E:ܓ-PO-{U=j6r;p!L7\1쬘r:G'dg'-%+;^~>-.\C.E9(܌[ IDAT%0P 6%Vwx m6]aX^NŰjx63VLmz̶̟yI=ˁ^ϧ8e( RI24'߃=[kuX?<%doI$&C;Q}~F}*Bދ{g{G|+}SO<4Y<%;T%ܗ Ť,@fAmP+GuukS=K:9~t iч;~? /~D˷mZnG<-/Utr4r+lǸ 2F#}d[?Uߦ/y]I]9i{uoҋ^e:{ݧ>bEytOӽlp9idGWk9֎hcǯ1-IL|y)ADvwyQɶVVԑShgcSN+' ,di긺Nw5ԳXESMvyvh4jksCGNƺ&{ZZ^h*٨?ݛh7>ӽYI&;~FK+dwt#GOky刊&ݝ]ԧҹ%-kvr'A4Zmvv/kd{;++G%U*Y]RS~JJY쳯hdґiii=U=Ա[C xP.&FNy%5we͘nů(U4ޤ/Z:QJt,M'ѪՃf> NQ.VUxX*wQ|d| Ue)6e쾇ܒvkWūJ>{s cVP#gUW&x} 9.o3﮵;mpM!$gƟ(]ZUy_uv<ϥz=LѪ:o;dfjw\s BI yUw3?1vѨގ쯵)[>䛅k hYtW> voߢVB:S7yw' Zbj:Kum͊xJVx(:Őװ է8[kwt8}Jm(J*nj ͭV>c__N۾XvۯNqoIKI*z,9:)Քf;njU]9.N7>hjdp| JWedY=Ӫ_:oi}ouky;Zq_=|#?w{tϓ7?+:v:tE.rؐ-IJ-KIRW֞kwZ5#Ġm~bǽj\BZ>[=MyOA~kw}~IRUI>qOn !vQ,I@_ڝ]~[iP\/(Y.a:wʊ_&kmnН+ydYiv0˯WtN,-,+8g4:SeImv̵Jx&bx`l}0sƖƮ6qDS.lOuE/:_P7Q<~^r/3mԒ_,>Ү6?bL똰t^ڽ=lI%)#ˉ v SB1l= U*y?p2Yż^PJjy}- >X5[->+~Zvkܸ)jP/ZĔIԅjlq@[W>iJ)T5i]x =0\\ ^u,j,)IӴ 5R?X5.L~ik'լ 6U< v6g>ו'u7ӖkU~ig?M^{ݿ:yV,';ڸz^'N߬n%;:pQ3Y?XWudW/x֋tؚ>qzd]{;sGO{J?1 (IƫoGmt;lN_*W$n^CBߒH꾬^K88~Lm:Tw0z]pOwImHF15Dল cRE0ӨmaSsX޿LIz!f8#{5ʑi)/rOQdk'j@#;4]q3kժxqv *jlJz^o;ժAH ߵ Ov3/Vg;V'K;јn4-Y&Nf/ VbTe]=JI_]ճʲ}ryEmi2>ՂMW}u[.ɂTJ޽Yݻ? ]= |65ӔҒfu.~hs] YBy&6=_Խ{Wn4II f?& K p5,*]߭ڋ4.i=֮4;JUIwLEo\*i|1]P dsa)6l|&}S檒%$RCdi[-9Un msXם; FIaWR鿇UEӢ(u?teZډlݷ%:e~I(W/=ݝ tsd6Wti[~K7]sFO?!-_wG6_#nꎎgS>Qd@<;^/:sVW׵2zL􄤷~:qh4Zv} ;'t{HU|҆w^>`T*j8w$pi6xrWT6PW})ZYޟ)w& -.O:a}%ihIm]*yfi8?P?[r|kM/d rcsvJ3c;,IjI_ݯFMd7[;xVXR[Ć4Jm6%sy|[y2A1l?y6(Q{c6Mg\A]+m1i4!}2ܔ}fo(ܘ$դ_gS ?3_ҨÁO ;n\l83/ٙ^e}XݟMij{KA-:-<71ҹ ה˰(kfc>Z>@m vVl5A,]'Wgۇsx/O [ UTZDM19}zugg!ZtU' o^iǏ/Hox1=qf0ߩH&i4^ -~斷wMBٟOv/]?=?7Y[g ouϻTԻ]]UrOWXz<@ouJ6lvq2Yuvsp 2(ݡ>`,nꍰ9ʜ%;jc5RfF Lfke86sėfO}P{-wݎd!Oy[vU)3Si1YYb7zfή: ICP[ھ<һYX[Evw}d.rx\]:]Vͯ?^w4P՛fm08*^b}34lj[nբ @VUN Kr=ȫM\;o=KٕCwF3=ۥ@꼳K{յZF\7jR}4~fmIkzX~O#hɮr+K  J5ȫ(osnRqYpجs޶0Vk.O\k6fXtYԅUkB/)^INݽ.i6 mBU܆5]SΩ&peӁ* Ņb!Fs|x?.$=\kw,϶wU} ǷO0Vg3(aPVqZ buN>_X(Y߲l|&;vĶܓ_%ݟipv~^VA>͙, pg)7Q9;<*}H=@npFǝ>:ߪqЌe 9'nRqn=(Tѕ7{dz>S%ٳ>C7UR1F/rǧKe+`pp[[v)27xfM6f?,>p䂭؇WKs._Dr ;׿-~xHiBˆI$2ھvGe?XdnjuUo֏WXޱ9j۟ ̴iɄ|9OFu;Su㡖cl.P+J>R9Y&&'J`5a0{<;*/U,>HP:.ܢ]6pϳndq˜Uw܀í1,a$}s+yhcnjWǤo5F\60&Ww?of6i[͗5Ane9}ؼfiz6l75yq1KV"nEao{W's&[-i=EN8Ҕ KnZA]I$e[ >jIsˈII2 )\v|.686154YA*JRPpuY,]]+C*&c߱~Kuݒ־jhGo'kX8;?k>+D6wzٕ{F[Yܡ'TܭN}VڬE{1pdȳ$ ]~ j>Ƕ4_56V%fS7%k爪zZׯN+k Z~D<|R%= W׶Y˸/~,[ˡ:,:coI664אXcHˋۡlYje$;!%$]44ru{iƄzxgֵ7#5Z;b!yVKR|uqOqSK kkz׼BgNtl{WKO^_gIZҼke`ø;l4? l/vh&&K,>^Gv"mU}-5%_4J^ڛ{ہn~t537nڜdo{gign,'mCY*oRwnj}Xɝ];v} kw@&Q%3󿵿X\E*hr R@e?/:%W\@ܡEW7NYmJFM,hA5er,7{[ I#Bŝ-V }mČ&mt_5YUOfߛ~O{p$ ‘o ɮEEEIcfYazw@yL\5a"cZpЉdwE' /ǖҒduigQ' Cҡ =–DdlO~^ff2,]G`;Dy Wo.g-_273j_,z7]0Z=;/9=KA'.yƔdW~ YG'[{;o{Ny@ڟ OyV3khS,9s9TaP}Cܪw`jiEJЇnVR53)70Ci;`L&a_j#em6 V*60 )CӝApӬ,I: ;X<wgYJ kks"͎+.}P e9wqb,]AN^^X/ǜ;,ݵSֆ3r9wRKۇ/ -W'c`iwsw$x3ִwU>,٭V{sdsINSq79NjՇW96BܜTT<Q[[,}rݤ:Y3ޤYW̪&_T~aC)j EoHY8Ti睦dfa[TL@{[5Cs~]_ 箫]%a-{2U'<]=mÉԟ@l򵺯ce`X2o,kvO6}TuF,YlIq'/Ttd-m;HF؟kΖ.=>s?^GصZ=rR6廰c S~|UYU'3IYƉdM~قLb!\y9~]CRYmc=,uևy\洓fdOb, @r"4\mf0 WXQuztVymt){ԾT=V 0_d| Fꯃ4VsPCO ̾wֲve1*fEy[g[:&,Ȗdd٨"tϊ/|^2 u\X7a|^sgilke$51;g#kkQ(`:_@! r!x}_Xg~uo<ڟ.M.z102w}:̳sӲ= ꢴ\MFصe#!pZDfF (Äu8 JS~zxWI {\P:dLJ̶q Yv~z-=`]I6NsAýRg `E< IDATвE2$TTd$D6qߙL)He<[Qf~?+_`ݗv}*OnJOۧwkG3wL/ݓ̿=ogKfRJ}VT+YΟ}ttOJ.(>kӪT?sn닀Mic+=wqv?O{uW]hgj߶oj[l+CYuMg7Dz=QwBK|YJ]feg]`Fwuy ?*W;߉ ϸ.mI*sr{ּ{&3\^>ߙY{1o\Zѕ>_9`RY/ukulUrm~fm OǪĚu oſJc R6qT}yv;L(O}[V*BsU~{BUgUut3bڶj{]?3d\vKW[NYjvOlf^@Qanϻeڏꆹ4=ml5ߟ}ֹWC.ڜF(u;ޒt}y9ը-B$>(joֱ|^ TQqs}3%1UF Xrqgm`\YXwwF>R`WaWݠdգ;f f\tށ+]u@s$~\5+ֿ^B7[a13lҿ2VuYfJ= 4;Rb7A/UC'8?G?u+{eDѼߧ{ʨ+Skpg°01Pd*gΖR}u/WDu{}+01(pn~OqkPT?7xtuG2#TJNe4߻6,Ɲ6,Z2+}UV?ji:37RɼdZp.}S۸nӷַO;gUUuŲn&.ܐb^ob^i&jێ3TsthPߑ+W',a3Y=Ibs3c7|q'_Xgrwu}/S_o+k/Ea#z~M6Tc^}gMX~Pwn{kOl|rO<[ݛ׻j>m&Y7&M㻺~{GM@Z7Uwꉗbֽ~ʞ_ra3+nxi]ڐsm]w/EAǫ's}.ܓ~b~5B5>Tq}5W/◶57?y?o69:JX%cuRe2/I~TЍbվȺg$+eV.i؋6_Sw_UuoJ)ؤ#_Hw:Nn=cThh-=HЁ޷Q[ߩ/H5*uϢJ}^?(c&s#N3g} `jS[b)uURMՓ~iB dq,Nư5,VaR(vT\_^Ů|q/:X^lQN Rz;K=jԱ4WAUJ_*ajմniw4}nȊ ֍wdNܯ;X%lFۍY}YLm,ϵE{t_ө]Du W7mzKmV%wk.3IU-;\г(6*_^({a{ 7-^k܁WRlMݑ,M% ^OvoQ;[л-(wV*LeFe늫]@_80KޏOJt=zG_ pjRCs-J¶ƦmJk.{v_lɶ8 ?9ޱ @M6[ԋL_O;^d-H5I(juǜ\{pX-RL ns^+9e-<6aGGX\3;BAGؠ/Z;א(ыsZNwc3=U,&Ov_ȟў`(j}]]!ThXbc|d%F}ww#~2%V6^Fqs5!vj %CoD_[?U\k6GWӣ=˾G1p"m&IܣH_g\I,jkTg F] {?o"6پD2`@<=Ѽvuh#W p/N@9>%Y$z} }cT]C72J{l5MځKӮ*gb)g2yga!=LC#~fdU?Q[*j,ρS|}3AY5sw+Slpt2`_8e\4Q'6Ng=K+(3+pfGPhRa爴xe0O u'R <~L/Z ϼ0;%ʜ eZd|N /%@sB,jJ P,:fLt< !XͰ@YixKd ST. `SIE ׊ڬ;&0p@0`4E`d/PVrj7]0{d/*5+`- 5#QB=x o*%Ӻ 8z&B1H/aTLJt< 2 :apf/b/Gz`WȣK5] Rc* e@sh/ 4[3v3]]nO HQ '  2=4 6q 4@'huTu+E(8!vJ , -ј4=X<E{F^] (=l0 鼂,g(iAZ HׯaDJaXe\rGȫ>@wӼ\A4w$B($"ְрZ^;8HoXs'JD3va3(b@|Xk^>(S[-ɛEI5 D`e'A>`(̼"h  8:&iAcDlɧY#$)K7hZ`!-w26:~AbD%eUn_H_(8vfbhL&7>(ea6+99_3i*}I2 *kK\,7 'ّO᧼?KMGGISYlhF k,vjja/0A.DyA3* *XK-h }L ~ XYo!0. /\m WQ]=fƮdla4@<\ba/VҀ0_v6 NFM|ݚhFD!*-dMc\Qs8*SM W%)d:f} 'J^kW ާO nsC{V'sԵKNcCp5\+3U f͊: шZhlNPd’R{ݭ(S0ʵjʁ.hbs kXwIl^h*l̞ s+I'~w_(|a k [- =,i .)ր4lhкl:a=,C3h6Yh>kM9AGޠu gw-.X&ju *w D&(#ͳT}N3DL%&Lf:{* ]6LX8*,\0jƂ1Xԉ.%:Fz,hΙZe91t= ^jB.,ܔ6,a+dD3p+Z4chEr=j.oSshl۸7yw1c ;f={ZblGZyV;l3G;(J X"=l QkژZt}@qiUvl`fIvjB 19`/+\S@1\6̌*^AȭYXR Us2Zplbc5@N4(E(tȧC~XT>XmКwƾL\vVX !Jjg/ݣܝzG׾3ۻ|i_ h1H&c>rE:hʰ70;wYdg5r hwPwcqV;{Ǿo[Z={wvJ`&3Nx3|o ;Tw^1#K{L=g[,~?V|N:=գqg<,8 }3Wu]2*};UsGetpnDZX4:AAK*>ԏՔۼgs%h'gϝz5Gp3R<"Ю>v1nٱ7vѳN,ۯYl簷u{ A],ꨱbاyvd,+.\"l)T}nFwu>iXɳOiE "eL po10@bSmQvLPlࠧGTѵ>>=߆2j w;|{S_Os3@cIMV"̆Jn;HI_egpS&/D*8a XƦT(LźZ톮ϫ]&..#.dv,_gA`'E*N-naCcټSȽd[ [-AT> ,6EsmE <2YE}z Fnc5G73\X#co~ I}WX=.b.FNƇ!,29x`QYԹ 7ZYJҩJd ] ߛRs1*8Ѭ각;"Z{֊R"?AFuQrCI3<$q>J Kh<[r(gf}x=ٞ犲{ kQ1h{9y:#;9{̚ s9v!lHʴDΕg*~EV V<֫rCn,\3#ƙj}Gm+bm1sʤHNbz;Yo:KGlaDzu RKI | NgsG HQ *-o4 B\w8MlM( 7^ !Lh+e1MC \$b$4,$L@eh-%7מ;4T۱eC񓶳/DURL+սJL5CGsTt~V̬>R Ɨ>kFLOM!\jM .XH=Mb @iQ0T(nW -4LlE9Qjm=[0[I&9mF1/Ҝ,@ f݆d.@(e:Z} gZUކ1y=Pa8"Tܒh|FcXAЂPuHz)@NQEE A10CQn6&=S2bCO\aږ-eL)Vp;籲!| g -ignkRFb1tB|BDfAyFocj qLCI#qKdV 2ʔ-er/iT[f(! XZ/O&ā:Gj`+GdH3g6HO2ad@kJ* -6',#d 9yf.Frl!}XfQgPFdb~Eb!03+L("ÔC ;Z_}fQ {zlP~T+!Y mo2G(ͳ* nYVD>#Y_\Z(Ksc(#IzDn9ǡbkbd2,l? ޱP|&ap4q˨lr` f(y9/o a%Ѝ oh Q[`S8b):58,bzÊ6YLhOW*d*{BOE1\ fkBƽ-rrX ERD.f i^hdCW#2Y,F.,0-rß[MBL@[H;;z굺Sa*iJ52@IC\NY/&LAXG˱Z8Ⱦ h(KO@&R./=.eo`wr ]9fHoD (hYUrVM PFQjRzR> 35V$z)0Yx9wFْ' c07H%Bz!HdoY9RLv*{ ٤$EӸ5@&P< )jg(FV8ks Bc1s14rob =&بs+4_VI.v6ϼ)3ugP<"3c#;V]JzANaVdBM&fūAe?I&4X5[3`4t gMS_ D ?q+5Y{e+QT FZo ?В(=!Vj3305gEd`6ODdFq0άBdvz5ƼDi΢t&M ASf;3Ir 0d4[x-:GC798')6M4ʼnT10mFJfrPDS0ʺߤ6c̈́ckTw@e+("^D[dh(>Ҹ0 -;VNQ)rFA%1ϖ Q2_^x`S] p!gYsԴB4X@)5&Xb;oi $h{Cm%Coqq+:ڰF^Gӝ [#FʳL2tyΐ+h AǨ P't3ydAq+FD-V&pcwыERv"le;n֋nn*>;5fBB CSl%-ͫDAXw!WʀS4Bb爵G;Ł!bH>-C6ع0 `ues͋ң,bfl00sow\R$ϒ35z><5b@G7ʀ}>7L:4?G֛օv4m! SaȦ)ݩ nuGřpD$vԁ~HeG#Mm!FCAR" _R#dF{F ,}wh7G}Tp5RF1A`? )"Rlq}!_|Jot3*KJ(ի!\2w aHlZ6 cJa((J:f9|+J ͔>r!$VjP YJi f&,^̱BƘE5}GQPGi&%懺 SI)@m'r:(L8BNa *@sC3mhU1 Z=,ZVDM*(A;SW__,'Ey& p]򆇉\ )~'j"[`f*lv`Bin$U0m1,GH϶p:UDHn`YVo5 jԟV?Kt ާX?1۪i( 1:.&4VJvt8C KB'wET&5D pff,0MEʻ:nZylyBtKPtH$w\+l)T d BYy8F| /@Q{y$Ӕ1c&YGwa4j#Ri+cJZH^|P}EEcJy#v#Ad)*{Եv.ЗH+=0 2蘴8#S:5D0@qA4a'2Pͽl<:I6A5,F\Ru9 "Z)yGH}8 sɼǜd8O*/1U%~Γ u_ZaIRU(.˜e#aBT6ClvΙVքap!,Z d7*3DSFe1H2Tau05L/[X1Y 8&DhEΜgo\cdi;@isPCbGW\5Ln e|luY=N͗DqʱrˁduJTifYNN0뒑O@q,XAK` 4Rg"Ml"ê4Xnju T垱2HHyzeX&_GVme#گO":Ti K&lk)i"W`W׍&ߚZ [}l)YP8wBΆ)r+]Q@({\械=_!vQ>qO`o8IX5FN,sդ?_:898~O?i^iqݲf]\;.bYЀPTˇ,!h:{TMF!2/H=iΫ)J~QV1(Jߵy߉E_CkZ1U+쟌R>JjvϻӼ TAOhJjaK/n_gLYiK6T@ IDAT=㱏&u|.?ui=CA}C89聂\cd֗7qv,+k?nlc\ ;a!8gE!,>&,^[%z<.ƴ;t/+mHGEUB:`UѨ]LBx?\,T`*H8cGUÅUcс8<{ xdNS``:vgkkĔc# ?o19gǁ_sGlxܩ6>'E(hz- /}Ln_6,YȣH=8Mƒi$-Q-u]HJՄ3٣(ugibY(y"lNgv!6 =?1.XT R23ĠFI!Gs>'Lr}E>^i]BAVBRScy_>//U/{#;uUwjN\3Ns]dN[dWܲh==y*{/m4q)1Va1| U[ֹ35^'yWj Ϝ 0fXjܠ:MiZ vySHqYFwwͱ<۲7K{tb qEv3G4~ i@YKӴ03`&h+#AeslPP.lh$FM@eg}s X.e/i6L`E0veVT'ػ#<)*'~rV o~ŧ?'xo{|wwqzz!^o[z@no빛w8''R2%cd|a8nP E;rTg{Z>1п,Bueuz//e~;8܉s[z] 껄U2݄%>M0+aLG|}lac&zvw_c}ʻWpH*[:IT8̏O{8mjY_LE"=zs'i-3 +CSGf8BG}G饼BAC)M CtXZ8J0ǀEY~k'/D-RfXJ]T RV>H* YRTV h $ZfκIDa]@[ب!#Z!BrK ~$"6 sk;B!9@TG /0W&_2Ο7x?~o幈(=a܋NNe.y|ӿo~Cdݫxi=0 lVY#DP\.'wzWۤ3\R*w̎]o:Sd\c}.{u*,)PgV-22v DuM0n6*\z[ٲcU$?b*8lS N4iiC]c1~ { ҫ$B]GYq S1it\)>v6/r2$l8AIY qhӅc%m&9Yuܲ.zM0o P&Pj9;Pzʆ(VwxA캩 cg1(&fT5Ue9'ǔ=˄M`MZ7rzhFӋ'˿oX<ͷaIWo~/Wg?׿Wox˸xxE|x@0N/͇q!]7TlaoxmJ٪'uE, XY)6*\u>H bNȩ;-rHy̚8zy<7C5 挆 3sb qnzC֤5Fn%G 6(N)!L֡ S;B9YS)X,Il"!mF/RCʎMBI 8b}w+^n]B@|6ӭ(LeSU*sZ@:Ȩ}]r/nԂT. jzվtwл`+mBQ3 a)<@nblrk8=yR#pJ*#?nz Y⮑\zJ\Yt4R3[SOk ">);?g2cYpY9z'Z&s/faHdBrh bV)#빒:fNE9bԫqb9CNev})u/-X?R f]fŞvɐﳣS&וjŦ/G~܋<я쟣tf/i;Sw2n/7ӟͯZg?7g.> :w?'4'qr$}{oU|gq{>"''qU0*nޖ A4h@s'2YţV oH̿ 2)vGÑ _VX5LVi瑋Ak2̃U b4. 5+YqGGEKiE-L\&}a+)@}BA]t"eϏg[@&NqL4 ڌ!ԆV¦Lr+)ixiz#K/14Q9&j:5G09 ݱS]'M(N l!^!RO4_ձL@lPĂ'7+8,ӻ|64dدQ!-wlM{٪%53:N^B}b0wPX fe:րFZ=PnO >7t- RYU+,7M\R/VjMp9lyQYjXQ9b,K* ?ώ OoU#w'q'_ww)Qt{oguwwI\2/_x?"q oq~]A)3X]߁܉ETg3"nyje \1Ťwi  (  ]]#o,2wh' %\xL,BԢ?Y: IxilM`F=)WmޡeٸQy9fk$uQ]~@I(8(#mT0Lu'Ifh*FtZ:6F^iStF2/̛Pr&G"X͘iӍ#7"2AbW _C5ϦCDeošӹ){-Wy(DY瑞̦9( |l.??g⦬@=Z 6FK**='U]5]q Clb3@["v azٝ%"Iw4|;@|`bEӤvePN[DjnhI{T~ -94o<9.,5a8xC|x~7i^qzlYDq|wW^vxat伮6Cmnf҄ퟥUgQ&9bL@wĘ@j"ٱ׈Nxڢͻm RfdH]tvQcHfvE8NEݰ}:qܮ@U͋GhS`9jpkavl6*`|-Q >~vN2m-w@U~jJ9Gܩ= o:tz+ZUca.3>/^ܑEl\ n R=$$Gm6LDAu`5 ,BiRiV?Zޑa+J{TfBOmw2)X VMȎr(Kp61=0 ޅ@rj iO @\i\]}O_^GDW/qrzy}N/8m{WnnųOoMyJCgésP)Njm+ ']@s7l&a`/R`zx NߴgL 0u u %R< Vm/f|c$v-N*Lt]E66yr^(hy/b/rks=a]Nw}) wxL  5O X͆?Ζ&̸,2Gܰ!z^fvټKQXV_h5+NvM6urU sZewW8[tT|^Zaf1ҪY'Muj2 2ׄƽmXlgk)>slxz0OGfM"\M\7cwu,2B+F]vMU"W&j>~9+3c(w S Yή;2$Agk[QzI>C/+ 2FK )+&mm1mP9gDV|BM~Yplޕnia MlGђ Ԃ$Gaq!j 8#{[.%welhhd:mw85Npz/qs~}ɿx?*޾MXbk<=Lt"yli. ` y aTacgHrLT_Z&f ) |2_,cc؏F }uTj;sĖI#`$ڻٛ^Li1\㭭 8kC؎}Jm4ѰTT''6mlp J)U%UN uXOJ^Ϯ xat,v5ǘILo"w4MX*@@4=* /g"f I>'ts^lXuB6g4HT_(ZaXЀ`Ln&laɪsyo_]3Z jm0/E7 `OK {qW-YRVaDV͊ @5 euugҢrN,@ ~h،%0tZ~ ^2E:&T B ?uC8=ύ|HOŔތw![zdp4ϯ|s}oe|?x?͇w <)>9ӋjE]KHWӋgqw{O^|o"wWqrvou?ٓqMpon^2QM&v BپpO,tϕ@q_;7_v{( })M h.RG0A*KkQMGj _L1CaMɍh bc{r'&Z!(TbOY:<H](ld5OԖ}4kK :Pf9ѓZXK3ʬFo i*1k Z%rFam»[^Wl& byxwT1M ;aFMvEEù[5G5^Tjq@)ʔnRYCbQ lWTl^9q]) xL6@itiת6Ng6IYƣlfuJ$hC  m̠ ;Ci2p*1@@޳r?MM17ӄ?G* qDqIyO/˥fAU# 0֡Ûep  X?)"#G]@nXJT胻Sd8tݾJRp#DR}LH6&&?hJaQe0y6Ш6fVG*'62 EŎJ%赉 @Pō[653qƉ({s /W WsF|<=Zs-2i`S=ۛzuo l%tkam fsw,5?& IDAT _mH_m,elӦ\uҝRޘXK?ֿ0~dj (uw-ٸY(g9D^ײַc!`q[ZspSn{Œsl4JwFX24H@VS\#jZBeo4܂U s KM*͊RQ#sskZ`h 4j1Рh IXaB]@,z-xĵFP[joʔM<03.8wg;U򛍚 S,&1vޱϖEJ9KGܣh' }x?y]Ƈ7_ջxO/B>׿w_ /y8IN"_ƓO~Wヘ?w ^/Ûz8NNq߿C?ӳKq' Y0qѓBYm{7Gy(s]o86@eKj8*:K皏Wl_1?OA/-{wv)hcGYϖg٪94N䏸{Ǖ⢍ #;ws1qϏJOQ =S@UN^眚{y.g7byX;y<>;?,gbx{弱 `3z\v .n?Wg,?wB<&PnBAw/:UEUh7$ `+nUv"ɪ.rԽb ~{ﵖxN^b>c}6mAƶBe}.5UXsc+殙`? cO!ݯ !XN^ƙ gt'?'r {}Cǯ+ZGC4ܓojKK_U.ڜ\rB'rȡ( # )аu̓E/w;P>u)(jnPA3%#}>7Ѧ7D%g,J8{Т/C>Úx 'EEb4{Jv=9'!\VxW_/~8N"noq~wߴqr$u\>,n}^'? gOݷŽ_D]͇m#,/ӳy{xy^'/:nC* 9C#f GɈX&Uý);""= @b*ZZf hցXG2 Ծ m5cF=g. `q.B*o \ 5t,A JQў.-q`t6[4}uPjc@8Pv8,gҟuA.X "lǚ 9`^"ÜMo XQWW=W,3eXzzoen+tɈl a@)FZyZ[G5`[.r Rc} h0.܉r<.Gu#vE4}qCA {zo^jRs>[}N%EX?Ӿ ö_˼ Fځ0Y/imyojC eWG.z¹{ȕ$"bG\kL$1)4ݶn4 rۉvS ui(HW5h^?_ +Qa4fn鱉O+v 4"/u\}x@D\I<'??ɗ.~=n?x:Nϟy'O2q'_y<}".qwwW_pDͷqInLCwK۴$$ Sm!Ȧ܄ݶfЩFV p54-h<϶l1 V.*1R&.tw̾Cw rwއ0_mDF[6”i 7i` ݮ#rbiVѯxm=|_j"8naJ$w$i9z=NPYf3#"?,6nK>*oc;fٵrFPb4MY(`wa?`NRS.v&$Ulb ,)5RͲ1]գ*g.QTh[u%6 պ3 Y}3W̓q)j}3`N9jUJB.4HR2oT5߂ܲ7F쇝Y$S̒Ilę Zͽcj$a1>GF%@0jiyV Y7vk=!D<|=jQD,Zo~(jCgLsӹ+pR 9LTZ\01${,@6E}-8ZP0 3!(~NB"mT[5SWH"TTXr\.P5e]{,3ޝ0_65^U­,:y% {[&,ӰqEeh_R8Z\ vnqww'{gU?$"/gͯs^œ_qz,.|b<2$xWw''p8|w7y\."޽m8|/~A; f3{3Iee^Aj6Yr q2 "jh "R hؑ9*2ysY9,`uR56+UZ8D!wxg]\ 8M-2f b j_S߸ LǬgGˏiteCa)H}bb~Pe,22)g{RR uFL`$Q,m%7̒R!]b4E,o7m9{RT "(~1ٚ=.R"]$y!N Ig7 rG~ewA;I b)yC-0dZd4lrݗ@K1*5 fjg]9'%+լy8͌-1{|L&=͔:A[H A \ez,Sz43ح $X> &%Nd]'Ԧxo )6Iq#989n9(agx\hE궋!LklB3Ou SH2υE*:_1@5/Ճ8+[q18)bVoMl<3 =9ʳSHvT4rJ+5Ȫ=ͼ_P0QFa^:wH(?Qs2w H#_[}i3I S<dݿT` ^ҽhOӯf|QscA~_͇7qxrRDGMܼ>{<"N/'>^~e-!;ċ/m ~Ͽ]\gO^/*޽mY]|X+H3@CIbsY<O*6m&$A"7Ss|$R0"JLPe.gY| H&XktZU+ƣR4֘[,9d % T3\F:7)bzƹ\'Ƭ;~Bn-3M!5*ffUm*`˱9o}Nj=j!2k=ƽd e14P7(I-Sy*CQp eIDx26rNR؏3B t`h4aZ#E#ͮ6pk3H |h-%ŷ\PKk:&\YU a"8&ɪs[k IB~PmT @=kÜw42%O {?slA7OT jd:E&yפY9>$)u!{O84x3TBbƐu #s )]s~ufez%R+ԡpfge+Q_9",ײ(0Č ewbzCuiԩ:1}mO&R c8Dj0>*cZPZt:@cb7|0lr ӻW$!6 'M7]s6T_"VRP$1QNv8E2`t+5QZ ª|>IvoK^EɸyWᅨx/84?2OG!.}۸~] ۯA_G/tۮ|rb\H$?Y!yi L<;m.5X@ jz`XB*M`U"  oĦ@B4CZ l%:'f%''Q?=N^-Qa4a m>l *j‘%m1O(-8qN7K\E~OhR{0mIiXn;ɷ%ѐ0C&~3FXBRb!$!Rm4mNRi٧:S>-~__Ⱥ7bFt%g6MЫ?8{Oz5C3w]9SnӍMnNځ.ًX J/}>3Ja%|Fz. Z]``̻i©ny*<~c\"._~ų|.^89ֽ]Wᅨ>HƇFq8ƛo!śo~wwӟU;@,`|T(7$Z6ѦMK[veCPܕ×?AAg ӬtyJꫬ[T5Y9{ [ N*  j `b0r̓Ibyp(A4<p.Fa3 aM'DYh[Cs AN)W{mMHN9LaY^:N/ߍʰC !e K*@*8;f=$?׹=hBˣr~Ʋ` \iI3#:r9 8(XCVLLm$<ʍNM#H:YhRJn9qBor ,[eH1K!j۲8'h@L} g>N)ųeizr]8CU&BB*}PJ[RDQpƳX9)781 r0c*ldaO۴07rq8'óM!KmXǪ 3Jk:T<,ZjZTp3U=}~B܉FFII@K,EIYfwk2aUFNV73iuv†Jr'vfaT[1(kQ;rӜskͺrkp>dtYDn]61<*X* faa2S)Wm0i}Mch[Yݍ\kr`qQ@<:!;==)`(ksW#h6ݾ4srQH']a5|bkM1_pZ~1yP Rd|P&RCPToh(8DBfEӒ ԹF Bl'UE7iۙ}J"TH=cQƏ}2@$'ZfácEQn[ӥgsտ4>ũThb662RA]0R܃s~ IDAT|\ i eĒQjssМ+ISHa8\2eQsF%;\1TT+"ZdHH:2" -rRn;Nu"K.BТO@fi}ѽVIk!@ sl&0 :H)>kVHQ(@G/߶BmBhDUIT(t"i쪜Q=_{ Kǟ+>N1سJ Ќ,#=ռ'1<}W9Do`0|S|!yN'0vI9bDo(!oR}2Es#jXRe5[DZĂMꮠS h~D ## ft@J\~5c7nATvu+N`,Y䴠 :kDX0IR2nCFv >_Fl=ulFh p޳+HaehϋDz$.?AcR"h tssϢGFccn[\ B$Dd^Y^)\(LD\WD}@ڣ$Pύ1MlULք O?h&%FɢuP?5 *OFiQ&&x$K'iݦT'\HYdV5Y/v$,2"E,9w]BQ*[^%TvŌ]7 ~VSd\=Lw e7dYM88&f`Ƹ;T >["Ya998+ M."T13Za~VP+HHy\I fFi}}`g^|{^ g{ߕؽJ?4vÍ] g9.g&ͽص "ď5bI m5@ckDDUI@A!F =GZg?{⡁ɓ{zFuhj^,K8tw!1dPͅ!]mj!s]`F x)7%4)bfF"f}\]9ڤVyIVPyc *x.Zn th$+˜)"cIkOcҩP#P0f-(ټKB`Zmđ۽1 q*%47X2 %$,d;j$7>(tK t!J25M=mK_4r#$Z覡(Mh@]/ɢq~NVY| G$ ȹ[/{i01p ] p[/h( g0'DQ_ڮWb3છ1:]1p66`6a>`0ānƁnރG͡+q]Wx,`dg VP-B%бkc$:f.wu7ZIJJbd 'F 88eX.P3TP1| XrI|8?1\ ecTGWz-]}™ϒA1MtۃοT\! I3r@LG+0lqj+)7/{ Zd #պTb0 V1pEANX؇H<~g$U A- wb>$ Q&TR'ݧ@(W5drXleO'YB_j)1cOb dkqRS'~jB$c- <-gfGX^H=ybf5] V3|W^gLԧRŒl 2V Ȭ$/"Gk XeX_WJĢ3O iYkc ) //q2Ohr%]=K0zp v)XO2RAQ_'z>T㸕7vd% l= nݴ{?8 8_b}] l {&ؾp UX>jaiIE5>$૚U`c_ΚKo~? ]eAupUjRTNJV-E]w ?籬2vHՕUnIWew󓚇gU%w_c:U'U6og:qpSK|`k&Y:WQ4e~o⒮'yCإwNIs3#J-[}]-%- ,UK7:O4V>kqs)4ePzg&[mM̿EKO>%SzTJ4VgbdS 4E?3c~ysΚ=cOuVݝyEf;*/UY`Ί[^.nH؟ e=)]nz+*bVZ#5kTK+߇̮U%ϯXn+ Pfް/`.yvH(|Yj;+~^+֛IfJ͞?^2dZm™^~e=m_y{پ(RѾVy{sYa/-)\ĩKp gn_뱁Xx 0KJ[iE ق~-w]?[L~ޅ&?T.92hn6 c'8l|Jc;<Wůqm=1'٠PȤǑyE!K2|sfE(aql̆(Ώ q7~`k € n5x&u JmsϾ0nc ص d:tӘOGH՜T*Ry隳):`mԠzNaW %.X2g#ɾ'u-;b'^2Ip7G4/jUR0{瘭>̠WVz.;GYB'n/P`@BA0iLzѐb!ieݒkκ2h4Cc-X;1q:RСHˉ_oMIc4=!}E8 :Τq`PⴃٳUכR@qhFJ_*L\B=vn|{LW&{~u?Zs\qI;qI>eqA-m~T/1fC樶bO:E9L.bQbfz^ḆjV+Y % s/2H=XJ戅}hy5*q4+ &MrPJ9V/دGa$vFt)Ь+elTS`T(995,vWnb6bcs6Pf/6@]DQӵ|($;\n8ț|<B.aҿc2ӣ 赭{+ʵkt_ap2wj"qS p>U=U $E&4TewJK׽vxrޱҙgRƦeՔA1f)$YoecZ^_FS1A Kj>=g b9%S⹒qgAZ`5$@R%{)cE'uR}f"L*f/I0.jOs-ϩU@*:sg8[X5+LxHUĸPU$CD\34"NWߔM$&6tZX'VF_ě1W,vJj}4ְײK^%a Ge&/1T2A2B&W&%z%yorlN-(JKڗhX Lx z*]/&Q'i 2w;̡؀}VU\u6麅noD KIw3f|$Vց*FYfߙt]ZTHn1 "-W#O# $xVUɴX $b;$ltT54V2(2M_ W.qb'KYԥdMC,!]Ti|^y`fuD(ۘFLZ %ߦ.QVOu|QlwIBi,;QYBVYth48d:@[m/VCj.Y ,v0feCɺ.T glU `J ~O #j03_fYˎ]A-mR3#~U+Ffp'ݭ9;?5K~zB yd៙1Ygeݽ=-[?ߟ,y_{6{_ +l~Ysp)??KvWfy\$ߛ>/7(:-gq[ecy|z$ܿ,;vo.=>[~ݟ2G̻l_+˵__3PdTU[_¼8y(X.jm# Pb`1 s9Y~r]GY(lR,1o ^v$^=Vz`R -Ԟ>DlSyp`8ְ!h'.-̦Tc!WZEq`0gA_lkZϵ(>LYwk@ǯ_<1ƪlf(#}~ˈX4Wav^g9htl.witSLV\GĭJnqJ"{'RYqs/zJ=n¿7N`a9]{b%4)XyˮSOF˸2ΙU lqˉYv?׸[z*YNmdKӍ:MyגF]'cȾ >-0̽/ح\*MV>!#O}X~Gw…Y{>ݛxC5e-RP 3jV=f5N 9]e]sK _fh!"b0 $xu3*6?A;d ɷZ+h-V0gBiD5@E Qd?xgaG٦PmOTΧڙQ~PΠ@H"` gJ(EB ;7Nh"6Ң._%iw;sY5.'뤌v'@I?ȴ8tm`4g FųqGp䧛K#n6%e4W4*}a! 5-j3B)#|#[Hq`MH+E(B C"'A#QC2>tĜ{G6*:ǷgHDv@8(F/C#>@3y7VځsJ)u1!k(4uHڍgj;dwRYC*N}K$Ďkh|ٳlf=k4oL u~?hg;s^DVő0'R$H a4YnzFh\#]NhC;Tf)TF %uFŠvdΝ C5^F 螟PԙTGS~u,.n Oф<͡THSds ;Qj^uqׄU-JsAJ~' Vha)zH*`y f)ȌX 7„R-Ԩ =tWdL P=[f p+KS^EF}GS1.sSTrM$JèygM6(0% ISqTmH@K xxO6AˢRNy&^/>[w6 ]2@f0Tmڹ6KGjٖWCXIB"5tWKR<GzHF kNֈ6M^8Pɵ_UUUI51IJ )]|&)v0 8,t&.RHdw R FL K K3&j-KN'zoYF@KwRiC1v [UTKQHu:DaIn~N]Ѣ.bB}JRIXc4NJ*ED2*M()'o\n@sPǍ+f](#I{u9]tH;g͞c)B:)+B™焒4@o4? 44[B`ѱ$Bs6h(o FWkX, Ǣ@X u fh~(1ŲVIJ?tde.|Uz-uo=uA+(_LwP.gՉ{mu{Fڶ,&NR,Cxpqȁ،2So<ڧU<-"'vK3ƓҲk*-*WkD4  耋j\\MpP,X{5.W IГ!iZ I&^PƘ!R/95iqz }fE]DseJ$ņ:C'ɔd[:3`!rwح;Rd$s?8f} IDATJtBia$4:H.xUL Tu@B1m)jm.湷\ CmLò$p䙢E84Y."E4Q%3pО`bub;4sх$tC!cD &Y+j9Ai 3ŚhǴ׍[JqDR]:ʮ;b[bQ`Xxm&%,i.ALj4ƒX9YWocQ0&0n[ TݻB,Ck>(3vM-h)Z,-ŠF$hhEk9 \"rL)-Tpth*YojmM{*iJv+  /g f#?7ҦXb)UZtd"vMa `4B+yW*FS?UR%YfX-wOLw>]f 4t#$!klfVigASzp]\h|$@1M'H{I|K"j3ώZ`(i%蛮:l+]D-Q⻵, !s Kjn\GiXpqQlPDw6(C*fi "75SuH9"qQ[ = ^^ 6zFF'*쪪jKgu\P[m*tl]]èL&ͬ*@UudIX^i)plawC:菸44UڤSAOsYfwHZ@\vw=L uJ&[ڎֆLkf˨rfGG kUM@sZL.]=Z&RX(-<+@CLJjaۅDC:4C2FCBLeֶOwQw L3 l*% `Q>%m7\|Xt.;ua"${y4Du6? bAdy6U֝}ʛ LjWRvC`kH\⪯ /ؑ vn1Hp3;F-w"I !%ԢSmݐmqe~V/d,*}L5R3ƩL6t',-^hF6X*SpW%iNEac,{/QdJJwD&w8S  ֲkfX$J]2V57 qӿ4z'Qjt]jZTtOt6'8A:UIi1$[P[4U_y5댊6w]?GJ+u~',BЩ$ \Xwߤ\\tqN:َAffKa1 g Vݐ$oWXjTٰv,Q:谕bU*qc)XZUB UG*e؆_.2J&mox"O9 \5S4&]cҤ.HdNFSc˄HÐvzfsNU!Ya㓨|>jfx\Do0q9#)R+Pdg"5]zdcٳY uH_jU6=䱉ZvM-;ߒ[p񇵕?k3)wĻw_2" YykTgZ7F&P]r.ɒ: ZޯT c܊dMqk֔,[drn!8}MܹmIL>01Q9;2pr|(Oz WX"+wxbPau1| >wIK|f?صks;8nH:ߒ8^Z~߅ᘳtY&s\=xew1T Qg,`5R "K&Lz&2@Z"p,<0z` t6/"4H{))2vT*3a_^quwxYwμ5C&QI~$KBBXdNbwG%9{sڳN#;,i4>&AY#(n;qW @=@YMTa$L]o;&O 1M_냜&ץX0D`Q`W3C~+z%w7%zIH^C( 0!sRPK3h& ˧/쨠H!LN…;C*2.Xgl4IHgH%$Hܲ#ЅܓDϪÍ%?`L?M]h=Y O/X;ZKBt,X@VNtvo\oF j1sHX8&cgM9/M'IgnmЙxPdTS&/şIO\Ac_b re2vfgR@v4ب$j,|5k=J,0LJrXK$H/pd i|VPA?ZǤpΠ% |Ѧ'O# Sf31"CѢSp}>Rn,IAV7@%TA!!Kᚙ {g""OKhΝ𿗭3_hc%~cv,:S6\=m7@F_[*HFwزv/C IuDŽZ(nEba8 %P Ms Ё8V}i~;%GSBncju)ZRw1]>'HΓH+ j!$lF%mݨwpP y=EP9_{d},k6\m@ڳI.*ǟ:g`AE& 2BCkŻL> 8a^ ]`wl@b=E3]cTL%bAED&WKhiaJ+dDbPv43# Aq(JSH.wP[V2T0ll)REgW1ϱ$ڮ[(iI}ĥb0dzI[N>G乳 >E˺p%+)h\L|NPs|wUԹ keFIU0N|H*NDt+8ٌJBMCm%JQ$KMBM&HlY5- ۽S>WQIq!>~`KH﵊X Jt-f .q,I,i)v%S윧^%qry"uJ'ݧeo|YhxvISDҚ&Q4Pג#RJJSܩ˂doewj$PIzQI$j}A2)jE[a_"v$|Ru&6qĖ9#rb.e#U1Sf|~ @N Sg;6נѫekCˊ-jvLē&(xHKĹ^弼6"70H]U|&m;3c*ALdUڜdSwVy&$mKNFεn[+F]X@i6 #蘒ШhS A5gtw}td2:t61ΟsD^8qkg= I6!Cp|_j upFXq$"HB w[ߗ^Lֳ%M]AEFI@tsH|uUϑr0B84TDZs%BZV𔄑1G%d Ca#,mjO%3KKiיtg̳䱙!Uw^`4gk'B^V9ELPQN gS\ aF+mSE,'-rR^KQ M)h*dR*Unb>WdI uWtKđ☆jlK7z"'J ww)?4^KSC&]% D'*8,^)>3 r K¡A'#: {dZ`fy  PFXPUZAt'+iv §$KRadKu]($ v8ɩR1r".phu%2tI.i?zs7N\ hĒe:f} @1&]ϦN"1чGzҎK M2^kDZ\."sEj睜38<Ş+R] q]VK/gg +hjLhYLسN Q V*K/:쐤uן7dQ4zr:gB36uzum##av2(Mn16tdKeF$(SD+y)+1 - -2' ֨hxa) RUC_ү^/pfA\3yX |#""3O @A0wĂwE>~7 m6Pꄎ6M{Ũ3I"},/xĞ#kJ@%4jYQ& %rDؘLFpqRω1tkje) L\9a@ES0` b(&Yk"_ Lzk10|5ĢmE ?\/psk\F栯Rm)UK-’8I˔վ 3 4'IUঌ/_`@8I #2ztX(}ާ0V|v[zO1SNr0E%̪:%+E"H],@VV6(ky.hKվ89"@yi{3~$1 Zn0m FogiWArS4YEWp@JxGㄿFfar֊G+ BKV`6&v=K,*dJ4렗\E|[$s-E7J&h ھ۩qkH*E-MOsR&א!]\=N3wI%D HMÓ;uL%9GT 9ˊwL[WEw btx`aX3FF`f8(>Qg㦑4;!DB&+g"ʀ%5[4HQfΒX. nǫPٷI3Rb$&0,fyQdjk4Cjh-"I V"Kq$/ EM)nzW,82B_P0q%w,ԝaDk-RX| NXӒˋLI9+vSlJ n$)t}3]ZUռ"LYt o\)x \tQJ !`0H`ka5 UTlbJT'`6ȉ?' :x2̃*PG ?P::xפ~"=+$9,<'d:åR|aagH 3'P:*%od!E%0dʬ _;OPO0|-P"ɤ;z<%qf1Y86j8ta6ˋvE؜O6gVxBTmbph\ t!mDAB"!Ͷ0;:E6ztm;4% [2D $) O(EJ 엦2~% y!8tB_rRzSТ"x6e1#>s+NB(}Y&^<;(Xu!Q٠, UW8Q7:Z&H/cDeҠZ(oBy=U}IBݒz֝KF& !Aĥ>0X ǟ LthF WLS#xqCޛ%OT1. X}ZF%CU X&EQ9H6 52KF\)ub>'8:7()ռWZ)::OYAɵ1n8,,IRg꞉|qPyѤG~ 6-'ADgǒNr 3Ś$ q *)]f! QRN6-BCg8 E<CihQ0ͲmCkPxZK #]%X)Q|][W qe %ͧҎ9@RYݞNw[=>:-AhI @(Rmq TΦ'R&2C]6bXLTbFf-U*cI,! >M&ɝǒ'T365D`d!J1>ۘibNȡ9/jzSTSQ 'GM%]MvHB1&GOSq@ C|#v$y_iQh (Q(iUV؂E2]$T#$-g/83ku9M BAsTBs#6,gǸBJFsLW,4&M3aG ܀ #- NT-b)?$)bL`Rō&6h4ݙt`Ϊ*prhQZ]"Hd./WU5ȤBI<"!$H% W˪ 6T:)a"&hfQl*fr w,Z(~s[iYbn6& ^[i3?|PP3;2ӓh(ftMwrnO}pfwȞMN觃>=pߑXd*@Lő f( "$ ֦"ݓg(q+K<rC :)]'p +i?B' aIXE®6NPi-RYm N#>ΊSI7MzvN'/w![NF=#dXh:|=*$g @VLXJJvk5 ՚j m)c1zf:?$`H Y$wR %Ks´ԩIJM7Q5D<}!1IFBN~G耶z+^EYU~{_K>Ǣ0#:ɔ"A%KLǽ?;ŗ2P:7!f" >J:s HX8o(} :1iK c[XM^.Hx+Mђ6'k15% +8oe;耚:u7#\GRFwFA7$n p}B $P H"SƱx5/L8> -T>O?DyQPӖ|O^DxTiƉ,JG{~^U %%HVX[׉$IKÔ9d7U[&A􌒉;|¡-phNzN(r-+<3t.lf\zݼI K/ ]I Y[}{ lNjY5A:>{]v :֗*>L W_sgC9XE4=h$Xj[.\Ȭ/ڶXvJ__R8| 9g+{@$+% k]߻~hޗ ?U|%lru1Ƣꃙ}^APlh3迖e1c)b)tؓd}1czO785ѤK+~}}fɗ)CE]?ӷa*+-WV{ϵ"/Y>f_γ)Z,yV}Ir3_jx3jrK@vٳzIJ|NȄʏYzӗ[qK ħ~g ėnxe uPK O/ER+v-M5~Ŗ{v]?{%}sz\Jy)ksI'WӊJg~U58O_֞X?/3zY`բ˺|.?CW-ZaZ-N6jW%L_iyr)\%MxtJ%8J\2'\a(T:$~F^jeqvo!NTSVv׿߻2-CUI{=.Xe%QcfȥcW8`^ޙM;Ra/G<}V}>"78WX;D){$!utY%2uYC7T SlC*v0xٞDGqp V6޿64rb&qU#yivsFHY?9EB0**P8e^ǤJ+NUbpg?TN\T kw>$g\zƳaW':STXeyL#!KG7 iABVyܘj۲xzWZ%_.k?e&HDnњ\*N+B;+y4  HrBQMrC'LAU`iBa u^\6|'.'^(c4BsG'/)!vu.dTHNyI]KK]UɥGEBK>rMǕzۥ ̈́}kX̯_є_ϭ)Z?ٵ2{7'iuE~zmL!A96^7~ȒӢFe7=)o o~pm'狊gӹc?6^:wvrS/?k{fCBZHդ |u$GdY'ґdV6mv ,Mt?i:EOfM=#gQYB$4j& *J%#Eǫ){[ި]3+){´!l[I|cW$l(_w$gogצ<?o}zm7/k=Kk{ƞ=f_[~m%+em3E8]Уbn%/?|u^h_~Ϯ{nf_Fhanv?*N}-vGd:f^?jGjqeg˟['~"ŏ|u&^1If+2kb41l ÎU65uḭQ5x$&vkkIh6oͦO=]6gGꐦ✷TovmgcGJg 'B 1,>q>qKx1ta\*IQWXU 7 ͧ `>`>ep``AN>|-G,Tş}tܾfꗶɟ-^@㸑_|cϻ=jug6Wbcϟy2xh !ؤ`;ۜS!&LAl6Ӌx'O8ط6dHYw0l6b}^Dw7ؓ_ϸ[ɍ׽.E ] ;r &m` 2•词(q>c^o>X {UhONpM`í8@3 7?]'8>cMvM^I;P3,l=k&Rğj3p;7C6׽*KQ T貝\00N110 f)f).nt-^DYC2ٟ'_fF%YoX_ً^߈ga&S7bMC_dO!2o}gߎ {.ӸZ{5kQ54'O߆GoVkk^G_I)^)o笱&p|psW_U}Scqc^B_uO'Bt__mo~۞ ^wwͰ5_xR K瘃 MGqh{ܭk!듁Gaϛ;pb|[qw=7=ٺExEcܿp7AξW|=Й۱ ~&_d^br )xp s5]LG^}]l ;TpSxK_‹y[qkU7^ɖ@D:{wF?"s?q7~\m_ `ȅ-sjV,*m3 R/XQot<c<`4`2c:a:b<`{{gϾcǞţ6wc$vѥ@S{D|XaRxoyܞ.\ŋ[xq.\Ĺs/㩧7~} |Y}E`W_+=onnB= 9߁+wxyN_Amm?g-'^ {=%)я7xb2`2`0)w=?#8vlh`{{kʘ{_9>ߍGz&Sb2aIP{=O|zϼߧ2L9~Lt'ɯ3mb>== h\oZ[ei)>w/b)&1Ny$" ό}6N{|+pO߽O,:ѿxb2$&# &O8kql?p}G2$D]E]%f2d<CHJ^ۛpq8&szb8XXS 1|7~iv-gkطE>ZYD0-N76طo7gdŚtޢ?sP”>pZPwmoD=gYo,1)=p~|}=~38*fvYȅA ǹkLFmoa<a>|>d:Uo* d0 >?.9 ws-L&n?d{NSt{=lyԄ?dn {.}GǼKEK48~8w90O0nЂ;g~? l u=wS4~1ێ3'}o~[[{q4sr?d=<Ȃc2b}f/ۻ}Y` L'cloma{{mOcO [?w?.\7^ >|}?ྣ_⡻L6sa&Am |;'u^k|`߭N >7|-h{ k{*{0ı+7;ͯw?KGޕU;l1 q뭟ēOf.|? o{O?t:F==!'z'<υ f-_tl4pm_dްd`G4ZC~(}O*H t1l(LG hтΝ`Ϟ=8w.\Б]n5VLmEQZ;p8EJ`0=}lmoa8b4t;~m |yE\̝k'܂Gؘ`4ul9&|{1|÷ex-pqpQ_k{{&|ƞ&=??G\hڞ5{slO^ỿ~A^^x<6\37xȧqZ/}'>ƟnKfi m 77pf1|uǰ=z F߷t$3ܱ__r2M7}yfk{ 9Ǒ#ƱfK߉;F+yl]8bxmO>|NO c̆ZwgX`s#ހcMy w|I=Bmt wIhر¤lv$,p׵g ǘN8dzhuc{?KeEt,G\ɞ2~._=Z}k{`?:vKΤ'^).b:hg͞} IDATdWݎy ægj9.7;>wO1jhm~P:.|ի>=K\s'$N*`>h žmr[?@<n" L&k{V'8]U^O- 7 =Q9_I:_C?p8v7%<!-] Mn1n L?f+hC^ꕝL~ /`E{gYF()x{ZX$"PLLlh(f81Y֧2SOͲg=ݣ7\zS/. k{|igOwӵ=Wm{SXC`s|?ڞޞ O~BٳDf:FַSLyt&,vzi1l6}mϚ=8#_qE: fk{d={#X;xlllvڞu{>WO|E+3z0f]4Z۳o}>',϶[ڟ– a?VDa$/٬oYCg a!&Tuҕx D!#@fચ* tϤ3.-n|a:D\]VXQ!Vy`q/2 emGDDMgf+?CFNbOĞ[[4v h'eR\۳jϑ'rgOYs='s{Hd.]۳g}r %:XӴaDxrmϗgO`;bjڞK9N 1iAVٻ>yϯ 6VYA; Hvb{=f_Nw+0譥~ݽoolYZ{y"G -nد(Yj(Rޯv!~7џyR'Z}dmϼX˶_۳מZDfR=0ڞi_S|k{)Vڞ+3X}|_fORX)tlw6?G5~æ4qɟD}B ڟ/CْÃv ؚ d_1g2w^-TvtLmL uOmST?e˶xY Ua Dvq,_Z\SBA=,Ҷ_s=lmg=Ysk{=5ڞgjڞ/Þ\ǟeϐA,9k{Oo;ii׷9=W -~E7i߹7&bCkDk0Z>]Jڑ$ jD^v tC‰saI}" !76ލ93b6ʟ{s=}ȵ=/ŦQ>omeIU(|ڞK,$+eL_~YU]设q4"Aoɶ,/e#H{3%X؉*&!im˲#b"6d1<#$H HH7Fu^f {DwבU廾,Kk-iD /c0x.7wRfwPDzmঔn }f mzJ\zgy>z?RPiIrr"=L~ LU*=srr)* \t?M|R44 =f%"%;=eX@TX@_@zmQ, B Bagwmv1:1|F=7I3zNZZO O6G!c6",.Eػ/EpbLJ"g "u^Yu!!'e& C%PJ!2[3EWJ). A0f OY6k@]zP]tn"EM:YKF5Q};j+ 7_A Ki"HF맑 9Ǝ|ž>()YV!c#HI~R!E$F18Nh SVY6Q.HT=WAN\nֹY8-z,N#m+bMSۮ0qǟRt#H 5'||s #[JVSG>߳i%Dod <"t-"0a41)Bd 4$t<Ĭa!Vi98 sͶY>ZB7fǻev|mkԎ"d3f߉7je+%K%%UTēT}).s%_IR4S ЍƄ< \2nZq` \-ۓHЯdD P+ɺWXP˦,Og+!o[ Z6&N5=QgS#}ϊ!qh?#Ifkw#yލK[7 A$Fpcegn6s23|ri8Y(oj$8osIrCֽ"f[q,ն°Ӷ;wW#]ு.ʣ *7x<2ߐ'j*S`@k!ye㺅s/2\z! b,3ozd)}~rM@Jrҿ+!fCyH)>s.^Ol{fOImۨ͊" /r{^`u3)iX_tQq%.O)r<Ѿn[y3_$|sb5uC \77@-1>TD#],ٿJ+ %!voX8mm{⹡#ۊ3ns.{|.1=z7V_ 3_I|o^}x\MBzY; sdoB2@܂mM5\^rY 7-\;ؐim|<2fo^i}TEi}~WS운Q͢{'w M]hy:L^D,Si)'Zo|9$t* ¹Trj<S@^@'Bh~%ǐ=),6P@b5&o[ +?]t"y]նB&(xsegkcOK&H?x/OAžɶ" 7՟84 J$_\/ z=Kg`sZ$ x9?/':nRJĦ]MR&L}v>1?ݣ/X><;R@ Ka5lEV/ &DFH7@VK,A $= lBB񴻦vTd-|JŒ6gw v2bbsɞ U^/N\.ohɗKrлNfucؾ};`r y_KKE(y͎nQ-&fPrk$i"OL(0PQvl Il9agϞŷ-:ucرs'~'~BṔqd2D_`%TRgxZJU%]$ǻŠHrjW7LA;w 80%WL KdP8eR}tjP. -'/w{xpqWӧipCCT*+"K~!МQH)= TCN Ԉh}LAyUa FY9{Cjùx.18 sIZj0VEnl~#G6i Ο͂ף[ y<硠8yZ4>]${ ui΋,c_DS,HK;׈yDQsg^~;Bx0;; nꂅs}.!#%UiFe IOT|)"K$o$ ϊT Ο;cر?wܳ1;; ~GRQJ1B'[8Eˎ;֢GIWI6Ŭŝ,A-rA{]Ԑg4WT@D`RK+OXޜ#YOD#t˱vW\OO[nA<.^͛7RG>=G(Byj]4]PGHZiz!ZIV*P*yJoZ8rJ%ކ[oU8&''3HnMFH (yp.8N_L ^%ׯZP6V(PY8 'v:u%zfQۊR$]ӯn2=fDDvVuKFkfN)r-|Aj5;{V[Xن4TKn+g00J%Ȱ:2 b+CFL4 6vY@-Y<7S;7.6Ep@mrR=DGr9BB'k_kl2\);\A[QTT֭[q뭷SrʺCS-.t':˟3APכKj !eRJ i*"a:΢Xm47~_,aڷ3D_~ *~0jFv5j}h=8y*SG:\r7hɇ)oolVaKR0Dti8w(0D݆y<;oǎŋ\zYɔ8,?Q ]MDbDӓa6`uf&B 2(~yabbBZ-RnG3%u]7IQ$9f:tk۵0V v;P xfcCͶ5A워= 9u`S&G? kY#C9mPR18I8\8wI^:|'Oزe *#yΊFk0><@#ㄜ{MpL@*s϶^Mg/@$D1A_0zzzpoccc@VXEBKh L!g|]Ikh$p,j* oall ~Q0>> .Ðu1Iш"1$eNO˨l"vh#iuЋ6;7zju*KAۼs!kV\R!=R@?220 q pQ?v R ;wD@z:$I&ZND#9!{G״s$5  늢v# Gرcꋋt:VA!lsL6,6u9V`Ԏy ugO?%Lr r eJr$"Pl"C Y#}wՆpqqQvbqn^j"Dٔ5tEX<ǔRa;dO읣 " l" CՆp1t:!CZ-^,G8bG6B,ض\Em{, mkBjNցgG+}yRte}Ŭx~XmBK䐓KI[&Z-]w8v82|GZR/ 1s-1ωHAiҋhq L{&9BkcY`JdBt:mA}}}:Bt:E}_EYpܺ5 6Kiv~M+Y0^,cj'P;7l紹{nӊ7 '!ymV-"Oft3+Ry,@HrJe?rnv Q*@&'&12:;o@h6FvnKrsգ(B9&ȺI9Sn/Se9 f䟕KHeDDύh5[:>\E@mxS;v Z-8FNt+ԑ9R]h$\966^OK6ϫmEai,pCRbdg4:r q?N麧쒓*t~&!b"9brg?>Cs:/?6G^qA_ER48UĒpop~S, ԥ#" Yb/HSm{Yj42/- Pȓ AQB\`alAR*,d)rjW"4 D;W]n-.b#;' K "풅P@\Ny =prd_mZI"'J PK悇'& IJ%I8(VT*t:(+a[^N 5 "25FZ Q1lB+'R6r< ƝËASbP^y>6 ^J%4M Z&V4O?YREj@Lmٳb'(rj{gVAʶšP8ɮWcVT6 miI9H;11O^ JH%q<҉_y/fhaB_z0T_T䁈XI9 \F=#TH|iv+Y8 SUk IDATvK`7xۤBɩ-sRj +|iQXUmJ!}!xOB j^/)o(_JЧobتf5wy99I.2z{{1?7>zzz188uA $i'y?|H ~u |nH/AÃBW4|b"]Nf0ZN* DG뢿*:QF( W*2\׋#,J%uyxRJC|0U`-aηTB B7Xvo^_,O j|ߦDC"j_~Q[oeT%eCh@*G Js@dz$v{ڥT*app3.}EP[&-IJJI(9m(GN9K*{L`*`#'r#Q JC.MOkx-WPVcJʕvN 02EDH/#}vÇ7`k!ݰ^_YO64EgݪÇEՂvhN?Pr]WmO=GA>K =\t!`$Ws2/12.GG1;;Ņĸe Ӄ .#a2`&Rya[#ܠ<#!J%%'(:6;p8f\pit*==Z^:T"ߙXϒ0 CZ< Q;7r ӢY0Eȶ.d_\1EV_oBw{T!.4U  F6C46t==hZjFӧI;_'a@nV!"EN/UPB/\oaEDmh#}OV옖fyO(T :BU`~y: =ׅY|߽eKpmwlUk@)ں|WÈb[.HZo5nػIٽ9`aAz']x9}zbVq]wIE]6 =@C"W2)J:MePդ#qn!W',Mp]ws]8p_֭[QTШ70==1UKanz"PvЉydcd4ELLs""b0 OyH->z]p]?sga֭(˘ 0:: u5 rM-YOl!$Ҫ57FVe+C:![mN2$.`-vkEHj,t1xfm1&&Z ?y?CP_X@E}/bOo>y\aS@=ePTS$'K7=ו Q$dl^.yY?XT*eB=v3xalݶ;oJhZ[׷dY~sI#!۞>dʂ"b _b{D2Mg?EQOee)Ro|#.=Cc6tͨV8vZ6nVkxa$dv:$?R%!誄ض9~EWm+Oo i˻m~7@f+W?I_{w\ƾ?sN.R/4pJ}R&T|VAI$$S(cPTqׄAHFV၇(o߁$W^z65 ŭeaW |ß)1W=|Cg铺neWW) E猢Hs7! 'xj54Mu}8Uθ$Ky;H 2zD!(ǀ$OJ0y 0ՐL; `  "ěf+Jɓ8| G1000 5<]H?' Och!,qE{FQU$sÇ~뷴IbP(v+ZdWVP$K &mDmN#NIqUCXL/mILID5<]DB s[1b̉`TGOYHp2gM. ry'?==G\Ɩm077w-8Z|쑒FPMG]9E9Nx=SFP8@+9\aff@;vD^ǡC~g=};xXXWD^yoskdVk7ܠeG> %a UܴwQYCNExY<`ςY<نՎ{;c,ςlOj, Oa:x P" aҟ=-$_y _q[9Hb ;_{е\> N<; BQz< Sٗ(Hd#'Rq?f+ pL <>^xy;vS;cqaG0/ _;w~M/ &J,gwݘJҜMa</y"tHk".%GBt^A^fK3|H#"?=)|GF΄V_\Ka /%nuժz)a= UT7'J k5HiO!/y=j@S׈ wF/t!LNN$e\-oUxعؼy3nԻnTD=/#ɾ(B\"2Td4H,ɶH!>Oٳxҋ/s}H۶ H=F3"KI=f*N_Aw=CTBEp~"<;p9mwݩ<`65s2b&}$a DNuP~qHKLҬi`=C!9y.=wf o{OcFKP*{J@]S4 aBha3>)'٢Xqm{1z|Of3N)l}),v}lS~ {6ɕ'&яO8s$:č܂W ? h O@ȼ/ e LS٥ `y2<\R\8u$C__gpw@__|πyFqY,.,``ӦdR.=Qp{ޝJ3BEwۢ:Fɏ+\Jf'Obf7@oo/$^8* &&q.I0ߠ? `aǵ͵j+MH$?Od"s6EWxc z:Ο"oS_s]cYvIw^|y^mx޶s hXo\~5MPxK}Qla(PE\~='^d,lu>b{rm,x?7<#zOز^پ/E_h$x ?&^czcS6ȃ[5k'D]zNe[=½QTծqcrf,,.q#hE=O{s"`G4#yZ}FTH<*kiCnB(<%c.g4L_V1ysP K@4H&d y$ї=f[ ZCMm)[< `PD~<":@jnH<'nAtMu,\v Z]"^.Q`UxUY3cD9k@ضxK҈JM}?;wHEMcGP:d!: IxEp,nقoD+'"TpNGi~!X>?nׯ#EG 6L2+&")xKj,Щt+.OF<ñx|Z<` <| yQ@\+zDɚj}"?Қu.rZ fA( N_Sg)xĐ"/ .R Y:(>{\FTR?av+sWP*pyv7p4īd๺>Aߟˍ>C"/UJ^{6!7$B_GJI~2v:[>0Doo/z*=ؙ(4#-@RFb ͙({I9'&$)v) -$p@ՁS|'Ӟ;s0Tixzz{S xE__/6ڝ]7>)Ux/I?B h%8w9-~t{ZڿC)9k:,O{-ƢJϤ5|u{w~pԝw▇~h-.ssh7Yi8t NąGqW0{Z4hϯ8jb}x]ϣ/nv ,]xl91\ܻG?\tOk5>^%KGϯJT (Pi gB6 AH`rfDQʾ! KϵC{\x}Q5OÍ1_Mo 6m$CC a`d$q ~'0s槧Wv<⍋/nʮGOZ<׊G.xuϽCnv=U91'KqbB@Wzig)]):h\y8L=WS/CIsA|)U%!oh4h6G3?;p#sz[1<<\\o_}*JF^F x+E>%Nce탴j7a`A^EIQd"/TyWЕsh6[h7زy3NOۇBzx[ߪECH<硧ҋ+ϿGQO<z_ػ$!{`.@w~qm4v\<z¹F{8q|Wiл@5{pc$Dui9ɳI3pi@@ EΠ[d<$PV+GO?#ÇN:E]p\E~M$)2kz =Kc4Kɤ2g}dO@?$H^<˥ CVĶjВGnxm]a~]Sl8<>ѶyˮyM~%!v+P O[uWLPy'zxbExmaMТ^;$F$8Dt셭mNT-}}yr @$F n% fg vV- Ki)~Wp!K Ė4ϵK%]lx9< }u'?ׅŭ歧ʕ Zx^.3'v0=]`J&WLۀQOiKAyR0J^J.t:j?:máb܇AD8ͦFKnQ%ƃn*a(E r"iv`h~~`'5k?VaaaS۶Btp9Z-UEAnh4 ?=܈%1Å0/W$X`|cٻќ-'Y~piT'!D*LEXzz`xo{xǨuexڈb,`9< WPZo͑.Oۊb{G)AgfԑYIo}0(-iULQNch^#8܍=fJ3/a|l CCh,. KlrKq/iCfDDr}\*1uZf1 "N'pD"brK1:2t:Ҙ>f,ґlsf?>*/@>(/1?V^ˠ ĵ6mgP?~`iQNV`H %K{ٛي-S-d\v`l|/\@CCCh'^9^mZE\+ MKa|xey M,4yMG>7hD((Jp]rYyhARp``Dvp-4.E5 φo!П͉5p=;F-~ {!q P<׿~Y<3⹑\QO G"]ijk߅ Fp7bۖ--:>?mH,)!EPl,PgO9i|@xrp 繖jB(Фu.4bS)u#r%׃zشiWqP&w=n9:/Mc H #T Jefk'ś'o,PrbA\FTB+appW̪zNyJ0#.\BmxX#W=O\T$L .Daej4.ݣqN^g:UfB%;^D1O}Yx?hg UT^x(*e'.hnw aRŋt:p#G^3ʽTGZE-7n 2ega㽠қ\əפ|"U3vf~v3QcSOj?ǃ:Ax9VoZ@$QT/JX_v5?%z}$'4Mj}^=S-1BˡH:o=XC,iBT r@SATI@MJ?J%c~n7x#,'=H3 IXz?6k=d⻖`e gx:+X-+s%)*\uxnx@Սw*j f5>kG֏(O?W,S^e=7:vZrN }"X {#ښ$< 1q]jd޾^8Dgws 5,kQx^|g=*ҋ* GhZ(O/~E֍"IvZԫE ˄yJeHp]gfׇQLOOcaa}}^ja "Au9EpL{59H?;UABLW1FM"Lh",EM<̥KVV3.}j*ԟ{M/̥?On_Ź>3"N ]tD꓄/Y$jWWVKxu0}<#ϡYo/ uI,ے[;/gkGN;KprWTt]Rۋ9C٨P cp0fr7tFFG166RM'B);N/t 1%C?-!:u`/&rRxPxEV#Gpj "T*|-87o&j{<~˘G@P,zxsB~FfVg7]y?ڶDa;tk%Z\[|,dI}޾e /Q2xi̓ϕ*':UPFN$%Ocjr]K%\AOO~ӛ>=7մ0"$p#(?G=? ;xWcdG_rPIж-@߃V:) یV&x `nzKUz`\Y\4_Z4lףU3Cz]qLvq(7smm|+'zJN7UPVOժO1y%nuHU/2J&qz.N:FJOC[nD\/~I2!)9N HIKC\ NDbBD(6oHr}.1Ff%DN7|?oUz}Ih d@c fab HKq<דYfdε'dfId!MЩØҧE`0 &fl7'n0)I_RԄy"))pSFBc<?!1 ó)mSDE%c<9F__!v\)^[(_]A%" ٨r}4\{-H$T*ݍ>1 _Hk4`*"H:=FME}3x U_5R -"'ځwDQhtq* B ` IDATpp|>a24\F2OAZ@Υ:8ai:NHUvDcf,8^+3`.u0<ooxx:Vx.Ϯm)6:+ 5s?o)п(<~EܐFx/ O\/zr';0]h3_O/JxrGBCsB? UK}D*!J@4j!(!bE{RJ_h1jX{v~ݥ9b"3m" (6ó9<2Ƴ}Owli2>xYQjؿ/*'`w5sp^3M'eU)#Ru=.f=z"x~T1S"Qj@Dl A@?SDi#޹I(}3M"dbl/[,{o ]00Clܿ UL|;wCN11111111q[8f Bۜ{禉2_%0q5]R#qFvtT*9u #tl~~/ݶ] HB)" +DkS nEgHFH==L ~$\ &<❊5N Ǚ\kn&a"& b2c$sKCHu:UB@CA! +uN@-S+V`b|^'NψOV ƙB=l-q­HG"f@OV׸z¼Ob<ϸxxfxJ~r{1mZE?ʗ|^5&ğgYh[t,ZB\X,RC'VMZeY.I1KR Gj/N_sDouβ˰5*JK-ˢ^Sըji>9i*oϚj6oʫ֞:UGv{szV7nZױ*sxi믫~/3u/x.ϩ_E) ۥυ׋X;l4 lVEb]P U%D?K@Wwj)z;~UWB/Dsš?ժ%4'*p獧ggg m1b<g Tgg<N?!&VTwPRG%຺~H 0Jg7amaoJ*ϱE= >@~#ϑE &<흝]hdKOjp T2|Q=8t6OywƷexF{g?O"<Z1پSF"kc<3?ސ,{ꍊxCCrJ9!VH)UM|IMu(ˡi0u` T #nGep |__-~b­ yc4D" RQo F\x睧~ +ÄZ݀鞬ǐO')Ƴ}x64x.O,-sQQgwپ޸x.OL,sAm!|I_Maߊ@q5G=2>WUBj g =Ğ':JU/u"``h[QWσM x^E4GE0M%2S *Є$P}w.jJBR +/ ٶM_ӲǪ_@'jDIO no>8G&ܭYRGy1E)a\81$,se &k^d= /-zDZTV'~c:4MjJ^oHhvYc@/+t=J8=]1C9I5ePQO#+(TOkuYWVj-;~<A jL~;2yxid&㐪y٬I 1N*saxFub<?QυGx=j?.y'̗/&:>oNGD}Snl? 9l6eT*UQ%j$8X7Dn$ w M@@DHL"R{O -H;%Y"ȝtL$Nc&bi>*!!ͷ%Xj~fl˞K)ns>bk͠yZ̚')dc<g T{2sgg_\xo1c<*.BԜn¬Mu% kmX!^zz^.9!0TVHwej!t]CiK%Q rmɪ6ʰAD( ?ΞJՃ&@1E/Ÿ'}}鞔N}o|25TaCl6HPC 3U7:k[[:B͖ { AiSXAM@loAlȜ՝}Gb1\(zgsߑ/-Ϲ9рg#14Ilsӯnȡ-!ʪpD;,A R؈uq~gx#"sЌK)댍qFGGT*~ \.GVkP諯GazB@-' >2(X2ɗa|!@,BW``x ÷,I>$i:d.dd2R[YTAvi -3g>-V>+ `#M66˾|F{1ssZ21 S6I=IDpxw/q/R4sx )fb<2E㹀Iϙ5#4eϝ/Ml縬f\~TRwwn  _8ߏ: U<'ü=r!.p+Wtҙ iC}޹JÊ2TϛYCתURV(*%B__6HZC=>˲8x o&dž2d \+W0 &ǩ/_ޠݟhDՠ}y&\5U=պD6M T +q@CTX}d&O&wګ+P, yr395@MO$"JUlKiQxj2D(-[ZyH *`-{lŦ اlXl'Y&69ϙx.vw6πM-a;=6(`Sy1g <-s s~U둌϶ϟ"Ƴmx3/xőE ʦ7ɻ)&#+ON~QyqM|j[bu|{7 |/lZJB2l Qc`t %BC5  ѿ#}M"ϫj|^@PP{`&SuYLMMxY24H - h:uF= Hޙl$JԿAVٶ}͛?@^Wg:43q<538)b<~rds.1=1_}f@C <2+28O6 Teh r=Y*8tVkaphrD37䣽q@A\G[G )QQ:dΫdfF&y92! hЄ Kσz*|goYضMazZ T>U=%EL-Tԩ'Am$\j533dSx O@c<8jB1mrfQV?ۈg;bLcJx9+4DJMd(Y ҵ?^ BA}N-^E&=?>6FVK/eդin.G{n^L:KZ]xV5hE`K|>Eh \K`W] )ܶ}7\Sr'\ Ƴ=(1*X S\OxUg[rb '_.>ߋlBWAʆW+: k%xz ɶm9B'8 q1:6F@iۤRG:y4 !d#m?Cxj.IE]-h7[ [8}xh3g8*Y\oATnB]Gxvd"$NUdxT[:eYj5,ۦ!Z?o(| m{y^zs ZڶD`fV ^TOpY(W?{W:7dtt]Yr%k]̢ j VG20 :9^Hc5g8R TEjXɾlqcd FaGAF/w<훔jd-:zbkxloƁcn= 4Yg7NdzO٢jwфǭxsqlVxց`ljgx0g/9x1f󺾻Xk,^wgKsCNPڸS/buq_J B!ڼYF3{`#{ jFZ0t:;;,G_ftt˴,~/o#jhyR}- 0"{?ZJ=bpdC+:lF7~fjJPj;kfz2MR|T*'",]4]wUBUADϘaL8U4w׸ťxkkzv-b^Sj4PYgo7ph$Hb/n0 7b'ϯ3{ο/?簾reDl=ƳMuxz|{<[)2"_Ių,Fr'Y6C2"FN yJC=jXaRnYlRJP)0t}Qd24v['_%5Kp{*/AU?Z}}oh{-$4M2,N:T,i{>bH"@4&ǩWTUL5{^wBs{ `w$2vLhYND6oŬ1l-$H|_u,}`ԵVC\%/QR@ 2:W^˻VY\@$nrH75&/ IDAT4]Ɓ.ڐlجzxEFwZa:ڰhg7)¸qkgmF{Ug<.d2ѣ#<^nK/LsE\x Jn>vx ˲}rUk?<_< O"rsgV}ȵ]x+?x>$-'ȥ)*iIkIUd?ާ/.*LDD/ =ĬGP/B`7D?/!/  7_WQeB- ȹ64)J\֯'nG2,}0txe=/%H,[:D w4Za0 Coxſ't9eLCI:Zlmu>}I}f)==Yגrv>m{[6:ߜw?$` xR-ޮf/K$;^(PWsxx6Y'Hߙ[`ܓt&׾{_~BzM|ls5X+WIgv ykŒ_{;{X߾ÇwU22bj-!|sk@>ï=?5<= d<t 8:[%`Ɏ3R㤟74EمS}ONM˲(W*tttMoo/iit!4* b ?4&^y ѫWBȆE8GZFoWf4MJ2lLų?Loc&LՐ~dgJcp: Gar %B'seO88 249M#ݑ&ۑ!ۑE e&Mx"otRL-=ڀnϷ.+V.t-m[$c8]<6no/Gb8\нw`\li{:Np\șظs`_ۏ|[$##qӏ9xh%k o7^"\_0؈e>Ed9[OnXw{nBN*5E֍~MX/?~KW. &@@tL㋧ECPǺHT5Xh輾tY\r6k{g-Y0])vxlƒNylx{YzիXe3oi^}m7Z¹زy<繅xλ{c<g6'l4+;ηɦ W/\DTXɀg!2ޯs9a<1n3/̈́gPbܹ?ft FFVMÀD6|}Lvhrŕz#`*%P_S@ .(Us݀m’z!a0 L&1J, +ȧ3y&?[-@ϻ͢l0D2lWˏ9Pkʡ FXh055Eww7SWDl&I77#Q [G ﵧxn܂m'# x `*~ 08z4kYHbeI>w ;O~/&Q>mBK/3%x)~- &skB"|DG1㇧2ON@7a:+iG~ЩL2$eS.ؾ4];).pԖ莽b <8珞}g}5vz {G^? \>_d9P<g^?<_N"sxZc/-vVk/߸[w[n޾2M |'9iH8a bqf:Ǔ$|K.y/.νy{Р2=3θ[/{v<|C1 IXәZn\?`ma-׿p=UO<֜B}_•$S=9׿Iֺ5tyky}1 >P(g2c<(%kag9^{<D10'6˒Tkӂ3x~U.\/D:;%Մ_OJ9:y?VP}*¶m* \+Vחw,~@*DsѾZ 5#ȩt#gJ{V.IT,nRP^zRk SkNM4v@wd2:Lի000HGGiсiXMp[wm%e|<8= 2TQHRA4nu<'T5~[_f%%)\kl>MIr"CC ۍ`p,60~N^'NyY .VQ3U ɶǼ3n_WEE,x#usrۖϐb7J``o[Agg?ynT n{>:6<wQɝJE۲,;@PWf0زAGA v%d@~~>Z{ #^4Î8_"AWWP# :ܿ;38փ9VR^{#xu::utp7sחj}>`d-ovNpHϛ_sKA9ubBIjZ.s]<rJh vdu'\isƷ`b[ww,)XxOM3(yrޞrDbhi_{}LL+׮&x֪5:M7$>_cM/ gH^e>S4`myZKq/B[#\cNa>$xu?\4`SMۏ>!%i:?0HRȱc,_E&'&IK::t0Ug|͚v 7@ںbjC8=PWv"HZP eBbJ\eY#tR ñMLL01>3͢7ɟ c0BbRz`bJ% O^7|چϽ ?+tB_|l9?'$CzFe+ش&۶ tHD'mcbuF'ݥ\*qӍIi>>xx1H4ZӤ6}= ugzΤ+8SP.27n}r-룧N)\M`ےDKdMӘ*So89'xRudž)ks꟧j8}<>ŽrL&t<?p8ًzV}|W_qY?\w dc "BBs/ԛ֣}(i~zT\H&,_1]ض0iё˹}u,ۚJdV%"C=C%A*ƊOKra*WNx~؈GWx\sKH}aİЂs=a<=etm|<~/߿US*x:s]ܳ-igeV8b8ucm <o;䊴kc\ I Jrs DhLNhՆ O+w*mz*}Swڞ6ixzsg?8.|l1E<۹-F{zvG{rr)^k⬖+hټPR-,H(#PH~M 4{s8LbJ**} -YznzHpsg;{[Jyb}H+^v(!˫0^Tz)(zqC2MM8kYE~tUHT2E* |LGSO;rgB\O=s O=O (0LS{epnjŢE a3OH# @,VhZT9JδϹu׻gh\|Hdq:(um?J% .1g4b|?-w)SOϲ2xLL:Rx5MhzPN1CJPHZ znB.>UF;n`p .bŊdY,ˢZR7M>ɝ=FoLch=JC0KDdbDz=d?#D+$=D]}F/008Ȋ+d2IR Iiz=sGϐ~'_K?Zy|믻'^W?Lr77|iz^|F͛R*xXVN̩0AHui6oZ 36+YF>"xҠg:%%1e\L3)!aqg BN|)m%f\q;v 95N=,KLL9x3υs=de+xjf^hzt̟)U$yիI$$]/p%HIXX*Z̀9gZowGT5?&_}g-m02ƭ;ً{xN9<x[6oU/\I>w.Bg [dzzxjW u&vx[Ws;͕?shӵV*u{"(da=#RKzٰA'v{;3Oڄg?cl{aRF.AUЏ(78˰Z*@&!4FBHI*\.͚WoͶm \u͉$ЂH}m~ƑǨ՜|]#W#3.YM56*7ǩ6ytIۆjBaSIIhZi zZ{ IDATuSTu!à0EsIBHGy%3Xs0(j'Ge`R6Vlݺ YI$, re26C ! KduJXݛXٺ]"a_`d$Km<zdw@5N7鰉P@TfP =C^cni "d? e%yHYtTLQ|76'/:zrS_GMZ8-Q$ Cc:4&*[dGZ\4f ;3Q3ؕ%ՙCs:3 }Nߓ)(ͧr`>ծfP(ټiMe~b[?rVg43F]J0T Wr$=X"2f aar+L'Ax'r ;>68ZO|>zҏvCؼiQn&kA²*UIg5,~&ycM\":GEy\4FY~MFBK:>[-(:|u0di8H-9Ig"IZw0t K2-^v0 ]F#AՇF$d4~N0m(<HsW㇧eLLcϞhJtz'if_aL\vǽmj]$S\tџϿӶ9ދRx4 ֯_ǭބi7;I`:aJ4ZЛͰf:6+O08O>ma$:]LMNQTg' ]RB7?-bb({n}hJX TreGtЄ0f~&N;aSΗآ]%9 A˿q9hM15YOz9W~>8;{wI//#v tY2=etBR4셒.E6 #W/ )7ML:eYd;:/l? ?6*xS`ɨK??EB` ' #<=@^S5z*\hGǻ߶c˖.7/oߧVW!ݟ=ȰmΩW0Ɠ-}RfmHRO%A*W d&GSYtRJ$٫i-t$=ՅQ.ϡLnv"M,>g%FgϞ^o_H!G ܺuzKٽ;Y Lb0>%2lz{KR6BzMct4-^B<>Tlwl zFG3nQ$+ӯsFlbc4fղQ&Ƴf:\5,-zs%R SSct* J{SqCЀ&X?K+o3Z5MsƳnϤ'iӘܤ ʜNy]LL=ʐNZ!$]dEW/ӝ--cc%*e}oђy\ܱ<S)z̨?|[wDgw5u[j|9<I~9e 鯭Sby,n۳Z'iǰp$;nԨO(GcNYhY,p3p`){5mj|bLYϱLLk=Kn۳Ztq$Cm>82ϵ,s-WVoA^N?Ƥ6Y%˒ϑ݌d^d_f?hRHAOe94Lk|>1pBj$]LaQ(Tlz='6y|e0>߿jb;wބi00<޶)d2Y1Pm]JggfjN1@L{q#4@7s?o-wl|qlt1ezpMtsG"WM,]OL1~dCs>Cu],nm3=LaMNZcݕ;0[}4@3Zd/3 tXS˒*,Gs,yʤf "KYƕ}6 /[̇O0ڍ%1dħsǴ2% tǏ ?JdgK)p.pӻgͿύ-#"ʥ*l "qڶDOcOw=s浡Xe^46 (T[U˝"3+2+K1o#Trx.S?S(qsI]ɐ()4 >΍tnFuyZ4W#N*G,vMb~ NOqOY}o֕~1(7OB}>tE<{7Y_O3A"T019yK巚z޻7eѵ)r#~[ȡX{ߺ\t Q4fԆ%/; þ=`<#)^ǿ+% b{{;|/ywaOjT9z<ä2͋UNs4 =.P AJU1ը? 1dH!y:HSQavJ'Mt]lvXX0S?~O>Ϝ)TۿGecض]3+f~>K/gY^NuKM /tœWm2`*_).-1MرM!S,VSt|Ϯ6_>p"9{!0_NQnX$Tm͝mۉM:*hj +>~TEgk$t(WVt .6Cw;6[݀i&^\\vhK-N-"?a1Y Qkz*vJT!Ywzkp8Lhו}?3Lr|.jxjsɝIP'P|Br1zzԱ\3˶s[ce??3{_b.wS$ءtXL.Ed_D糿G/# Y+<;}{UR&Ѥ @Ӹ(1?rr뮝p&WI0d;mxk|>zl8{ܻܱRxfArEL;TF2b2}!Ђ 5%×q$O^&" $G܇$N<Ǣ~PABF }|m͉s73˶_p%+V͏0pe!Dt>v9 .w |Lep])[Gg߽9r?*wkfg,meee??޽/]Fd!\BQ"\J\x )l{ *w;/qi qz_ M4LMMrH?Ϝ'؈ ΪpHq\7lٷ?oW.cX 6܁l;Ԗzd_ػ7|9:^@?=2wL{M6x<4&WHhLxs=;Sܘ􋈔#` E%˱m{;j?{9Hn@ݡlH.P:*V9,n3 ),հ Vy9xXK;FD|ptl|_/YOfcr"AZ\Pze7"JiL  "> `D?89R VUMPU' O>e_[!(o$t <:|o'o DU)2AȲ$IDڸQRծD?L>7k6 ( Zm1%[]&3ga!EdS,:<[lVg|?\ϧ])l5jBeqȩSwrUzh0/BU~M $E~:tvO}%*%azRݦ8ô ;_3k+,iA 0*"p+wwO>4^;LuW!X7ϐMT+6?7|ҪG{P;ܾ. /y TԘ{)e;UJM// j ߏKUNzkyJfb+c'ضV~x_G.h+^%Thd1WԾWpϹ[.~UΓ~@lC-Pʜ&"N[Ħ˛o/1Sp*vs-aQ2m-fbj0m[~av?Se1WԾpϽ˽*]S5mEY, ڶ. [(JTYr@Os4cf]^¶02Vn*w`ۃ*m/akjj U˕طΝsůq/0:f0 gmjDžLK 1"s0$@L1Te0$}0ݬf5 =ĺv ׻wC31}o&͒C~K{V|{] MύnFFldM0w~Y}? E%a!M/cTA[Op‡[7FvQBSUzP#V+EJ|E墪nav?#|AI>EnQĶ=E+P29`jrTس̝w^%_;_ rZ.:YyWVײxY r'3qQp]/xze߾%(Hȏ9|oQ_x3`v1-tŲZ0h05V0@.lboؼu-UKȄ3-"@b ʵJ|.B9K>a 1' DkYtfU jةSAHR] *Mu+M!\u(1aHPkj$hT Ort"*YZHCPRr|zU5EζD[pj7I eY)5~ Mcs\ iL􂛏4 1N(5sg_oQlh2ٜ`juB3L5'(yv^ӿn7'׫Ԁk~5:;B`/u{eؐǧҲt-TĠG3F n'}itw^g<+L5a@W/`, 2*rE~.:g+j_o0g{D6$g3m 1z?#[L? I@Y\``H +(:u?DyDPP#d 2r.8=T*ݖ7K>I!OS[n56{{}LX.XJcfҦ%;g.Ξ}!͚ZZo6'X] e"8$olNR䣫_GQ$/uT5 [`߾׸xDa$E> #}(XG&ps{ͤQ) dcz

0DS{j9d?~= IDATZU~^ArCk}O}n$0DĿWEnjk2$D_Q[S AHhYb U+E(c_6+d4WU?n{1/P9SQU:Rm?>B |+skpL͛W)\\;yv[!T{lmRmTooΥ'Oz"N0~|">:erC/`H$nsD|QO|;ϰsfp"s. 9;Gߢ-[Aσ4 Iao &P +֚"(P/˷kPk aZpxfٿܥ[TWHuVt>k B~6C^/:3ޮ̇UlouHJG$b>4ɥ4f xC 9yFBI(9>Kί* đ9:) \!5 ׻Lm9|8|o-\L*n,r[lJke2 խ,e{B~|ȩ1iͮ.jl-#~0Fqn+ aD A ^IVG,KA`;9EHZQD ҊNFpQp B Hk "he޲^#"T+2 N S |9&~6@P01tiӢTE??WA)4mF#ɥK_u.$;O9ᗴZfg(m` CN'C9E BHɘZfׂ@.f}V+ŋǨV^\XG㯟vg/86KdaO#lٵ.<>Ύ&x1ȝ)ܼJF9%Ҏ= 'B^oTHg孲R"O̪36.>:Ku\OG-7%q@Ûx"7sO**f(>Nsgj3>1^C?"knIOGYo7 1 =Q7e]{:Gf,9`׷~NZC|2 XzK-$2rt*V*\ nP iq̩1DoUJYTuv֩ j8u@mz0 | v{5 fSi P' ЄrY!45Vsx*b}G\<]m[]۹xEߵg+XA![Ķqq.]:dq rChR8ΎKe}@i4mqėJ\7<r_WɿQ $\w?O.w> 5\LhmZ/^ %&w0v` *Uv ;Ď, S')סQMץhhc9rH9~QnU2/<9S_x9 <d?)*IFz05*,|mi{5tRMVřn_8{]ԎlӱZMJwHBfG&]Kud_T>#ٲUGœ`&lƺ`޿wm/@WO2dR^G|Dz}oi!c"Kn{ Bߊs"q9 誾d62A wIk r1TAw1q^X_XBl}^/i4Eb} խO^[@jC2uA/|at]IZI6;-A!9(=)H0֍!U(2$сUذ@* 5;-X6ɾCi5EiXNQcmW8wpt)TՐ/~?Qb]J@l<^݀LCWXXLQmi'~R1]kt4 .0@MGrm!.Wٛ4|%9OYh/St ܦi -ewki2D%KfvL~D.&J+9М!da!HɪҬ'nVnx N<ޛvb>'XS3W8i; "ro,[~X2m^9ay޹ZW>{J <4OȴB2EJnkiGJS34Zssj2DK(JviCV+ɕ+i6gCv;E,k4Y@wG*4[-&WNn-{wpCeнLM"PҢus\揿|FlG/)P$;̾gULayaRedา\gGR|lYH@dH?2Xי¦s1}giv/ͮcmL @TQ`bzbCOT5f_, {_SWy?wRwL@*զ͵ N$T%|5M][ GgaWoJj4jnKU+`)I]زōy!DUb # ڮKDB|>P$5?nh-4hƒ %a[@p3߀V4=b/x%7|tEP5tM[Wۜ&x6AV' y~?X5Vk8F@ P*%DcS|fcS|J-~=U擋C(5cec,Uy{1kCOؾEXmibٵ%T<2_nͪiWUJUZ:cL3Lcp6ݴH: rGTvD,L2oxwv4vT7ʼP7Llߣn$F:x²eQSOgdKx;"`*HTM8W^SPFª~@k#EUMK,@P*jB) 4J5Nup N*̡KWYŐX=;E|%gK(%KF8ŠsQ[X\TK1L$KgWR㤸red2`VI& W7cۋ\7aa *eiS|ZshRXq=BIVZNJxa TFW𺷏=FJG$&LS_R*KWѻh6/}v|9 ]yWlƎ)%t籼8rtD=Q|d#QNpL@!IΧ ©x*f9=(E~&$S{{NWSzHi (Q7mMq7:Ǿ΋CO h?=# =D&״YsjrwB} =믏ų=*>Lh㿏|+uJa,?J<ٳ/]a@A0[Kz^s~}^Vy^W~o(m)%mi7$$08ONb0и A0 UTl ;\F!R=+C9-6(/Zvf(q)-E*uOkZ޽"/ceoG?CCg_.]#2JKMȵMY%M2%»Y?gѻ#dձn$Z%jmt{Rz˚;lȑ<Y|u@.ǎR(9xp SR4n7mj`SS @ m7:6_%E/pp5Ŷ\*iEEQ<ߍP> CiR&MşiF|_Rjsp^UX|yRfӖV*Ba]fFV!LDz UTdMMS2 lKr +у7>F>mb:){ 'bJr[~jYs-s]㱈\ן\BQUF* H` [I˚or&9yNz)R|N; ]/Q2J\79ؾŔ3T6bի_WY ڏ.sYHQTmtحew![Zu;q&Yplt9vaBR_JóU9 :Bմ³W^:zvfXƢ}g(!$-*Ⱦڏ3>Ua .g^V7F ds$ڟM%riAS cR`}ЧMDCTPd1 5Å`thk+A[9l@˘~WɆFƏ^ANc_5\M`'ph~&֬>߷ѽ]G…twviVC08Sѭ( m7:: ׯO3ZW|׹i~Nf  ͚̋o4v\v/]#LdEOh9DDylW:-6/_g" H U!R\.'h艁 'ӕyw{0dNE7hh5WTsS6|"I14fN0^t3 . uywTяa^C^;~&IJ-Ƌ 5׵x񅮚 w:^Ox|٢VuQF1<'lNn/}(ʟiGz=1]8p={d-%~ț5$;b<נzA!YP.YHUl( I&ӂkKMjUr;ڱ6Hzu`2޸·딋*I])ofx*($0Bdg[yI=L-\\ /~t'FM/GكLWwO#Lb3^>=`8ˡJ«[K\QP>?՝lv;Òb~ׂÔ B2 {OiÀ3 jat}s@&h1lp6u<+FWN( W$Eɤ8UhU<I&gu+JZw韠tRLTcX$Re{;'RBNy!~X{oQt e3/Joc''05QȘøndrZ~tE\e*v}(Js GQ@o5 u [ 7Fs+V y;L[/Z2*iLm) ,,,uBTH طj*[o}A@V{y u|ߧ09E6-) Y+rsk"-)+ofGp?[pI.Wu_QY9Czv j՝%(5`.4 (vJ`(}5EuĪ GrWo8΂5Q~؊eɍe;@z"ދ Ng$S6 [!kfab/'ZayMS'ʀ@= > :OSIL&{*{ }ϑ!E7@1$RQ$8uVUUFa FO3@&s *,z?[?\ǡhG>ecV( aII6Ih( i*€V_!#%Bb4XVm4,4-`|ajjnf~m̏G%wplT/hßN;|Kgq1ͨ1nGBs$q6[Fi}^QBe OӟE]L iK2U&%yc!@cm1i),l0jxiՕqy Rnl}{l#Rot8NR<O C{{he][_ '(~M`&< ]A(uhM0fD[@hӻlvTun%afZ0Z iFA0nDG~ǭKZ\HTeu] K 1$@#m߀Q݀}>Ӭ㛝=A}+>;{Zah"Bdn0־&$*cȃMus~&\kH?$_ai/! b'^) /b{a0X9tP3BU`D-4^$1"5, 9vMn'P5$촻^wz}~R\q>f+@;PIs` Ʉ]rQ 3x|ȖgQexԽwy{ꥺnt76R7@iZZ-Q)E:&g&s7o9'9>ǯ<&Ȳ,9c'QbL Ap 轪g>Tn,HS<-D-WruS&lVwB4bm m|ԕ&\S晘(H4xqӧ 6ZfuR*/4ϙ3G9>A>'o!mM懇;ٳ3llI$:B!a(*ѨjxǑXkns8u:m\bS\ 8АC,aG< 2Ǧ9{yrm@24FHU0u%x ߈/p։kahd)~|S3\9UK r L Y _v/HC<G& Wu&^\hZVHXHO*&d8hM264Q@s),4;Az7/V081@ׇINşs$ٟ+Nsj&*c$ .&.s[,۫y4ʘo]iZ̑p~d pq ]$ߚc˱l@!]sH)xcMaab(D} ntk"0^>$YiwgNWJx"XTbSKLT$ .&F8}(v\mtKK9r#\5 v !cC4 Wك3H)y9jXh HԫDjGJ,.ʣ eODq[Q< mr;ͣƈ+eދEAa|uuYf5$3ߦ{b"ZhQ֩E4(pE JlƉSJ/!`cR! BNSD6pKſFaBc`㾾J(VK{/YZzJef3A"q#G¶WH׸R,-=[0@K# /ڠZYKO~a uQfH9Y_n߼;1=|& i*4p ~3M6A`RbGq.ҩy*e#9}{9N4gJ?tj*K/-g0\iM1c@5YfɏP$}SiDYnx(s^~svNZWo+nA{l6NDuP{{Phe FvVCwk9Rz6OEt[%>\؊O7֞y^OK;m݊6h^Ok_*=ysiM(hNsJ+%:|^քKJRWZ Ya~3dB0:7ca iUK {bd \$_Yfgs;׏79Y>r9xg'fe%֔y>?NH@2iq66ܸ! (3p}eI8?2~ٷpg=_j~7_jjΝDx9=eߌS576 ŧ7┪ nO2MI-,r(o,ξ5S }<4x)s6~eٱ(xs2cake2߮+;oW iIuݏ%Pp@8~kQKB8 UpEGbT![{Jpcg/?~?)?t-7O A XJa)l1ǫg-sg23Xkdk8?fg>[dj*/^ n ]Bxo2}6d_'L3ǩe TE?]^x4-w#Ԍpjf"Dj1 9JH U.L")73$)NԿڕqo/qL^`f FFVǙѣoon4KKOqX^wtcY1bk)ҕ Vj^}$RY^z}Fc˗i.-#3;Ο^s A=8k}r>ɱQ|( *ϣ\X,J-R uʿuL qؽI ҽL=Irxo<  BRgs,zbLK31F2med`yS6K,<1K'9{%#*`>AkDm|{/&?ʴ&H.7gY:}5 .?{?#[8[4;UHe_󻀻=-Zt5mE۪4{EDocf<j[nMqBЮDt3a'r /Tl;*DF@w@n;8ۙBPwRz{#zJ$I*l6 ßc2LmUm_ߔd9l JwqK҂Zm]ejEJ{.߮V nR+R_T0,J[ hF,wix$ $C, arͮ6&ͭ7Fi6\4 e tS晝7G i^ހqoY`pI6\gXD,![dZ },E$Gsjyf3 E^' ,e2Y5qC^˜~CfG 8J̚u6,sg>egft˲j)zD<&*YgC 4sO[xZc)j0w*GJv(jU(` 8$ 쮹J\@],$3$lZn b!y<ZpQ,,xA OAj3mCQ!7Qj}D4uc-vO5 Xר 5<48eHA"dYB"g#DҥV(_կST*,-=}A2=d0:*eR ƽR&R: ZF?V{j5C$R(׻w˲_V62 9N2D&s;9֞粹׻ojYccd# opM;LF&lje:eB0 f,QN3!36 l5lYD̟77ju.[g G#r]BO7iRT&6w}/ ed!4eyT=/'qtgQ+ó9 Uį'tOn\Ȑy9[kteඊ][th(ݵfjvtvN^tޭfzt:~~-4ST*l6}OC]!z%[zt7ND7Uw~_7MO(B{J[J[xvV] S m|6x#cۛCEavaM~lGg`f̛GYXH K{8L6]c|K ⬮w$! &N`.L{1u]B߼NTC2;IR&g>)Phd} 1|2Uov:A AUEm<2YjC ɾd aȮNXw%c~SRZCCó~-e0S<_-d2F9L>R$kpf^8ҵ4gt>PVs|⣬kڹ=ELj]af)ng)4zz΀޾@x9n2.nGlv3G{>~V<7!Dm>:4|+vU;'ZD[m QkHVbmt{# 8/10EQXѷX uȾ︷i\eQq]lǔUc#H:7DrDnO SIZEx Kf QZ*jV$ѯv@'XT 0H^az-j4g!eokhʡC r4v*D~KCl˸w]f3ߏ0 7IPjx51Z oy ]d4-FRi<ˢ=*?YY>(5Jk- V(Df>L+~fL5Hz-h\͏eOmp8g}k5}! IDAT Z9sp +q[B~3o-vƤ8 W[o3] iC=,󏺷1j".Bb1J[Ļ;*P(D(Ķ7mC[3 p:Գ` ;L[݂ !^C$}ٺKTpNbbZu&''?~ǁҲc@rзe3J16xRds{.W0?X1, /$|ߢa aZ\_:N5DdpӐ#I>0&c3Ȗ*^ɣI2#7*殸E";a xFͣ@vo,f|%_(ރLE6&zN|vih_GX~sH_@`*s^)¨-{Lԫ iHb2͙d!_ oK>]rzo׃A5 VMํ TlpÎl9QP~~y}8`5L>5.[*#S) MuV{#QP1uhO#Z)""}ZQISh([g jsKJYORO t^2.^OaoF}F˸o@$ b1\RrPb0!̧naZiFcQOj8_Zϼō*\2){weR}4k5}"z-Ba)RuesnPՉ2ґ$ϧ>s;;D4g}zʥg[G6V \L5Fk˗/ `݇F9oZvP31̎KLp+q E'Zo!B_rtv׶үo U4MlۦX,oG.ZEPtAg]5]bK~7A6֝WPw;I͡Rjva`6|uwI~׾}lW9ĝC KR{GHHY}GS:#śG6Tѐd{9תd6뺖^4,ex|F) _0PB"8T}Sy.,[~~tӠ-JFF-^a8&*pz¥anr).\/`\[~͸R*pG"Ea̖FC$R)֏T&'Oph4E8%~}G|zBO >E$ˢS(nŤ\,PB*iTTx'=^Ft ͞SjYR#b$os{B^{MHL_rbvk7giṾ(kQF.dߤmn7oR 1BG7Yz L)jFo4XKY7z#Up4$DnE8i"z_%ݾ(aDy z=uqxޛ;^`<"/3oqu^=( ﲑ/nQw,C ҩ[6mrsx|gzpjzJ$o{$7kGiX .>gܴsbPр?7hmEftgD\tA2أU,s3xe###}{5 ^5 a Z{Hx`Ah]B.$&~OO\XeO"9"Ln[^Ũ\#QIȡ_jdʳ"M,!މX1BfH*'6L(ܒ %n(2nW- =}߫hri(5Vo@K7ExG&Smܷ"E ɧf-vJk C06ʌw|:"o9nN>LܖtW'#d/.*V|9miZWfer%sGo ܁,?d.꽑%9dMζi{h"dq; ErftL.d,[6~r ug2BO=SOq_HvjvooW~5&cjX%h%;f*}uv#8"QLɀ;RrÎjۋ|4:R*eF+9<V^vhaBipCYP]Q! &EpؔYʎ d!V%ܾk a0FI>u2ԌZxwOSw3k-Vʽ/Dk5?Ulo'w{Hט(5JR=vjxXM4dRX8\G>I+3;;Bc)Q RM$3:X*G6rw QT)H|wr__ґDU=+棃1jLQ/Ϳ; \(v[ݬ~kE{rrw zE>DQu7oXZ\dbrt:M"h-vHne|k48Nm4 Nu w߃'i`'D:pXg,1MN/m[{4 J(KX*EiVTBJG̪cwc*Ⱥj $j y꼭s|6V<2D!kvǑOi韎^T9yr`_=I(y_`y9Z;QDsffs[kϱWsهi kK6Bd$Y8G dTYƷ=]iIesW㬭o{!}ϻvs* ך +=ύۼ8Pso69IbWxG Ꜿ\'W}|flGGȌFXln%4O5UZcy֔pS6>7oy$8t,̍x \xL-hG|}p1=Dou.y7f-u(v; طR**q_z؊fD2=]#`1-q2J5.G*⹓'8z36 k;5<2 t`q?7eZ9F'ҟS"kQd`/ B5{N$rDK-DZ⟩VYwH̎V~i7(Bݝ~F#|?O]q`kZyKnkـyoRVT*Bt6Ƣߪj755E&??{kׯx++Z2u]rjvSAvឩrv(=1v v"IZk<[b!5*i~@&LII SCC60j\Q}nk ,xjd';Tǎr65+羹D6xVy'˯0U.1U.q,ʩyFULcԅy2*d8˱}Ot-;#vo[6 i(2΅>%q2Hmxo@;p`z#q=js)y~ݾ `$gz{Jfۑz :6u*}T*gn!rx7:x}zL^y/c~&_౗'Ic&Ӝ RE>>aHNQJ@q7 ~\z>3{n)ŭu^'σ<'䏭P*Q*?ҩyU<ӣ8JrGsD.E=XY`*k'JlU2g|#90T(S[j&2 s?7Z,)6ؠ^n;f !#ĶvN/dEJ:jRƆU1Jy&N˫TU674><[Glc %>4=ZndH4jT*w1'eܻPNz٣/YFᆐb(ŧ[{6 cDٕTL 6ba.uf/)|VMVW?rp5ߝP+_B(TZӲe&'1THaz:ǫev6G(pI>ov޺ pɍqfZ`d:WR=wm4\Ls'X° O ϙ+*`X#Q 18WdTqL\GLS5,[ysf8F.8h} {15M2wFϦ&O:?x0 izo`"f1Cvĵub!"4I><8e.^Z 5&j@47 x, Ikdp+}V<kdgsFJAuS:xZb2de`^%kᑪqL O8. u~3\0psÍX E"0O_zzb[V@\H/vU7A*5ODd%vRaųsb=XwwvvY܈YO]Z`^vMEaT6y5޻ws%hZ4U.< m1wƩ+5’{zU"0!5E{Ξt mgcPJ8,yv_%SjgL2Ø T`zޙ@ f^pZE2N2mX<R:vXluT}u~3g۬)b,Dipң{? M;OժA>ho;(zAEVkw#39'|xu+U#0SG4\ɮpFaԓ lYE*FX&?ys 7\;G}X2ز,GS$Cx6 ip^WiQ7ۄWPpjJxGebd1l _.ÿiQv>+W>E)2d_ ,36I3?/kO8Bއ(mVX?=cr+k(r`4b֤3)^x2)˫l䷯BPo䡃bxtz )| sƀfgy Q_k 2ygNhgCl,1hh9Y 6h7>)DP)/(sW()`M/0}(0^oKFg3U.Il%-F7 ,13~G6̔mh gs\w;F)T ,+{/νR"FVRK`#h ~! CU)֤cvTS'ժA2 Qxrh[xHM,Ji<,xd253 ƍ0>"ez2wiUH h/ }#gx8,~$VOxrv4L7GIN:XaU#jQ)ۘN,m{X!X%Ok|y\Oa u}F3U aWX]h~V<S]^S/%+<7flwsvJ *.<_`Z6<:q}q !t22?Sz7.3Co%]T$Wq }VX".q0"}4X°m24OUpO=!%O÷0W0Jcs ' >>ґkL<4ppcv7Iͧ{acd.vO'p+wApd`&!O=_eWU!ώp3Οx4¥OJI}.}\<}w֏qdFSwLlfO2/?S<qq x5^hي䊫"i?J@l6RTvݽZdjI.]\72Gafb+3!:LUx׳{aZO,R7[v)_i~r_yCjQ`a>V9BRҚS3즮w5J(YIUdWPf08搷t+b- d!ף[)HB%#,U)KqIkKk(IMHN46 kH됑[kED0?wpęϝ#m2;TIk5NJr]*uie=͟~.^LS(.^'yxqb#u ##54E ёᔭ% u dyȑe~4 񼍎ٗ.u19Rɱ{V(<#c?$NJp3-/%df1ԕ,W|ܳNNܵ0[%mq3`Я뜽͟{?3Iz5}ty$2z*ͪ: 9GmP?&p{2BY\PIϑ}<;Ez c"hr1_cu)<ᘞ&g)yl%)?Ku6)9[S<㖹7PKw20&-ky^^a.%x,GbdG:Ȥ\W12?QR\)D;C7NF΁Mp%n£KV5gK1ҟXkX29JiiC!w<*|S|n4LvM3N1n9?]Näm..Z~fѯ2u ɕ2wwދF ID#>IVwnj Yl$PVrx)Ҥ ׊|$fzF=eu4a_u!4*r!4e=(&V>7ql|.ǫ]Y=l,y玣 sig8O|/4~ZjV]=[Z3?^~<%rHh\, ӛh2VeB?=E"Hz.0db/ ף t =T(k׿gh4? 3<7(GalOnV#\O\34 2s9ܲK-pA̹n]iĪkb>/ŇD zZJh l &%c%Ȫdu",[L ky@:69+2.)|}/iE^hB\`*Cֺ̄A:aX_'0&!J۴ i6DuZÄsY:,[PFO>)zjBFf!-](I5/55Ox%>/>kx@ |GÂ1kqlEE||$ $M4t afUm#g CFsj%U"_Z-ر"ݷJ~GEk?!~]K/$gOI9Hi$sXA# OeOFqr襰N|H[3=,.ERckjRsd= 12*ͻ},휦U {2Ѧɷ?ėv{T!%<b cli$)Fs))Y B+W)t}Wp0u )m].Sk<, sնA?ư?%8OSg{2-\#lWy F[擼s0(|vMѓ_ﲼ3p-Ȅ]6 t13ġ,8<>3,ᦴdiId,#Ę|1YHdQ-a- E-=sg(Q<\=ghws_] h4DAZ|ir|tiMk)y&,LdQ5ƌF%8<1Zٮh7NʹD:Ǣrbz6 56\g7|+v'c5+0B-$w/V?~OZb$Px6s^`c5x-0d[!"D%9Emч6#=$&Ÿ/%rL38%6/hrfG~yAo^GPM.sod>0hbK4T%vGFLIu{NJ|lq~@:BVi@t cF8 XSa[>uϛ!9R1WߘS(ha[2,M)c^> ̰o?gVz[=?bTf.\f)&3<=r(Y]Zܩ83ӊx_up' G>>2>5cdi1G7mG~BGjVVLiqb0l)͝bty+ :#C|kZai'7y"Zvgc{:R:F[8ՒCzqn?)޷ d߷KlEʠ%xHbDkeVA\7 }3+EhRxCB4Qx7z\=Y\?WTFF!JAZzx^7f2&= AGZ)4FԌʼn#Tl* \ C.7lS̰WZ4CF4{ 5_"l~SE zaԤNJZx2"s.طtJam ff yؘ-VlfZݞX@bn\ZAjpX̹=I;ק\ +#=φ`8t3i+x>=jBw_簾RP"6#) D@D\e_49Pd@D4%2kkY5xuL6ϤpY|'r,% 4mmXY+oG9ub:u$2G(X:'2e.p}#KF*2K A`pp,m{\?=OqŖm'=ߍsLt.}@M Gk *jcaw7'j!xz߿4YDǩd:%Fluy|É=tyLSr 5‚~%Rm i!Ro58V`0,t?ϓo{D,SS#Ido7˩7[Q8lCƞguW~緹]7DD"rKu ṄƒL8HaQJ!^7:*2g/o>r,V-}nFkVטyut6G_~帄q) qn}|=m={* -IDATs"?*_*0|@=}C'* pk3F﷜!)bk<0Hو qكU.hVǞC6j#oEՅ-۟d7Kqp">ekQ!ץh ZS7gh kIHIaXMM a %8{a-Enn跛l+AUJʙ^_3?>zRnDכm;0TDt=߲ 0:Ϻ>Uq7f#˂%!wݘVR+#AT́ bmT[2 bC^ȥwm`28F;VSHr*Lۖ1KXzzҸR1xPV 5 ))֕8]Rnr#d90L5\ 7yskJGEa]ːnYCRJ 1tkiYfYfeֳg2%&¡?-i>>;U^)h[0OMkؚõ,Ǻhn>#-z \!p@/ )Jxa)+&qі,Eۃƥhcv!Z8K[ )H aծ*2Or{>.\æɩt=F=°fӁ!1ŨT`Ifmx&WYe0J:C* r},n%j %&}ifz3ؖ؆v;vZV-TKC6@\U'eIZ&m/I)@R$5!hIT֒['ب7qYk1dJ 0Rv]|)kC,8 / `qvtߗQ!CCe|?4a(P.!cc~H0=MthJL*VW3" :K<^z'M -C& $s3} [26R[si*ڤicBH2XdP;m̏؆/Mtsŝcc;LyCd%k-)1=)IWK`lHz EIRǪ`wsTJ.%ϗcėe2x#!sy^%2o1c8=jtvj<CtAAIVkAB=53K9TLϐJ? &tGz-WuHM9Lgi[*t@)BRٵy)d6rq@Ef"%&;4.(i2%oP4Z3 C倜uR~-t]V+;o< K2@heЦx^W" =QPN6;R6B'TML>K> Κ':6@:{͐OͳVAL186J.Zsezf֚a GH$h6fH_ SS\: ztؒ|PўF\CS4Cch?Dݨjk0 )Ut!D& *PЉ UK >q䖌apQ1֢,]; x[ qg$jfS k[z&A>kۗ-dqzZ^qQUzt|sgqF9ɬݕO8Fj2e5\e4dOѐjW1zxf*UR`dOuǛc7J6,hld,XW4"8a )%Z4EZ?mHYM˨swֽEr냘]:@׷P_/D*l9NMmpSibE+F֔ E#cw6p Q;蠃:}U=k[Yt]=:Etz!Ao6tV p@t #include #include #include #include #define RUTA_OFF "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/off.png" #define RUTA_LPF1 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/lpf1.png" #define RUTA_LPF2 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/lpf2.png" #define RUTA_LPF3 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/lpf3.png" #define RUTA_LPF4 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/lpf4.png" #define RUTA_HPF1 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/hpf1.png" #define RUTA_HPF2 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/hpf2.png" #define RUTA_HPF3 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/hpf3.png" #define RUTA_HPF4 "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/hpf4.png" #define RUTA_LOSHELF "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/loshelf.png" #define RUTA_HISHELF "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/hishelf.png" #define RUTA_PEAK "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/peak.png" #define RUTA_NOTCH "/usr/local/lib/lv2/paramEQ-Rafols.lv2/combopix/notch.png" class PixMapCombo : public Gtk::ComboBox{ public: PixMapCombo(); virtual ~PixMapCombo(); protected: class ModelColumns : public Gtk::TreeModel::ColumnRecord{ public: ModelColumns(){ add(m_col_pix); } //Gtk::TreeModelColumn m_col_pix; Gtk::TreeModelColumn > m_col_pix; }; ModelColumns m_Columns; Glib::RefPtr m_refTreeModel; }; #endifEQ10Q/main_window.cpp0000644000175000017500000004154111322416300014553 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "main_window.hh" //punter a objecte principal; void gloabal_set_gain_freq(main_window *main_ptr, int b_ix, float g, float f){ main_ptr->set_gain_freq(b_ix, g, f); } void global_set_all_params(main_window *main_ptr, int b_ix, int type, float g, float f, float Q){ main_ptr->set_all_params(b_ix, type, g, f, Q); } void global_get_all_params(main_window *main_ptr, int band_id, BandParams &m_params){ main_ptr->get_all_params(band_id, m_params); } //main_window::main_window() main_window::main_window(const std::string& URI) //LV2 Style :Flat_Button("Flat"), A_Button("A"), B_Button("B"), in_vu(1), out_vu(1), image_logo_top_top("/usr/local/lib/lv2/paramEQ-Rafols.lv2/logo_top_top.png"), image_logo_top("/usr/local/lib/lv2/paramEQ-Rafols.lv2/logo_top.png"), image_logo_center("/usr/local/lib/lv2/paramEQ-Rafols.lv2/logo_center.png"), image_logo_bottom("/usr/local/lib/lv2/paramEQ-Rafols.lv2/logo_bottom.png"), image_logo_bottom_bottom("/usr/local/lib/lv2/paramEQ-Rafols.lv2/logo_bottom_bottom.png") { stop = 0; flag_pop_resize = true; //Slots sigc::slot bypass_slot, in_gain_slot, out_gain_slot; sigc::slot gain_slot[10], freq_slot[10], Q_slot[10], type_slot[10]; //Aket es el calcul del vector de freq float d1=log10(FREQ_MIN); float d2=log10(FREQ_MAX); for(int i=0;i(mem_fun(*this, &main_window::write_control), 2), mem_fun(*this, &main_window::get_bypass)); in_gain_slot = compose(bind<0>(mem_fun(*this, &main_window::write_control), 3), mem_fun(*this, &main_window::get_in_gain)); out_gain_slot = compose(bind<0>(mem_fun(*this, &main_window::write_control), 4), mem_fun(*this, &main_window::get_out_gain)); for(int i = 0; i< 10; i++){ type_slot[i] = compose(bind<0>(mem_fun(*this, &main_window::write_control), i*4+FIRST_FILTER_PORT_INDEX), bind<0>(mem_fun(*this, &main_window::get_band_type),i)); gain_slot[i] = compose(bind<0>(mem_fun(*this, &main_window::write_control), i*4+FIRST_FILTER_PORT_INDEX+1), bind<0>(mem_fun(*this, &main_window::get_band_gain),i)); freq_slot[i] = compose(bind<0>(mem_fun(*this, &main_window::write_control), i*4+FIRST_FILTER_PORT_INDEX+2), bind<0>(mem_fun(*this, &main_window::get_band_freq),i)); Q_slot[i] = compose(bind<0>(mem_fun(*this, &main_window::write_control), i*4+FIRST_FILTER_PORT_INDEX+3), bind<0>(mem_fun(*this, &main_window::get_band_Q),i)); } ///////////////////////////////////////////////////////////////////////////////////////////////// /*///////////////////////////////////////////////////////////////////////////////////////////// //SLOTS PER PROBES DE LA GUI I EL PLOT(desactivar per el plugin!!!) //creem els Slots for(int i = 0; i< 10; i++){ type_slot[i] = bind<0>(mem_fun(*this, &main_window::get_band_type),i); gain_slot[i] = bind<0>(mem_fun(*this, &main_window::get_band_gain),i); freq_slot[i] = bind<0>(mem_fun(*this, &main_window::get_band_freq),i); Q_slot[i] = bind<0>(mem_fun(*this, &main_window::get_band_Q),i); } ///////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////// */ //SLOTS DE DEPURAT/////////////////////////////////////////////////////////////// /* bypass_slot = sigc::mem_fun(*this, &main_window::bypass_control); in_gain_slot = sigc::mem_fun(*this, &main_window::in_gain_control); out_gain_slot = sigc::mem_fun(*this, &main_window::out_gain_control); for(int i = 0; i< 10; i++){ gain_slot[i] = sigc::bind(sigc::mem_fun(*this, &main_window::gain_control), i); freq_slot[i] = sigc::bind(sigc::mem_fun(*this, &main_window::freq_control), i); Q_slot[i] = sigc::bind(sigc::mem_fun(*this, &main_window::Q_control), i); type_slot[i] = sigc::bind(sigc::mem_fun(*this, &main_window::type_control), i); } *///////////////////////////////////////////////////////////////////////////////// //connects //bypass_button.signal_grab_focus().connect(mem_fun(*this, &main_window::on_window_popup)); //signal_realize().connect(mem_fun(*this, &main_window::on_window_popup)); dummy_box.signal_expose_event().connect(mem_fun(*this, &main_window::on_window_popup), false); dummy_box.set_sensitive(false); bypass_button.signal_toggled().connect(bypass_slot); bypass_button.set_label("Bypass"); in_gain = Gtk::manage(new GainCtl("In", in_gain_slot)); gain_box.pack_start(*in_gain, Gtk::PACK_SHRINK); gain_box.pack_start(in_vu, Gtk::PACK_SHRINK); out_gain = Gtk::manage(new GainCtl("Out", out_gain_slot)); gain_box.pack_start(*out_gain, Gtk::PACK_SHRINK); gain_box.pack_start(out_vu, Gtk::PACK_SHRINK); gain_box.set_homogeneous(true); gain_box.set_spacing(2); gain_box.show(); in_gain->show(); out_gain->show(); //gain_bypass_box.pack_start(bypass_button, Gtk::PACK_SHRINK); gain_bypass_box.pack_start(gain_box, Gtk::PACK_EXPAND_WIDGET); gain_bypass_box.set_homogeneous(false); gain_bypass_box.show(); bypass_button.show(); band_box.pack_start(gain_bypass_box, Gtk::PACK_SHRINK); for (int i = 0; i< NUM_OF_FILTERS; i++){ m_banda[i] = Gtk::manage(new BandCtl(f, i+1, gain_slot[i], //comencem a passar els slots freq_slot[i], Q_slot[i], type_slot[i], &stop )); band_box.pack_start(*m_banda[i], Gtk::PACK_SHRINK); } band_box.pack_start(dummy_box, Gtk::PACK_SHRINK); //afegim una caixa buida, serveix per invocar la fuincio expose band_box.set_spacing(4); band_box.set_homogeneous(false); band_box.show(); //Afegim el Plot my_plot=Gtk::manage(new PlotEQCurve(this, &gloabal_set_gain_freq)); /*for(int i=0; iget_gain(); lf = m_banda[i]->get_freq(); lq = m_banda[i]->get_Q(); lt = m_banda[i]->get_filter_type(); //redraw_plot(i, lg, f[(int)lf], lq, lt); //m_banda[i]->set_Q(2); ////////////////////////<<<<<<<<<<<<<<<<<<<<<show(); plot_fix.put(*my_plot, 0.0, 0.0); main_box.pack_start(plot_fix); plot_fix.show(); //main_box.pack_start(*my_plot); my_plot->show(); main_box.pack_start(image_logo_top); main_box.pack_start(ABFlat_box,Gtk::PACK_EXPAND_PADDING); main_box.pack_start(image_logo_bottom); image_logo_bottom.show(); image_logo_top.show(); image_logo_center.show(); ABFlat_box.show(); Flat_Button.show(); Flat_align.show(); AB_align.show(); buttons_ABF.show(); A_Button.show(); B_Button.show(); ABFlat_box.show(); main_box.pack_start(band_box); main_box.pack_start(image_logo_bottom_bottom); main_box.set_spacing(0); add(main_box); main_box.show(); //incicialitzar estrcutures de parametres //flat(); //SEnyals dels 3 botons A B FLAT A_Button.set_active(true); B_Button.set_active(false); A_Button.signal_clicked().connect( sigc::mem_fun(*this, &main_window::on_button_A)); B_Button.signal_clicked().connect( sigc::mem_fun(*this, &main_window::on_button_B)); Flat_Button.signal_clicked().connect( sigc::mem_fun(*this, &main_window::on_button_FLAT)); for(int i=0; i< NUM_OF_FILTERS; i++){ paramsB[i].type=0; paramsB[i].gain=0; paramsB[i].freq=(i+1)*30-1; paramsB[i].Q=2; } //Posem-hi una imatge de fons //band_box.modify_bg_pixmap(Gtk::STATE_ACTIVE,"my_eq_bak.png"); /* Glib::RefPtr my_window = get_parent_window(); std::cout<<"Parent = "<set_background(Gdk::Color("orange")); */ } float main_window::get_bypass(){ bool bypass = bypass_button.get_active(); my_plot->Set_Bypass(bypass); return (float)bypass; } float main_window::get_in_gain(){ return in_gain->get_gain(); } float main_window::get_out_gain(){ return out_gain->get_gain(); } //Tornar a posar els float com a return //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<get_gain(); lf = m_banda[band_id]->get_freq(); lq = m_banda[band_id]->get_Q(); lt = m_banda[band_id]->get_filter_type(); if(lq == 0) lq = 2; redraw_plot(band_id, lg, f[(int)lf], lq, lt); return lt; } float main_window::get_band_gain(int band_id){ float lg, lf, lq, lt; lg = m_banda[band_id]->get_gain(); lf = m_banda[band_id]->get_freq(); lq = m_banda[band_id]->get_Q(); lt = m_banda[band_id]->get_filter_type(); if(lq == 0) lq = 2; redraw_plot(band_id, lg, f[(int)lf], lq, lt); return lg; } float main_window::get_band_freq(int band_id){ float lg, lf, lq, lt; lg = m_banda[band_id]->get_gain(); lf = m_banda[band_id]->get_freq(); lq = m_banda[band_id]->get_Q(); lt = m_banda[band_id]->get_filter_type(); if(lq == 0) lq = 2; redraw_plot(band_id, lg, f[(int)lf], lq, lt); return lf; } float main_window::get_band_Q(int band_id){ float lg, lf, lq, lt; lg = m_banda[band_id]->get_gain(); lf = m_banda[band_id]->get_freq(); lq = m_banda[band_id]->get_Q(); lt = m_banda[band_id]->get_filter_type(); if(lq == 0) lq = 2; redraw_plot(band_id, lg, f[(int)lf], lq, lt); return lq; } void main_window::redraw_plot(int band, float g, float f, float q, float t){ my_plot->DrawPeakCurve(band, (double)g, (double)f, (double)q, (int)t); } ///////Funcions de depurat /* void main_window::bypass_control(){ std::cout<<"Bypass = "<get_filter_type(); if( ft==LOW_SHELF || ft==HIGH_SHELF || ft==PEAK)m_banda[b_ix]->set_gain(g); if(ft != FILTER_OFF)m_banda[b_ix]->set_freq_direct(f); } void main_window::set_all_params(int b_ix, int type, float g, float f, float Q){ m_banda[b_ix]->set_filter_type((float)type); m_banda[b_ix]->set_gain(g); m_banda[b_ix]->set_freq(f); //modifica el freq PTR m_banda[b_ix]->set_Q(Q); } void main_window::get_all_params(int band_id, BandParams &m_params){ m_params.type = (int) get_band_type(band_id); m_params.gain = get_band_gain(band_id); m_params.freq = get_band_freq(band_id); m_params.Q = get_band_Q(band_id); } void main_window::AB_change_params(bool toA){ for(int i=0; iget_filter_type(); paramsB[i].gain=m_banda[i]->get_gain(); paramsB[i].freq=m_banda[i]->get_freq(); paramsB[i].Q=m_banda[i]->get_Q(); m_banda[i]->set_filter_type((float)paramsA[i].type); m_banda[i]->set_gain(paramsA[i].gain); m_banda[i]->set_freq(paramsA[i].freq); m_banda[i]->set_Q(paramsA[i].Q); } else{ paramsA[i].type=(int)m_banda[i]->get_filter_type(); paramsA[i].gain=m_banda[i]->get_gain(); paramsA[i].freq=m_banda[i]->get_freq(); paramsA[i].Q=m_banda[i]->get_Q(); m_banda[i]->set_filter_type((float)paramsB[i].type); m_banda[i]->set_gain(paramsB[i].gain); m_banda[i]->set_freq(paramsB[i].freq); m_banda[i]->set_Q(paramsB[i].Q); } } } void main_window::on_button_A(){ if(A_Button.get_active()){ B_Button.set_active(false); //guardem la corba B i Carregem la A AB_change_params(true); } else B_Button.set_active(true); } void main_window::on_button_B(){ if(B_Button.get_active()){ A_Button.set_active(false); //guardem la corba A AB_change_params(false); } else A_Button.set_active(true); } void main_window::on_button_FLAT(){ //Generem un missatge Gtk::MessageDialog dialog((Gtk::Window&)(*this->get_toplevel()),"This will flat the EQ curve, are you sure?", false /* use_markup */, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL); int result = dialog.run(); if(result == Gtk::RESPONSE_OK)flat(); } void main_window::flat(){ for(int i=0; i< NUM_OF_FILTERS; i++){ paramsB[i].type=0; paramsB[i].gain=0; paramsB[i].freq=(i+1)*30-1; paramsB[i].Q=2; paramsA[i].type=0; paramsA[i].gain=0; paramsA[i].freq=(i+1)*30-1; paramsA[i].Q=2; m_banda[i]->set_filter_type((float)paramsA[i].type); m_banda[i]->set_gain(paramsA[i].gain); m_banda[i]->set_freq(paramsA[i].freq); m_banda[i]->set_Q(paramsA[i].Q); } in_gain->set_gain(0.0); out_gain->set_gain(0.0); A_Button.set_active(true); } main_window::~main_window(){ } EQ10Q/parameq.ttl0000644000175000017500000002177511514373626013736 0ustar sapistasapista@prefix lv2: . @prefix foaf: . @prefix doap: . @prefix guiext: . a guiext:GtkUI; guiext:binary ; guiext:requiredFeature guiext:makeResident. a lv2:Plugin; lv2:binary ; doap:name "EQ10Q"; doap:license ; guiext:ui ; doap:maintainer [ foaf:name "Pere Rafols Soler"; foaf:homepage ; foaf:mbox ; ] ; lv2:port [ a lv2:AudioPort, lv2:OutputPort; lv2:index 0; lv2:symbol "output"; lv2:name "Output"; ], [ a lv2:AudioPort, lv2:InputPort; lv2:index 1; lv2:symbol "input"; lv2:name "Input"; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 2; lv2:symbol "bypass"; lv2:name "Bypass"; lv2:minimum 0; lv2:maximum 1; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 3; lv2:symbol "input_gain"; lv2:name "Input Gain"; lv2:minimum -20; lv2:maximum 6; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 4; lv2:symbol "output_gain"; lv2:name "Output Gain"; lv2:minimum -20; lv2:maximum 6; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 5; lv2:symbol "filter1_type"; lv2:name "Filter 1 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 6; lv2:symbol "filter1_gain"; lv2:name "Filter 1 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 7; lv2:symbol "filter1_freq_ptr"; lv2:name "Filter 1 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 29; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 8; lv2:symbol "filter1_q"; lv2:name "Filter 1 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 9; lv2:symbol "filter2_type"; lv2:name "Filter 2 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 10; lv2:symbol "filter2_gain"; lv2:name "Filter 2 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 11; lv2:symbol "filter2_freq_ptr"; lv2:name "Filter 2 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 59; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 12; lv2:symbol "filter2_q"; lv2:name "Filter 2 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 13; lv2:symbol "filter3_type"; lv2:name "Filter 3 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 14; lv2:symbol "filter3_gain"; lv2:name "Filter 3 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 15; lv2:symbol "filter3_freq_ptr"; lv2:name "Filter 3 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 89; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 16; lv2:symbol "filter3_q"; lv2:name "Filter 3 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 17; lv2:symbol "filter4_type"; lv2:name "Filter 4 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 18; lv2:symbol "filter4_gain"; lv2:name "Filter 4 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 19; lv2:symbol "filter4_freq_ptr"; lv2:name "Filter 4 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 119; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 20; lv2:symbol "filter4_q"; lv2:name "Filter 4 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 21; lv2:symbol "filter5_type"; lv2:name "Filter 5 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 22; lv2:symbol "filter5_gain"; lv2:name "Filter 5 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 23; lv2:symbol "filter5_freq_ptr"; lv2:name "Filter 5 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 149; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 24; lv2:symbol "filter5_q"; lv2:name "Filter 5 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 25; lv2:symbol "filter6_type"; lv2:name "Filter 6 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 26; lv2:symbol "filter6_gain"; lv2:name "Filter 6 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 27; lv2:symbol "filter6_freq_ptr"; lv2:name "Filter 6 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 179; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 28; lv2:symbol "filter6_q"; lv2:name "Filter 6 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 29; lv2:symbol "filter7_type"; lv2:name "Filter 7 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 30; lv2:symbol "filter7_gain"; lv2:name "Filter 7 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 31; lv2:symbol "filter7_freq_ptr"; lv2:name "Filter 7 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 209; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 32; lv2:symbol "filter7_q"; lv2:name "Filter 7 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 33; lv2:symbol "filter8_type"; lv2:name "Filter 8 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 34; lv2:symbol "filter8_gain"; lv2:name "Filter 8 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 35; lv2:symbol "filter8_freq_ptr"; lv2:name "Filter 8 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 239; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 36; lv2:symbol "filter8_q"; lv2:name "Filter 8 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 37; lv2:symbol "filter9_type"; lv2:name "Filter 9 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 38; lv2:symbol "filter9_gain"; lv2:name "Filter 9 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 39; lv2:symbol "filter9_freq_ptr"; lv2:name "Filter 9 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 269; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 40; lv2:symbol "filter9_q"; lv2:name "Filter 9 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 41; lv2:symbol "filter10_type"; lv2:name "Filter 10 Type"; lv2:minimum 0; lv2:maximum 12; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 42; lv2:symbol "filter10_gain"; lv2:name "Filter 10 Gain"; lv2:minimum -20; lv2:maximum 20; lv2:default 0; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 43; lv2:symbol "filter10_freq_ptr"; lv2:name "Filter 10 Freq PTR"; lv2:minimum 0; lv2:maximum 199; lv2:default 299; ], [ a lv2:ControlPort, lv2:InputPort; lv2:index 44; lv2:symbol "filter10_q"; lv2:name "Filter 10 Q"; lv2:minimum 0.1; lv2:maximum 16; lv2:default 2; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 45; lv2:symbol "in_vu_ctl"; lv2:name "In Vu CTL"; ], [ a lv2:ControlPort, lv2:OutputPort; lv2:index 46; lv2:symbol "out_vu_ctl"; lv2:name "Out VU CTL"; ].EQ10Q/vuwidget.cpp0000644000175000017500000001100211302462401014064 0ustar sapistasapista/**************************************************************************** vuwidget.cpp - simple VU meter Copyright (C) 2006-2007 Lars Luthman This program is free software; you can redistribute it and/or modify it under the terms of the 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ****************************************************************************/ #include #include "vuwidget.hpp" VUWidget::VUWidget(unsigned channels, float min) : m_channels(channels), m_min(min), m_values(new float[m_channels]), m_peaks(new float[m_channels]), m_peak_connections(new sigc::connection[m_channels]) { for (unsigned c = 0; c < m_channels; ++c) { m_values[c] = 0.0; m_peaks[c] = 0.0; } set_size_request(4 + 12 * m_channels, 150); m_bg.set_rgb(10000, 10000, 15000); m_shadow.set_rgb(3000, 3000, 5000); m_light.set_rgb(30000, 30000, 30000); m_fg1.set_rgb(0, 65000, 45000); m_fg2.set_rgb(65000, 45000, 10000); m_fg3.set_rgb(65000, 0, 0); m_fg1b.set_rgb(8500, 16000, 26000); m_fg2b.set_rgb(16000, 14000, 12500); m_fg3b.set_rgb(16000, 8500, 12500); Glib::RefPtr cmap = Gdk::Colormap::get_system(); cmap->alloc_color(m_bg); cmap->alloc_color(m_shadow); cmap->alloc_color(m_light); cmap->alloc_color(m_fg1); cmap->alloc_color(m_fg2); cmap->alloc_color(m_fg3); cmap->alloc_color(m_fg1b); cmap->alloc_color(m_fg2b); cmap->alloc_color(m_fg3b); } VUWidget::~VUWidget() { delete [] m_values; delete [] m_peaks; delete [] m_peak_connections; } void VUWidget::set_value(unsigned channel, float value) { m_values[channel] = value; if (m_values[channel] > m_peaks[channel]) { m_peaks[channel] = m_values[channel]; m_peak_connections[channel].disconnect(); m_peak_connections[channel] = Glib::signal_timeout(). connect(bind_return(bind(mem_fun(*this, &VUWidget::clear_peak), channel), false), 3000); } queue_draw(); } bool VUWidget::on_expose_event(GdkEventExpose* event) { Glib::RefPtr win = get_window(); Glib::RefPtr gc = Gdk::GC::create(win); gc->set_foreground(m_bg); win->draw_rectangle(gc, true, 0, 0, get_width(), get_height()); unsigned int n = (get_height() - 4) / 3; gc->set_foreground(m_light); win->draw_line(gc, 0, get_height() - 1, get_width() - 1, get_height() - 1); win->draw_line(gc, get_width() - 1, 0, get_width() - 1, get_height() - 1); gc->set_foreground(m_shadow); win->draw_line(gc, 0, 0, get_width(), 0); win->draw_line(gc, 0, 0, 0, get_height()); for (unsigned c = 0; c < m_channels; ++c) { float mapped_value = map_to_log(m_values[c]); int x = 2 + c * ((get_width() - 3) / m_channels); int w = (get_width() - 3) / m_channels - 2; gc->set_foreground(m_fg1); int level = 1; bool active = true; for (unsigned i = 0; i < n; ++i) { if (mapped_value * 0.8 * n <= i) { active = false; if (level == 1) gc->set_foreground(m_fg1b); else if (level == 2) gc->set_foreground(m_fg2b); if (level == 3) gc->set_foreground(m_fg3b); } if (level == 1 && 0.6 * n <= i) { if (active) gc->set_foreground(m_fg2); else gc->set_foreground(m_fg2b); level = 2; } if (level == 2 && 0.8 * n <= i) { if (active) gc->set_foreground(m_fg3); else gc->set_foreground(m_fg3b); level = 3; } win->draw_rectangle(gc, true, x, get_height() - (2 + 3 * i + 3), w, 2); } if (m_peaks[c] > 0) { float mapped_value = map_to_log(m_peaks[c]); unsigned i = mapped_value * 0.8 * n; if (i >= n) i = n - 1; if (mapped_value * 0.8 <= 0.6) gc->set_foreground(m_fg1); else if (mapped_value * 0.8 <= 0.8) gc->set_foreground(m_fg2); else gc->set_foreground(m_fg3); win->draw_rectangle(gc, true, x, get_height() - (2 + 3 * i + 3), w, 2); } } } void VUWidget::clear_peak(unsigned channel) { m_peaks[channel] = 0.0; queue_draw(); } EQ10Q/logo_top.png0000644000175000017500000001243711302614154014073 0ustar sapistasapistaPNG  IHDR-[1sRGBbKGD pHYs  tIME 5%IDATx]ˏywp! E -7™ !ll1Uo]3}-fW7kF7эntF7эntW5_~E F7эntF7эnF!b^b̫69k |~vb~/^ږgȿK.^=z=__ ޔpziӞ pzzzn~6G0t;NM9=`0чkLm~|QcX't?mO;}kf,4[r>zc_/G?G]Z#>O iΥ''V/|qNݟ_LC}yFskїv8&=[?h'hϟxq>t\^KH^T|6YFo~C/z6xpUZK~H/ҟ$0ğh.у`AIߪPa|4(hPi @V0ؤ9*P= ˲0c?wh4pp *kkk!]?ˆi!h.á(#*D'ɉh蓺?8WR(4f $ 10kf𬯯~!LߘwL&*R\|Чj$}$ϲ7Yֿ5n?hJ>IAQQ{L^gl6#A[~,= J#r4pF[AI+]5Lg5x`_R%yJ>QDG5@UؽVDVAT %sK͓,%OY""||\`PE{ .tfWS Hs6ŀ,1$<'<ҽ5]yBJcO2tf)+]_*%~JdUѣp[ B9̽ISh5vU__uҢQ"`p|T9gtj3\Ap[lVIT-%p=gT`k$ $i@.d( !k9 $s g|.JkOoZٌصVjϪE҄Jh Ū׷X2,4DFtSOaz4ٟրPzaT[ޚaM C`W[#//'AWSc֔|Qx*Ow}g['E{Qmh4:B]F/\CJ78\-d1Sd9ш&BXa#B݋hQHQpr c /)e zTzBR3z556W\ 8o#HQNTʄhu]jXkH%eDHUqAQ2qv4@58skRHě:̓TNNXC^Ó^y4Bv&9_R<EQKY%r^ZzR)=V|?WKxho 7 h DPjX j!7Pפ { 6p-BU.UDp8b8cX*s9Β@L'PjXȢ96m< ^TN$ f!**MZ lZ 6@=NρWo\ŧ!dp(}[*z!eliЏ|vtkkkbI|E4z%-Wb2\ImOk0BUU81.w4pFrϗؔn}>Ji5k!ѿG h/ͿuQg-B57pu`. ^ R픇"cdR~rkMI~/*<; ?n1dPB=Z2r<(vPqP%εpc__CakJijZ dfFYZF'sZ5$4:"Bm>Ib)ZE H(=xZ l>-VeJaJ"H!\Ut5|M5!t|޿zr4b!%h{=5 VA׺O-ڕYY6H"~R~VhiT??M{TQp-D(=ZQHOBο(_$B!ROVږ9 |èIGs)F/p\P98Z"]hU)Ō[n`F1̒O(=pxR@B[b]T+ yJf 䪜WoH2ޛ(h)"0M?ѪCE+ 岆Sx<[ج`YmdF~G B<%EZװEɰS4)6Rաr- WJo*/M_T>YjhH=ŋ4d~냚c9W}0 kI%5Ǎ2(YV)FN&eD=ۦOH(EK*z~-GvX @x*Q5Qeځᄏ [[; Z>"-kw*ojIx>@3YCµ~^m!-3(biQHk1簍SXjh]8ZGx0T$J T8(R~i%7oq}9(`JC))5Gotkсkd-DJ$sޖ֠Z(KڦD-3ն}THh^\^e9o ZjF.72[O q} FSnJXʋ)/ԽrvWEӺm^-z #~џ8/qzc~+ֺ~I>1IX-2e Ѝnt"DZhrJl^(P޶g}<,VWCUHjkzd^%s1Ç`s!ޟ…j9V>ESC'}`sJE@CT*Lۇ=~հ(og @95+XR'a |poॗ.6[^G0La6;~g;bW/͛7eDYK)՗Ha\5hkHp/:9'O2tX'X`QEW!Y4BDأ1a0|>?.@8kE!~oQx9Jʖrَ(4.07.651,>o7ܼ:-vM@2Lѣmۃ8==ll\7_?3F#F1u(0?}8<lpK޻IENDB`EQ10Q/COPYING0000644000175000017500000010451311513575522012604 0ustar sapistasapista GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . EQ10Q/band_ctl.cpp0000644000175000017500000001627611322416364014027 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "band_ctl.h" BandCtl::BandCtl(){ //constructor buit } BandCtl::BandCtl(float *freq, const int band_num, sigc::slot gain_slot, sigc::slot freq_slot, sigc::slot Q_slot, sigc::slot type_slot, int *semafor ): button_align(Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 0.0, 0.0), combo_align(Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER, 0.0, 0.0){ Glib::ustring text; f=freq; ant_filter = FILTER_OFF; m_gain = Gtk::manage(new EQButton(GAIN_TYPE, f, gain_slot, semafor)); m_freq = Gtk::manage(new EQButton(FREQ_TYPE, f, freq_slot, semafor)); m_Q = Gtk::manage(new EQButton(Q_TYPE, f, Q_slot, semafor)); text = Glib::ustring::compose("Band %1", band_num); band_label.set_label(text); pack_start(band_label, Gtk::PACK_SHRINK ); pack_start(combo_align, Gtk::PACK_EXPAND_PADDING ); pack_start(*m_gain, Gtk::PACK_EXPAND_PADDING ); pack_start(*m_freq, Gtk::PACK_EXPAND_PADDING ); pack_start(*m_Q, Gtk::PACK_EXPAND_PADDING ); pack_start(button_align, Gtk::PACK_EXPAND_PADDING ); m_on_button.set_size_request(35,-1); button_align.add(m_on_button); set_spacing(2); set_homogeneous(false); set_size_request(80,-1); m_filter_sel.set_size_request(60,-1); combo_align.add(m_filter_sel); band_label.show(); m_on_button.show(); m_filter_sel.show(); m_gain->show(); m_freq->show(); m_Q->show(); button_align.show(); show(); m_on_button.set_label("ON"); m_on_button.signal_clicked().connect(sigc::mem_fun(*this, &BandCtl::on_button_clicked)); /*m_filter_sel.append_text("None"); //0 m_filter_sel.append_text("LPF 1"); //1 m_filter_sel.append_text("LPF 2"); //2 m_filter_sel.append_text("LPF 3"); //3 m_filter_sel.append_text("LPF 4"); //4 m_filter_sel.append_text("HPF 1"); //5 m_filter_sel.append_text("HPF 2"); //6 m_filter_sel.append_text("HPF 3"); //7 m_filter_sel.append_text("HPF 4"); //8 m_filter_sel.append_text("LoShelv"); //9 m_filter_sel.append_text("HiShelv"); //10 m_filter_sel.append_text("Peak"); //11 m_filter_sel.append_text("Notch"); //12 */ m_filter_sel.signal_changed().connect(sigc::mem_fun(*this, &BandCtl::on_combo_changed)); //posa els buttons com hagin d'estar al principi //config_sensitive(); vic_de_set=false; //connexions externes m_filter_sel.signal_changed().connect(type_slot); m_on_button.signal_clicked().connect(type_slot); } //Funcions de consulta de parametres float BandCtl::get_gain(){ return m_gain->get_value(); } float BandCtl::get_freq(){ return m_freq->get_value(); } float BandCtl::get_Q(){ return m_Q->get_value(); } float BandCtl::get_filter_type(){ return (float)filter_type; } //Funcions de salvar parametres void BandCtl::set_gain(float g){ m_gain->set_value(g); } void BandCtl::set_freq(float f){ m_freq->set_freq_ptr(f); } void BandCtl::set_freq_direct(float f){ m_freq->set_value(f); } void BandCtl::set_Q(float q){ m_Q->set_value(q); } void BandCtl::set_filter_type(float t){ filter_type = (int)t; vic_de_set=true; if( filter_type == 0)m_on_button.set_active(false); else{ m_on_button.set_active(true); } //if(m_on_button.get_active())m_filter_sel.set_active(filter_type); //Modificat per evitar k kuan apaguem el butto es perdi la select <<<<<<< m_filter_sel.set_active(filter_type); vic_de_set=false; config_sensitive(); } void BandCtl::on_button_clicked(){ config_type(); if(m_on_button.get_active() && ant_filter != FILTER_OFF){ m_filter_sel.set_active(ant_filter); } } void BandCtl::on_combo_changed(){ config_type(); } void BandCtl::config_type(){ if(filter_type != FILTER_OFF) ant_filter = filter_type; if(m_on_button.get_active()) { if(!vic_de_set)filter_type=m_filter_sel.get_active_row_number(); } else filter_type=0; config_sensitive(); } void BandCtl::config_sensitive(){ switch(filter_type){ case FILTER_OFF: m_Q->set_sensitive(false); m_gain->set_sensitive(false); m_freq->set_sensitive(false); break; case LPF_ORDER_1: case HPF_ORDER_1: m_Q->set_sensitive(false); m_gain->set_sensitive(false); m_freq->set_sensitive(true); set_gain(0.0); break; case LPF_ORDER_2: case LPF_ORDER_3: case LPF_ORDER_4: case HPF_ORDER_2: case HPF_ORDER_3: case HPF_ORDER_4: reset_Q(HPF_LPF_Q_DEFAULT); goto hpf_lpf; case NOTCH: reset_Q(NOTCH_Q_DEFAULT); hpf_lpf: m_gain->set_sensitive(false); m_Q->set_sensitive(true); m_freq->set_sensitive(true); set_gain(0.0); break; case LOW_SHELF: case HIGH_SHELF: reset_Q(HIGH_LOW_SHELF_Q_DEFAULT); goto shelvings; case PEAK: reset_Q(PEAK_Q_DEFAULT); shelvings: m_gain->set_sensitive(true); m_Q->set_sensitive(true); m_freq->set_sensitive(true); break; } } void BandCtl::reset_Q(float q){ if(filter_type != ant_filter){ set_Q(q); } } void BandCtl::hide_spins(){ m_gain->hide_spin(); m_freq->hide_spin(); m_Q->hide_spin(); } BandCtl::~BandCtl(){ } /////////////////////////////////////////////////////// GainCtl::GainCtl(const Glib::ustring title, sigc::slot m_slot){ gain_scale.set_digits(1); gain_scale.set_draw_value(true); gain_scale.set_value_pos(Gtk::POS_TOP); gain_scale.set_inverted(true); gain_scale.set_range(GAIN_MIN, GAIN_MAX); gain_scale.set_value(GAIN_DEFAULT); gain_scale.signal_value_changed().connect(m_slot); gain_label.set_label(title); pack_start(gain_label); pack_start(gain_scale); set_spacing(2); set_homogeneous(false); gain_scale.set_size_request(40,100); gain_label.show(); gain_scale.show(); show(); } void GainCtl::set_gain(float g){ gain_scale.set_value((double) g); } float GainCtl::get_gain(){ return (float)gain_scale.get_value(); } GainCtl::~GainCtl(){ } EQ10Q/bodeplot.h0000644000175000017500000000774111322416277013536 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include "constants.h" #define PLOT_WIDTH 960 #define PLOT_HEIGHT 230 #ifndef MAIN_WINDOW_WIDGET #define MAIN_WINDOW_WIDGET class main_window; #endif /**********************Classe per fer plots*****************************/ class PlotEQCurve : public PlotMM::Plot { public: PlotEQCurve(main_window *m_ptr, void (*f_ptr) (main_window *myptr, int b_ix, float g, float f)); virtual ~PlotEQCurve(); virtual void DrawPeakCurve(int band, double G, double F, double lQ, int Ftype); virtual void on_button_press(int a, int b, GdkEventButton* event); virtual void on_button_release(int a, int b, GdkEventButton* event); virtual void on_mouse_move(int a, int b, GdkEventMotion* event); virtual int CalcFg(double &f, double &g); virtual void Set_Bypass(bool bypass); protected: bool mouse_press; //flag pel mouse double f[NUM_POINTS]; void canvicoordenades(double &freq, double &gain); double y_vs_gain, x_vs_freq; //pendents pel canvi de coordenades int BandSet; //Vector de corbes double main_y[NUM_POINTS], band_y[NUM_OF_FILTERS][NUM_POINTS]; //Cada Banda del EQ //EQBandCtlPack **FrameBand; //Gdk::Color m_colors; Glib::RefPtr ZeroCurve; Glib::RefPtr freq_grid[26], gain_grid[6] ; //Glib::RefPtr peak_Curve; Glib::RefPtr peak_Point[NUM_OF_FILTERS]; Glib::RefPtr Master_Curve; //Funcions de calcul de corves void CalcBand_filter_off(int bd_ix); void CalcBand_lpf_order1(int bd_ix, double freq); void CalcBand_lpf_order2(int bd_ix, double freq, double Q); void CalcBand_lpf_order3(int bd_ix, double freq, double Q); void CalcBand_lpf_order4(int bd_ix, double freq, double Q); void CalcBand_hpf_order1(int bd_ix, double freq); void CalcBand_hpf_order2(int bd_ix, double freq, double Q); void CalcBand_hpf_order3(int bd_ix, double freq, double Q); void CalcBand_hpf_order4(int bd_ix, double freq, double Q); void CalcBand_low_shelv(int bd_ix, double gain, double freq, double Q); void CalcBand_high_shelv(int bd_ix, double gain, double freq, double Q); void CalcBand_peak(int bd_ix, double gain, double freq, double Q); void CalcBand_notch(int bd_ix, double freq, double Q); //Function ptr to main void (*external_ptr) (main_window *ptr, int b_ix, float g, float f); //punter a main_window main_window *main_win_ptr; }; /*****************************************************************************/ EQ10Q/logo_center.png0000644000175000017500000003375411302616753014565 0ustar sapistasapistaPNG  IHDR sRGBbKGD pHYs  tIME *"I IDATx}r#Yz]|MuWkv[(E66 =bB1.j.%Y A @»DxO&`MfDGɓΆ/n;Pw }g۝v3۾yZgZQd~g4mByһOO!IC><}N"[,/gnGG9ɸpcH,njTAE(f`Vkz"?W_:5d]H$i$}k_y߿b1n 4c1ZpvUie&y<Q!IvZA=vq ` v؍@So# r#AHߣшy^?$ ڶl<}4n>f'*LvRQQ*U4EG9Z"nSIoA|}}mn/_NQ. #z^.K@Wz<*8::޼yIχTp8Hp84D.\xjEX9 ,+mרf:?m6: %zԒQKK]llf'r?>_DT"ZQ.-eyd.QP(PT$(K͆4 V x|G'%L֝YEEk<[yYj?j2sDRΪ=OS Mґ~DYZ@f2BF3vʒ\j \fʲ<@Wr\.L&gVk6~]ZPY7u#ru:];\.ïtm3;.z.2+贀")?[9wS{ګS:vJt:6Z6z>DQB|8ly~lϞ=B4(H$D826t8BViHj kg4s2l̒cyycu\.|MJs(A?nPl2֑//+e5 AfE%mef4MN*ߍ j@SM4qTN֡=En p*@]ִ>4jW*@*7# qkwyYDZG<E8)pv$88Ë]a0౳92YpHDe{yz}BlRsyt=xxTWXl6.Ni\.kR Q8>7*.׃_¥%guc4%=F*`?ر .4cWZA)8n5>iQHbKtR1þfiÎ2ꟑ}ZC11j289U3R_GSqݺcLhj?̌;3tZFSi2gWUEcRFByj#&$I8=d2iUFqmR5x}}vǣcs?hw@3.Ad3>(IzhFU] &a,{{Gv{dROKEet:e>zVݿnytK&t:e<~jZGӬʿIC)d~9$Iz>7ď$I.qQb3\~Bz7{>YLoVF(e'+֓Y"kREԬ?Ӯ/#%؜ꌦց=3I׌ V&Y-SfjjZ3F+3u*=ӇOxSITA d2kj AV.*e{3R ++KX\S9z>#dP(\cwwLZuMM*[ss}/B BVnYUV977U:L7K$]t0PXy<{vn[ffEf (Q׃yd2r]. /"b{;Z66Vc/h:r:F<^zJ(,PǛDv"nokWVmJez}xlm#uѢ.pJB Pk89@2Ґ$ bWWZ{jW⢀:<7=ڐ3"~;?|>={ 6=疖eʤ={z@l00qPs홅oh5KhRSYb-M3~`M3kx(M(cmx@j_흦F@sZFt:+ih@4Ꚛy]AP3tVGPNVb5>}qcz=d2ist8l6 E CTnD# Pc!EQ+ch:wRxLP®ݻp8zh8WW%,, 0ΉD ~oLQrgF`#D`@އUeFƓvA@8~C*G$FCǍ( .|''m1!58::CG:@$Bl?0^,T>X,,OM>h]_RWǭV}9婻m {{Gcb80 psSC>EMX9j5 u_2{t -n7!}B kHt9btlH0R~(;FW28NVm"gF+7V*r3#&c0jd]F 5jOf];x(9yjbRF-Kdj\ÿrbf sHXNyIz MTH-d+>2fNJ&죙 rpOE ,Cz|^}Kj"AVC\\x&>~<›7/e>*dCxery~F `0).}ݎpxdT޽ I+\λ4>AU]t5N'+d+n*v:]kLd@NkYxLϔ;{4V 4~zɀ(8>cww pJp\x,u18n@{(zX]]V$ f{.[G?H&cex^hm8<*Fy 5mOGLLdv v;'ssaՃad~S+RŇȽ^AÃ[[[kϡIHVJh4Z_#_ ={4&kLw.vC} ^xC\\GiR:.^~.DX1YX! }>mGs1 }G懰TV2ZY$[Za} Iq(oQ,VWe Avvez-xAhnˑ>N}o U YDsx~j<Hx%<7?BDY˗l6d+l\Dqxd*o~logANn5/חHD *OqCxY^Jb6U-sCIfb1Ef|{Ip8p8c>N=A7 P2?/ +,F0hZ_;\lJ6 lDJ%#~9T$d>''8==/h x>Yd]O$ӧ,--w&޼yE}h^]] ~#"Fd]-5w=BAKbeޛLMSZDԂ(v67h=м?N' ~WpƏB4mP(O"~ButVA;GOT(+%%`'1}dKuE$iȸ-AwZIKm/1wΎ`5r]%|k`o~ډd@.ǦTM3z7$L6:HTq mx) 3v)^G6V)e,^ˋ8990[#̪$I(P\WŚp X^\)U;@s<٬:q9}ٴ35}wxdTVNOrA?Mb0G++ X]]W1t:u8<%:dNdޢ̺;M| $#j\&5'vu8 ~y_ɓm:#YP@s}će=JJGnQEMEf+dl^1 IV|>/AϳH5+?*}K`U,74L#A&u,6[UੁUJQ |O`|<@u<]Df|d{2 h>A}/Y>LqX0VR"#roEs{[fXln}bj)ߠ’S:rxz=c|D:%máHnvoog>5{+X5u6l:Oz$)2++c ZI>]GxL^jZA!ң$%>[8A`l,*1Fo=DghY !~3(vw7U:gb`Y89$`J_m 6JVk9%̜AfGV1D<_$oPtΖLjohZXIM=<+p#Nx3fW,+nw&e,[~Fu^ϪoC*I5RHU-EN I\N$pU*z<%ݎ/Ȃ?t s ϸY>aHN  ާO!Mq"v^O01q9~~w kZm  h]\]Y?BOk|4~o, X qUdLDU(}ߗEHnNt,9EӅ p8cZ`x<;Hۚ$&9sɻ,jV/(%yv0S3YT2-6 n&[eA|t(*pfMg2T_;sO%ߴrnw,4ٴ>F4i(}O4Vn%l 4Z\h*#$yilSK$| Y42's<(SsKݮDtdnG!N#J`a!MMHX6wBL'.E a7P(I 㿫\8?ϣP_4 3;gx|EU q>}?V."_`t888ym˗SAYb6 7 x7ڈ S>EÇ}D"ab~?F.H}vgv)CCd2GV0"\I^r70s(*\ssoZ.Îׯ_Ry2BW*#6fn.u= NNrO_cox^DP$vv6U =kFF鮠uqry0| jOH$ 3VckkBG6i-{R>\Nl:7y痰whuL X[[|JZaeelUZJV=+qpX__SPl7#X a{{ ]cLh<+p:fUדZE @ϡP  xb}}Y4Hno븼," IL+C+3ld:& h,_%-2|UMzo6b,,P3Qj^_#*HNծV"Je$f7Vi5i5&B"J7b p ǭRo|@ۅm >!RVɓmBYYvF N~v;A@9%XCXfjNɤ`IDATc\N 0FnFexK[.Zv.c$~$I?F,6齧XE4( 2?#24v fW 廻(T*^o rR%?q⃬?v˷c ttwx 66Vdl rE Zb\.'j}S',+ ˨īQC/XM @/tZlJ>ie7 0,tnZV*3ƏTڨ_YyEQvMy8KP~KV|nT*Ǐ4]GD|x 'y:L'~67k++ak++dRR5S%x%"Elr0lnû( |k2`f]K8>ڿog)]c]ĿD\5@,6G"=00.5Q775 Sk}}> cee0@L2P Ici)Cplt:17 ˢlͲP̍yd2IUS8ӧ;(*h4Z (*!aee2lRD-:ڈpݪ2ԨoJ@&iN=i }-c4+ 'V/=FF75jf<V,QlC\$`I7X__A&O?C<66d$HQd|؏mDFyYYߪV^4~A?ME[u])Jaqqx4-|t t wJ/Ъ<4h}x߇$ʒZ>l,$nPDS+8ȇ&e'MQC===m _?׬eZ縙`#FSOf壑|5z\.Wi*u,;VŎw=~ۿG,7u~3sVZIKCSf 5:XX5 u@󡁼R(rj>F3<(ʊ"7dKK*YA I1uɎO:( 8<<`ss0oTF-Mz?nTT#ZuZI܌Ʀa6)`F|6JDQBRV]_-#"e+ ڡvAo=N0++)?ӎ4^]Úƕi6*{UH$p:8:A$byyT\5hZc~> o( rQ #AhV?~$Ǜ8n'"b98H"KҨf!sp>$NNrXXR$X !dx| \.yTF@ن|ϟܴWW׸[lX,Z# awwTE@$Z;7p:x!iWZΪNj1PfL#|pi}Nt[YWjlB߇ߴ@CˇhV`Ji+3[YgIY=2poi?=nVxhIe+@UʂMڞֵh͵Tc|o^ZgzIŧٛZE1fN(榊L&c "Tn97YΒH]UG$z>Ux߽C-#boFV-u:D4!||߉ !6V5]͛p\5K0-Tu\]rr+4M|xIJ!rpJ_fիxܰsxKKpWҔh "p:#bguv}uLS(j[eT*V;+@z{gXUF23]bWYof--z4yj@HQ6WZJF/]F(^ =jМVssa*ۚfe`Q62H&+o͡Rbuu Q9%/od8f.Yd2.B$lceeABoWW%llҿu:]~#׌vCUObs89@<TDcF5'՞0Tvy01*CKV V2zaYWN6sMX>4r6p2mI}^9V`1K=#,~[(UioZJ6"͚'YjroiYX?MV0Ы2 dGlGi5) כ4P(b8bn.2TʞOZ$!YXDQf Mnw psSE0r@Z2nw|P,(!j#nh !@LJG}t-˷XXcsEpWbN1J΢T⢀[EM4(f+h $mjV5 RkbT m@S^KUaYdkESO6V$~;k &62OgYbidzNb:[gԍs#)/ ZZiiϾv{OAJxiZ v;:l6X0߭Vv |>/jшjlՆfC|'+q/ӹŢh:wIׇv{[EՁ9Ri`b01F#29b1{DBwcA" v\.24޽ 6pU=#|M#V3Y8A@W&,4g-H)Vz#dskڜEz08ԛ/vsT5looЈjjv`k+Oe0yfI6l6 htǸ.D"!#b}}~(V@#wyDsX]]W`E򻫫Kp~~b]NfRdV >nE!"Nr.N(8"ˣl!C:!6#_/?o36 +1j⤕eMldڜ2J=)Pc'o߾G,E6~蝓ʫ kkLjhc b }W⟩c";2op˾0s7 `6Y'IENDB`EQ10Q/README0000644000175000017500000000540311322566653012432 0ustar sapistasapistaEQ10Q LV2 Plugin ----------------- EQ10Q is an audio plugin over the LV2 standard (http://lv2plug.in) implementing a powerfull and flexible parametric equalizer, currently in development. The goal is to create an equalizer plugin that includes parametric equalization with diferent filter types like peaking, HPF, LPF, Shelving and Notch with IIR and FIR algorithms and a nice GUI displaying the equalization curve. At the moment we have implemented second order biquadratic filters (Peaking, Low Shelving, High Shelving and Notch), and configurable order (1, 2, 3, 4) HPF and LPF filters. All with IIR algorithms. And a GUI writed with Gtkmm (http://www.gtkmm.org) to control all the parameters and display the curve using plotmm (http://plotmm.sourceforge.net). The plugin is over LV2 standard and writed in C++ with lv2-C++-tools (http://ll-plugins.nongnu.org/hacking.html) provided by Lars Luthman. EQ10Q is hosted at http://eq10q.sourceforge.net/ Main developer: Pere Ràfols Soler (sapista2@gmail.com) Installation ------------ EQ10Q plugin will be installed into /usr/local/lib/lv2 acording the Makefile. Please don't change the installation prefix (INSTALL_DIR) in the Makefile, otherwise EQ10Q won't be able to load some of the GUI components. Before install EQ10Q you must resolve all of required libraries: - G++ compiler - pkg-config - Gtkmm >= 2.4 - PlotMM >= 0.1.2 (Debian doesn't include it, you must compile from source) - lv2-C++-tools (Most distributions doesn't include it, you must compile from source) - pstreams (Gentoo doesn't include it, you must get the header file from http://pstreams.sourceforge.net) To install EQ10Q in your system open a terminal, go to EQ10Q folder and just type: make If make finish successfully type the following as root make install To run EQ10Q you need a LV2 host. I recomend Ardour (<= 2.8.3) http://ardour.org Copyright --------- * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. EQ10Q/types.h0000644000175000017500000000311511322416300013044 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //Typedefs communs #ifndef BANDPARAMS_ID #define BANDPARAMS_ID typedef struct{ int type; float gain, freq, Q; }BandParams; #endifEQ10Q/main_window.hh0000644000175000017500000001340211322416277014400 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include //#include #include #include //#include #include #include "band_ctl.h" #include "bodeplot.h" #include "vuwidget.hpp" #include "templatewidget.h" #include "types.h" using namespace sigc; #define MAIN_WINDOW_WIDGET class main_window : public LV2::GUI >{ //LV2 STYLE //class main_window : public Gtk::Window { //Class per disseny de GUI en Kdevelop public: //main_window(); //Creacio GUI Kdevelop main_window(const std::string& URI); //LV2 Style virtual ~main_window(); void set_gain_freq(int b_ix, float g, float f); void set_all_params(int b_ix, int type, float g, float f, float Q); void get_all_params(int band_id, BandParams &m_params); void port_event(uint32_t port, uint32_t buffer_size, uint32_t format, const void* buffer) { float param; param=*static_cast(buffer); //std::cout<<"PORT = "< #include #include #include #include #include #include #include "constants.h" #define GAIN_TYPE 0 #define FREQ_TYPE 1 #define Q_TYPE 2 #define ACCELERATION 15 class EQButton; class CtlButton : public Gtk::Button{ public: CtlButton(int type, float *value, float *f, EQButton *m_eqbutton); virtual ~CtlButton(); void set_press(); void set_depress(); void set_button_number(float num); void set_freq_index(int index); virtual float get_freq_ptr(); protected: virtual void on_button_depressed(); virtual bool on_mouse_move(GdkEventMotion* event); virtual void set_value(int x, int y); private: bool press,x_direction, first_time; int act_val, ant_val, filter_type, ptr, acumula; float *mouse_value, *f_ptr; //ptr es l'index de la taula, el fet k sigui float es un trukillu pel calcul de l'acceleracio EQButton *eqbutton_ref_ptr; }; class EQButton : public Gtk::VBox{ public: EQButton(int type, float *f, sigc::slot m_slot, int *semafor); virtual ~EQButton(); virtual void set_value(float val); virtual float get_value(); virtual void set_freq_ptr(float index); virtual void hide_spin(); virtual void set_spin_number(); protected: Gtk::Alignment button_align; Gtk::SpinButton text_entry; CtlButton *ctlbutton; virtual bool on_button_double_clicked(GdkEventButton* event); virtual void on_enter_pressed(); virtual void on_spin_change(); //Funtion per sobreescriure en segons tipus de butto private: int filter_type; float value, *f_ptr; //punter a on guardem el valor int *stop; }; EQ10Q/logo_top_top.png0000644000175000017500000001665711302620676014773 0ustar sapistasapistaPNG  IHDRsRGBbKGD pHYs  tIME :6Ge/IDATx]kG}}'#yJ 6>"PDQ?U*-JT*U RR~ (@!mD$`P0{;Mqs5{x<ϝ=QG;39DQ(spn&Ea16:w}~N8mfz1uUWVq:^>]o}x]Guq_`{ue~/{s&W%>񡒯+3yc0_wϪ/[COA=t|otmm}[X{о&iy4m>H~wYOMg_>iMlct~Ϯ냊O˲Ή .Lu6Ϣ(.䇪ßL_>O}=U[Y[\@C'@8H@ .7l"6"$i5-:K>h6&0TR.𢶋U OlntcėAB$l&CA/p2)}B,؞oB{&2U5?vXHmWunu!z Zip Qm'Z]n2׹W˄[m Y1jʇNEQt~+W?<ύsuhm|8ƕi ?:v(+r$u¤@QݮZ`k PI IE$] Ig{)NHoЩdɋ[llǠEBo"M mAoFR;F]C0T|>$y,(T&BJeB9w~HYTm7nJ6(O\Ec<~eو641("M&|ί.tΣڋKaQ˕k~YFzǺm#"݄rEE }b_Z4kO]_Paבzw:c/7?cFDoUk%sÿpȀODSԄ^G;EgBě3DaKu6Uo1XAM[A!n+eTy} &%L&thbP!m {b4>o m޿.8ǏXR!~'"Tkm)7>_\f7EQS8u6oތ r_W9[;88`]p P~/G$8{nݺϣ+&9._Vʬ8aT:4d^pąLJrm6.6.9R7'$x Ԕ1 (:˭Wk nL#xi+L)D!m;c(}&巭%{Lm*y|CUBVC(zh| MI'{B=H6b/2ڒmFN!-E M-t5Iɓ &drx"{]cCt~c|D7ߡ!:*ʗ]}/G ,C!Ep.|䟃;E0\p.^V唁3o~vƍn= UOEEnˑuQL> #R>&E{HAFl1 -[D2">Po}[^Ba]OSY\$M "W'CEz=c9ֶ;]t H` u]o>2js:o{BWݳke4=[56lM\|\W˲̹/md]Q/"sO?msv>?uq-fٳgE𥷝K?"99Xy<[oq(qӾ}xq]wz߮pY\sU\7Vnτ Pt-]VQFH eJׂ OhMB=M79xۢ~l!cm{0}IXtSE]h˻ʟ&UGSE0t=(mPA<,.kcJ:SGwM@MDŽ.E}uАbSϪUWC+AlЪϵ߸8 >&''9Tn.<2ocq G? uGǎϟ_F^~^yW>jDC@= g1+4"+cl% :7c N$pQݻ{uC\tG6C.wSSSVǗpI5Uᵲmp PHP  4ƊOa*ֶkmQJk$qKj):lEf0ըp![ʁJ(m2HR)>z]{MChH|)$Um2>}弭-bʈ(u,Q'[ʡmZ]QJ[N~˿ r8ְwJJ~hM '.g*&mI?4Mԏ] tsWkw]lߋK')þ~'G֮V6h祥%qpMT}E}&%δBmp\4h:oR^]-)BTp\ jY7mgz6. y\H٥ƀ꺮gwյ}26ߡ6g&mKe5c]DXGeqMAV8}`ŧ B=nvkxa_>M,mu&ty}9HB7WwyPy]k+l*L5^a2D`! l*m0ї1 8G vU?pDQ'N`#Ȳt+6sl߶n<YCEq9+3"gk!#kζZ#Fh6 (ZtD<Ԁ3UeB#k{Bʓ~yyYI`\se oQCϕ^f %u}yXH^Lj_i5^[mm5HL=KV U *TwⶒkrKrQl̵UoKWx;I}5 ¤__$tSu72RM j~ 6B#HB cN_.˺uP4_ iQesyKnepCU/> Z>׸jH $q0p?I(r!2t]lw:1,p8,0IpͶCf9T/`0y7\QDp9?:r̀ؾmش ַJQExx.*Ԃƶ$Q۶}k"LPCcRT…ZCF__NgD$drC|r]BꚤTAM[ɂ~!!Ng 5_H[l|ڊ[ƿ.eDRUAf oRʇ7)!\ƟkJM~ڧ: ?k U?ؾ8ywրq{y[4=CK׿6-rŠh"56l)M\;F$_-m3눾ʑa*TQf:Um+yƕ#),C^i<ϫ9P2`& ! /m[Q0 0cyiR@Xf7n,U8qu˸m{ٱ$6|u8Ch5](|6 ՏBo#'PٶO3oHQ6 M n"ѐ]ǽK@C Kv?r:^/ g&ii"/r0 g! ?8 ʱy[XڵkGW_/8pXyXQ` gfSS(؊SCɓ{4_pw8w< 릧5gTѼP&<^_^ö`BM nZXdƥ*ۖAmtET4`5ᵅ|x\5y>duo>!0yCRljGg):jyBc$'UEdDOfKSR+@mYW_hCl516YDyZƧ)BWwBWB  =N@(9ZfM+߅зV{:@7>] sɽhMm*'B.u:.GڶD&ۊ%a`ȲEQ ISy1>/"00&T!+ݷ#g 98v(b_0E,Ͱ}vLLN&<xKK(y21<ѭ:hѢKY VFM>ww9Rq_jB ֪]*|ƝN7ܥ' j{~]pdRkjA"t~jG'\A~쳮xOgΜů^sx/ĉxۦMƛw:gЏůgg1=95|Flj<p9c-!Iy$[`+mk?p<ùsgǟ9FdY_|ǎT$ME_?@ @  '!cL爪"{N^1;gΞ|U/%2Ft=_X@QvyNLLNb7<& v؁{>9|/??햞ppyc4@ @ .+|M`yY'>"` 祗=BUxg7n:0V`jr;w>];wa,'eN|'Nn C[pcLL @ |A/_W_ 8Ξ="˭ug1==8P;]ylZ CDpŕWQѽós`D @ @b`2tw]ad0D܉j{=pfq_`uQ+ >5k1 (2~Cع:я#rXWE˽o85%#FD @ p}pp%y ߸y3>/`ii.6qqqϯgoLM?Y,/COqϧޞ|TTdi D( ?@ @ /}EUĭϏ3T 'Oǎa(*o|?1p!x& _9W$04>DQ4Bh@ @ .CƏ UĿ(},"GȲy#s q7ܹs;@&en9ȳ엿gX#y @ pax"?p88Ȳ (*"^e>/( aV=Q~^/+t)@ @ 4㯲8*q_!"DE/HJ  Ϫ/1:_q{P7@ rctG,{bjQ副__WUw +qՋC_/zG!e:AXq^ \>^IENDB`EQ10Q/Makefile0000644000175000017500000000204711312154010013166 0ustar sapistasapistaBUNDLE = paramEQ-Rafols.lv2 INSTALL_DIR = /usr/local/lib/lv2 $(BUNDLE): manifest.ttl parameq.ttl paramEQ.so parameq_gui.so logo_top_top.png logo_top.png logo_center.png logo_bottom.png logo_bottom_bottom.png EQ-10Q_bakc.png combopix rm -rf $(BUNDLE) mkdir $(BUNDLE) cp manifest.ttl parameq.ttl paramEQ.so parameq_gui.so logo_top_top.png logo_top.png logo_center.png logo_bottom.png logo_bottom_bottom.png EQ-10Q_bakc.png $(BUNDLE) cp -R combopix $(BUNDLE) paramEQ.so: plugin.cpp g++ -O3 -shared -fPIC -DPIC plugin.cpp `pkg-config --cflags --libs lv2-plugin` -o paramEQ.so parameq_gui.so: main_window.cpp band_ctl.cpp ctlbutton.cpp bodeplot.cpp vuwidget.cpp templatewidget.cpp pixmapcombo.cpp g++ -O3 -shared -fPIC -DPIC bodeplot.cpp templatewidget.cpp vuwidget.cpp pixmapcombo.cpp ctlbutton.cpp band_ctl.cpp main_window.cpp `pkg-config --cflags --libs lv2-gui plotmm` -o parameq_gui.so install: $(BUNDLE) mkdir -p $(INSTALL_DIR) rm -rf $(INSTALL_DIR)/$(BUNDLE) cp -R $(BUNDLE) $(INSTALL_DIR) clean: rm -rf $(BUNDLE) paramEQ.so parameq_gui.so EQ10Q/bodeplot.cpp0000644000175000017500000004202411322416300014045 0ustar sapistasapista/*************************************************************************** * Copyright (C) 2009 by Pere Ràfols Soler * * sapista2@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "bodeplot.h" ///////////////////////////////Membres de PlotEQCurve//////////////////// /************************Constructor*************************************/ PlotEQCurve::PlotEQCurve(main_window *m_ptr, void (*f_ptr) (main_window *myptr, int b_ix, float g, float f)) { //preparem el punter a taula de punters //FrameBand = new EQBandCtlPack *FrameBand[NUM_PEAK_BANDS]; external_ptr = f_ptr; //Inicialitza punter a objecte principal main_win_ptr = m_ptr; set_size_request(PLOT_WIDTH+45,PLOT_HEIGHT+57); //No tocar aquest limits de pixels, son els marges scale(PlotMM::AXIS_LEFT)->set_enabled(true); scale(PlotMM::AXIS_RIGHT)->set_enabled(false); scale(PlotMM::AXIS_BOTTOM)->set_enabled(true); scale(PlotMM::AXIS_TOP)->set_enabled(false); scale(PlotMM::AXIS_BOTTOM)->set_autoscale(false); scale(PlotMM::AXIS_LEFT)->set_autoscale(false); scale(PlotMM::AXIS_BOTTOM)->set_range(FREQ_MIN,FREQ_MAX, true); scale(PlotMM::AXIS_LEFT)->set_range(GAIN_MIN,GAIN_MAX, false); label(PlotMM::AXIS_BOTTOM)->set_text("Fequency (Hz)"); label(PlotMM::AXIS_LEFT)->set_text("Gain (dB)"); label(PlotMM::AXIS_BOTTOM)->set_enabled(true); label(PlotMM::AXIS_LEFT)->set_enabled(true); /* set a plot title and some axis labels */ title()->set_text("Eq Curve"); title()->set_enabled(true); /* create some named curves with different colors and symbols */ ZeroCurve= Glib::RefPtr(new PlotMM::Curve("c0")); ZeroCurve->paint()->set_pen_color(Gdk::Color("white")); //Dibuixem una graella a base de plots a lo bestia int ii=30, jj=0; double ff[2], yy[2]; while(ii <= 10000){ ff[0]=ii; ff[1]=ii; yy[0]=GAIN_MIN; yy[1]=GAIN_MAX; freq_grid[jj]= Glib::RefPtr(new PlotMM::Curve("f_grid")); freq_grid[jj]->paint()->set_pen_color(Gdk::Color("gray50")); freq_grid[jj]->set_data(ff,yy,2); add_curve(freq_grid[jj]); if(ii<100) ii=ii+10; else if(ii >=100 && ii<1000) ii=ii+100; else if(ii >= 1000) ii=ii+1000; jj++; } ii=-15, jj=0; ff[2], yy[2]; while(jj < 6){ ff[0]=FREQ_MIN; ff[1]=FREQ_MAX; yy[0]=ii; yy[1]=ii; gain_grid[jj]= Glib::RefPtr(new PlotMM::Curve("g_grid")); gain_grid[jj]->paint()->set_pen_color(Gdk::Color("gray50")); gain_grid[jj]->set_data(ff,yy,2); add_curve(gain_grid[jj]); ii=ii+5; if(ii==0)ii=5; jj++; } //dades de inizialitzacio double d1=log10(FREQ_MIN); double d2=log10(FREQ_MAX); for(int i=0;i(new PlotMM::Curve("peak_point")); //el punt //preparem el punt peak_Point[i]->symbol()->set_style(PlotMM::SYMBOL_ELLIPSE); //posa un simbol a cada punt peak_Point[i]->symbol()->set_size(8); //mida dels simbols a 10 peak_Point[i]->set_curve_style(PlotMM::CURVE_NONE); //no dibuixis la corva, nomes simbols peak_Point[i]->symbol()->paint()->set_pen_color(Gdk::Color("white")); } //colors dels simbols //mirar fitxer /etc/X11/rgb.txt per veure colors possibles peak_Point[0]->symbol()->paint()->set_brush_color(Gdk::Color("brown")); peak_Point[1]->symbol()->paint()->set_brush_color(Gdk::Color("yellow")); peak_Point[2]->symbol()->paint()->set_brush_color(Gdk::Color("orange")); peak_Point[3]->symbol()->paint()->set_brush_color(Gdk::Color("salmon3")); peak_Point[4]->symbol()->paint()->set_brush_color(Gdk::Color("magenta1")); peak_Point[5]->symbol()->paint()->set_brush_color(Gdk::Color("red")); peak_Point[6]->symbol()->paint()->set_brush_color(Gdk::Color("purple2")); peak_Point[7]->symbol()->paint()->set_brush_color(Gdk::Color("blue")); peak_Point[8]->symbol()->paint()->set_brush_color(Gdk::Color("LightBlue2")); peak_Point[9]->symbol()->paint()->set_brush_color(Gdk::Color("green")); //Construim la corba principal, suma de les altres //m_colors.set_rgb_p(0.7,0.1,0.9); Master_Curve= Glib::RefPtr(new PlotMM::Curve("master_curve")); //la corba Master_Curve->paint()->set_brush_color(Gdk::Color("royal blue")); Master_Curve->paint()->set_pen_color(Gdk::Color("royal blue")); add_curve(Master_Curve); Master_Curve->set_data(f,main_y,NUM_POINTS); Master_Curve->set_baseline(0.0); //Constrium corva del zero double f[2]={FREQ_MIN,FREQ_MAX}, y[2]={0,0}; ZeroCurve->set_data(f,y,2); //dibuixem la corva de eix ZERO add_curve(ZeroCurve); for(int i=0; iPLOT_WIDTH)f=PLOT_WIDTH; if(f<0.0)f=0.0; if(g>PLOT_HEIGHT)g=PLOT_HEIGHT; if(g<0.0)g=0.0; canvicoordenades(f, g); for(int i=NUM_OF_FILTERS-1; i>=0; i--){ if( (f > peak_Point[i]->x(0)*0.85 && f< peak_Point[i]->x(0)*1.15) && //avans 0.95 i 1.05 (g > peak_Point[i]->y(0)-0.9 && g< peak_Point[i]->y(0)+0.9)){ //avans 0.7 i 0.7 return i; } } return -1; } /**********************Handler button press***********************************/ void PlotEQCurve::on_button_press(int freq, int gain, GdkEventButton* event){ double f, g; f=(double)freq; g=(double)gain; BandSet=CalcFg(f,g); if(BandSet>=0) mouse_press=true; } /******************************************************************************** /**********************Handler mouse motion***********************************/ void PlotEQCurve::on_mouse_move(int freq, int gain, GdkEventMotion* event){ if(mouse_press) { double f, g; f=(double)freq; g=(double)gain; CalcFg(f,g); //main_p->set_gain_freq(BandSet, (float)g, (float) f); //FrameBand[BandSet]->set_band_param(g, f); external_ptr(main_win_ptr, BandSet, (float) g, (float) f); /////////////////////////////////////////////////////////////////////////////<<<<<<<<<<<<<<<<<<<<<<< ////////////////////////////////// //AKI ES ON ENVIEM LES NOVES DADES A CARREGAR EN EL FILTRE CORRESPONENT } } /******************************************************************************** /******************Handler Button Releas*******************************/ void PlotEQCurve::on_button_release(int freq, int gain, GdkEventButton* event){ mouse_press=false; } /***********************************************************************/ void PlotEQCurve::canvicoordenades(double &freq, double &gain){ gain=GAIN_MAX-y_vs_gain*gain; freq=pow(10,log10((double)FREQ_MIN)+x_vs_freq*freq); } /************************Funcio dibuix de bode**********************/ void PlotEQCurve::DrawPeakCurve(int band, double G, double F, double lQ, int Ftype){ double gain, freq, Q; int Band_ID, Filter_type; Band_ID=band; gain=G; freq=F; Q=lQ; Filter_type=Ftype; //Comprovar /* std::cout<<"\nPlotEQCurve::DrawPeakCurve"<paint()->set_pen_color(Gdk::Color("gray50")); } else { Master_Curve->paint()->set_brush_color(Gdk::Color("royal blue")); Master_Curve->paint()->set_pen_color(Gdk::Color("royal blue")); } replot(); }EQ10Q/logo_bottom_bottom.png0000644000175000017500000000732711307463721016172 0ustar sapistasapistaPNG  IHDR}sRGBbKGD pHYs  tIME 29AJWIDATx]rTMw6 ??0o@:yrJ$&ZUTm˲on                                AAA_#   ?ׯ_|/9nN?Ow3wYi6%.)5=wDssy]~5}_9!iό?czm|^__C_א$$qc}qt',gǞ Z$ߞmOkg?va{hg=yo}z~;<,Y9~zWv@䗤kVgzn GW Nz^7ooo7{G-}_-YO|F?l%F˳ղ:*Ϭw}v?s>zǧOZChHhA1g FKU3 ~>wu7o rI@94#sC!uƬ1x eZc{}}}W Ai92}=$%)"Jqw=#puCiׁd4Y; ϻ9pAdKf#)Բ;3sa]x >ʁUx6cu Y4>rhXlӢnrPdo4G!?㍻P~!bfE@)dq yH!F.ϊQ'zΊpʟ]{vXg|WFDhL?>o#3H2mV>YGAE&pf^N@J? ǂAԅ/z Ouz|"Lʐo^0%o_|Jл;Q1V/gqܜ?Cj'ƌ3!+,[g ޑgX do\Rèrw -u.$Ȱ˾_(ПN=:Q~QkE0X՝_7ڿY:2#JG+/kEDBK<'DAXTjN]HE_W/ǒ^ID'+#3zVV߅nD6$VaVj}'i{ߌAt Fs8fO|*#ό=?k/ákw[.G"Cp/RZUZ;H ic 9l4Ev$G Am/K^iaׯ_%T#gT#<%©(ANGWf@uS2sC+*K};5ߑ=g團1QF xyo*ddp5`9b-}JzEow2aʊh,@Z]F=ۡ/v3dg#=EY]Ww}n~ָgnxCʔ݊ݍl2s{4r8HzG7BiԴrng~)<*%?Z?0oY%)S'[*7{ if2*bju3xnӑjV\*(Ii~乬Z VCu"Fּ5(gb%E#5G\JpFQE ߎjSz|tdpi<`F͏HD>r|Gindґ?[deer8f2c2n?cGFJ! w#-03xv}+3DfIs\9Z%gTtso9xHgzCZgƢt-J_AEPS54Fİ^J6CdeSG<2VQu7は8V(Ք~?/*s~ٻ֦b[_)yɠ\2p[{Q=_MʟQ]"سn5vgt>d3hf#hM5^ E!Gg2кMӝWGײzBMg/rjZÏ^ޮP=ZȾع݀e?vX{ngīF y #]0'oͨ${y ֘#E J GU-{ѪF#=>> ϟ?zD trej#)EM7a]4>iF5]E tY/eЧҴ/Yc52)kV)yӴowp!h{#uv^Aߝ5>s-vCzFmҏQ Z>3%(QqH?ƪCq/#jR#Z)ֆ5*(ȑ²ڃi];y[Qr`]{65H5?6-{Oc, ˨Dpϋ!!2:l\ԴPw{k'2kkdž|dW21~,t-s)Wٿ%SRp5v(}@ls~wOTw߃]1fweYJԃ&P#6~4K߮Ɣ/<ٍzpto=2qKu"^Ab};[u#Rj 2M:xg UM(hIa*zLm>3H! rPkz#m|Z{kα ou֞=[@ȥהP U4`pxgG&JOWV*) g c.WZw#91Ƞ\k݃]U [llơѕ3M* 7[r*ߕUC Hܪk=9u2=5S)*D`ǨoXZ5}L^;>;ϪޭyP{+5]ZOjsΤ,G]QJ0F _oWC)I M5 yw!a(._teO4f&+";r5 FlTX1"h=:k]'73( vv}P.VvF+c͌o7e-,wNW3\j-ؽ+@ُ#g׊>H]YRX<>?[* '/G;Xt?l\IENDB`EQ10Q/logo_bottom.png0000644000175000017500000001212111307463763014600 0ustar sapistasapistaPNG  IHDR\sRGBbKGD pHYs  tIME 3\gfIDATx]K];s2X$C%6doA ,L$-HDB 6aCVA #$"aduF5 Q}53ӧU_=zG\ZP(|~kk[bhٴfsw;g 6hACmKq<7G?;;SoYSOΗeY.~~~'>iۻ?=={{{\_Em?KmR|>ϧO7mTPg_=uΟeY.֩dhtr,K;99m~믵^O'''pzz*'vv>_7yݽK_駟{^m7w~{O ZkoRr6o2 •wfDh1h5hC[n#&P =j?ªR%v݌e6+)# KG'?=Q%m#,Ծ=\zz7J??m ;>>64|I T`4!AT~in~1K=Ȓ?˻ ~dPM_+kkFބhfboo4G>?d'GFH?99iGgnGGﶧm񅱿ν9"IJxۋ/ 5CS{t D\?Oo%V7n efv~sUjzNx> #$a",V–^O۬ >Cz 320>F^Gh:fȿEE*of믿m}}ls={ݺuд GqH|7|yDǨ^(e/di BoM7M(=z^w4q<:fH,CD6irh^Q!t{ &DC{>Ɂ,z=< B}o>jFDhG<+oS0r!<#TizGgHsr}9Z ==3`Bq+{:"=S+e^[#1~mlmd֊h&Z̼MO-jcǡA=ߴwqH/ao[4X oHyZHhc_RǨhEҞ0*|BEYVb+א* ( L$9hB +;<<4eWDS 8a=A RV\3= WӣZg(D;A[-rR9>R0pn)˲\+S>zQ%GGvH**>j P*Q>#rx3g+Ĝ\vac9t}6p]~ZAlDDA 5޳F_9bg}豰kSW>4>ׁp)U;~w;7CSV*ROo\Vt *(#A}~h6(Q$G/a#7nRzGP(R>Ϯ?D K_^^u$ݽ)>~(?XݮlD 7t)eϩ*$ Fh0ݻss(<u Z"L$=<*!x=T1⛑W!1GÌ`JyB/ꫯ,j '(Z4>-K*4GU0!Fs9 R[PlH*(sLA1C#?[/3~ƍ0ΡsOku!aQS>f7<^(>2=w}fϏ!#Ver